网络编程之网络丢包故障如何定位?如何解决?( 六 )

MTU丢包

网络编程之网络丢包故障如何定位?如何解决?

文章插图
 
查看:
1.检查接口MTU配置,ifconfig eth1/eth0,默认是1500;
2.进行MTU探测,然后设置接口对应的MTU值;
解决方案:
1. 根据实际情况,设置正确MTU值;
2. 设置合理的tcp mss,启用TCP MTU Probe:
cat /proc/sys/net/ipv4/tcp_mtu_probing:tcp_mtu_probing - INTEGER Controls TCP Packetization-Layer Path MTU Discovery.Takes three values:0 - Disabled 1 - Disabled by default, enabled when an ICMP black hole detected2 - Always enabled, use initial MSS of tcp_base_mss.tcp层丢包TIME_WAIT过多丢包
大量TIMEWAIT出现,并且需要解决的场景,在高并发短连接的TCP服务器上,当服务器处理完请求后立刻按照主动正常关闭连接 。。。这个场景下,会出现大量socket处于TIMEWAIT状态 。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上;
查看:
查看系统log :
dmsgTCP: time wait bucket table overflow;查看系统配置:
sysctl -a|grep tcp_max_tw_bucketsnet.ipv4.tcp_max_tw_buckets = 16384解决方案:
1. tw_reuse,tw_recycle 必须在客户端和服务端timestamps 开启时才管用(默认打开)
2. tw_reuse 只对客户端起作用,开启后客户端在1s内回收;
3. tw_recycle对客户端和服务器同时起作用,开启后在3.5*RTO 内回收,RTO 200ms~ 120s具体时间视网络状况 。内网状况比tw_reuse稍快,公网尤其移动网络大多要比tw_reuse 慢,优点就是能够回收服务端的TIME_WAIT数量;
在服务端,如果网络路径会经过NAT节点,不要启用net.ipv4.tcp_tw_recycle,会导致时间戳混乱,引起其他丢包问题;
4. 调整tcp_max_tw_buckets大小,如果内存足够:
sysctl -w net.ipv4.tcp_max_tw_buckets=163840;时间戳异常丢包
当多个客户端处于同一个NAT环境时,同时访问服务器,不同客户端的时间可能不一致,此时服务端接收到同一个NAT发送的请求,就会出现时间戳错乱的现象,于是后面的数据包就被丢弃了,具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK 。在服务器借助下面的命令可以来确认数据包是否有不断被丢弃的现象 。
检查:
netstat -s | grep rejects解决方案:
如果网络路径会经过NAT节点,不要启用net.ipv4.tcp_tw_recycle;
TCP队列问题导致丢包
原理:
tcp状态机(三次握手)
网络编程之网络丢包故障如何定位?如何解决?

文章插图
 
协议处理:
网络编程之网络丢包故障如何定位?如何解决?

文章插图
 
一个是半连接队列(syn queue):
在三次握手协议中,服务器维护一个半连接队列,该队列为每个客户端的SYN包开设一个条目(服务端在接收到SYN包的时候,就已经创建了request_sock结构,存储在半连接队列中),该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包(会进行第二次握手发送SYN+ACK的包加以确认) 。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态 。该队列为SYN队列,长度为max(64,
/proc/sys/net/ipv4/tcp_max_syn_backlog), 机器的tcp_max_syn_backlog值在/proc/sys/net/ipv4/tcp_max_syn_backlog下配置;
一个是全连接队列(accept queue):
第三次握手时,当server接收到ACK 报之后, 会进入一个新的叫 accept 的队列,该队列的长度为 min(backlog, somaxconn),默认情况下,somaxconn 的值为 128,表示最多有 129 的 ESTAB 的连接等待 accept(),而 backlog 的值则应该是由 int listen(int sockfd, int backlog) 中的第二个参数指定,listen 里面的 backlog 可以有我们的应用程序去定义的;
查看:
连接建立失败,syn丢包:
netstat -s |grep -i listenSYNs to LISTEN sockets dropped也会受到连接满丢包影响
解决方案: 增加大小 tcp_max_syn_backlog
连接满丢包
-xxx times the listen queue of a socket overflowed
查看: