tcp丢包的排查

丢包的排查:

     参考资料:1https://blog.csdn.net/maimang1001/article/details/121786580

              2https://blog.csdn.net/m0_67645544/article/details/124574099

1、 网卡丢包

a)   ifconfig

 

b)   查看网卡丢包统计(虚拟机看不到网卡信息)ethtool –S eth0

  

网卡(NIC)读取到数据帧后,写入网卡内部的数据缓冲区(Ring Buffer),再生成中断,触发内核从Ring Buffer中读取数据,如果该数据缓冲区不够用,新来的包就会被丢弃,上述两图中就会有显示。

 

查看eth0网卡Ring Buffer最大值和当前设置

              ethtool –g eth0

修改Ring Buffer大小

              ethtool –G eth0 rx 4096 tx 4096

2、 netdev_max_backlog溢出

netdev_max_backlog 是内核从NIC(网卡)收到包后,交由协议栈处理之前的缓冲队列。每个CPU核都有一个backlog队列,当这个队列不够用溢出时,数据包将被丢弃。

cat /proc/net/softnet_stat 查看是否发生了netdev_max_backlog溢出,其中:    每一行代表每一个CPU核的状态统计,

第一列代表中断处理程序收到的包总数,

第二列即代表由于 netdev_max_backlog 队列溢出而被丢弃的包总数

netdev_max_backlog 的默认值是 1000,修改大小方法为:

/etc/sysctl.conf里加上net.core.netdev_max_backlog=2000

再执行sysctl –p

3、 路由丢包

netsata –s|grep route 查看路由丢包

ip r 命令查看ip对应路由表

rp_filter反向路由过滤丢包:反向路由过滤机制是Linux通过反向路由查询,检查收到的数据包源IP是否可路由(Loose mode)、是否最佳路由(Strict mode),如果没有通过验证,则丢弃数据包,设计的目的是防范IP地址欺骗攻击。

rp_filter 提供三种模式供配置:

              0 - 不验证

              1 - RFC3704定义的严格模式:对每个收到的数据包,查询反向路由,如果数据包入口和反向路由出口不一致,则不通过

              2 - RFC3704定义的松散模式:对每个收到的数据包,查询反向路由,如果任何接口都不可达,则不通过

可通过修改/proc/sys/net/ipv4/conf/eth0/rp_filter值配置此项

4、 防火墙拦截

检查是否是防火墙引起的丢包, 可以停掉iptables和firewalld, 查看命令systemctl status iptables.service / systemctl status firewalld.service

停止命令 systemctl stop iptables.service / systemctl stop firewalld.service

5、连接跟踪表溢出

kernel 用 ip_conntrack 模块来记录 iptables 网络包的状态,并把每条记录保存到 table 里(这个 table 在内存里,可以通过 /proc/net/ip_conntrack 查看当前已经记录的总数),如果网络状况繁忙,比如高连接,高并发连接等会导致逐步占用这个 table 可用空间,一般这个 table 很大不容易占满并且可以自己清理,table 的记录会一直呆在 table 里占用空间直到源 IP 发一个 RST 包,但是如果出现被攻击、错误的网络配置、有问题的路由/路由器、有问题的网卡等情况的时候,就会导致源 IP 发的这个 RST 包收不到,这样就积累在 table 里,越积累越多直到占满。无论,哪种情况导致table变满,满了以后就会丢包,出现外部无法连接服务器的情况。内核会报如下错误信息:kernel: ip_conntrack: table full, dropping packet;

查看当前连接跟踪数 :

cat /proc/sys/net/netfilter/nf_conntrack_max

修改如下值:

net.netfilter.nf_conntrack_max = 262144 #可以增大跟踪的条数

net.netfilter.nf_conntrack_tcp_timeout_established = 432000 #减小跟踪有效时间

6、 tcp连接跟踪安全检查

丢包原因:由于连接没有断开,但服务端或者client之前出现过发包异常等情况(报文没有经过连接跟踪模块更新窗口计数),没有更新合法的 window 范围,导致后续报文安全检查被丢包;协议栈用 nf_conntrack_tcp_be_liberal 来控制这个选项,默认是1-不开启:

  • 1:关闭,只有不在tcp窗口内的rst包被标志为无效;
  • 0:开启; 所有不在tcp窗口中的包都被标志为无效;

7、 系统网络内存不足

系统内存不足,创建新分片队列失败,netstat -s |grep reassembles查看是否丢包

增大系统网络内存修改项:

net.core.rmem_default

net.core.rmem_max

net.core.wmem_default

8、 TIME_WAIT过多

服务端在高并发的情况, 主动关闭连接, 会出现大量的socket处于timewait状态,timewait数目超过tcp_max_tw_buckets(默认是65536)值后,新来的连接直接进入close状态。

解决方法:

a、tw_reuse,tw_recycle 必须在客户端和服务端 timestamps 开启时才管用(默认打开)

    b、tw_reuse 只对客户端起作用,开启后客户端在1s内回收;

c、tw_recycle 对客户端和服务器同时起作用,开启后在 3.5*RTO 内回收,RTO 200ms~ 120s具体时间视网络状况。内网状况比 tw_reuse 稍快,公网尤其移动网络大多要比 tw_reuse 慢,优点就是能够回收服务端的 TIME_WAIT 数量;在服务端,如果网络路径会经过NAT节点,不要启用 net.ipv4.tcp_tw_recycle,会导致时间戳混乱,引起其他丢包问题;

d、调整 tcp_max_tw_buckets 大小

9、时间戳异常

    服务端开启快速回收机制后, net.ipv4.tcp_tw_recycle为1(前提tcp_timestamps为1),NAT环境里的多个客户端连接服务端时, 因为时间戳校验导致会导致SYN包被丢弃。通过命令netstat –s|grep rejects查看确认丢包。

    tcp_timestamps开启后,linux内核会开启 PAWS 机制。PAWS是为了防止TCP序列号绕回,会维护最近一次收到数据包的时间戳(Recent TSval),如果接下来的数据包时间戳小于这个,即不是递增的时间戳,就会直接丢弃这个数据包。这种情况下是用「IP + 端口」四元组区分连接。

    而开启timewait快速回收后,PAWS检查是针对IP做区分,这样同一个NAT环境里的不同客户端连接都会被检查同一时间戳

10tcp全连接队列长度不够

    tcp连接,linux内核维护一个半队列和一个全连接队列,

半连接队列中存放等待完成3次握手的连接,这些连接的状态为Syn_RECV ,该队列长度为max(64,/proc/sys/net/ipv4/tcp_max_syn_backlog)

全连接队列存放完成3次握手等待accpet的连接,此时的状态已经是ESTABLISHED,这个队列的长度min(backlog, somaxconn),backlog 的值则应该是由 int listen(int sockfd, int backlog) 中的第二个参数指定,somaxconn由net.core.somaxconn决定

可以通过命令netstat –s|grep listen 查看是否丢包

写文章-CSDN创作中心

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: TCP通信在局域网环境下丢包可能有以下几个原因: 1. 网络拥塞:如果局域网中的网络流量过大,可能导致数据包丢失。可以通过增加网络带宽或者优化网络拓扑结构来缓解拥塞问题。 2. 网络延迟:如果数据包在传输时遇到网络延迟,可能导致数据包丢失。可以优化网络设备的配置来缩短网络延迟。 3. 硬件问题:局域网中的网络设备(如交换机、路由器等)可能存在硬件问题,导致数据包丢失。可以检查设备是否正常工作,或者更换设备。 4. 程序问题:程序本身可能存在漏洞或者逻辑错误,导致数据包丢失。可以通过检查程序代码来排查问题。 针对丢包问题,可以通过以下方式进行优化: 1. 使用可靠的传输协议:TCP是一种可靠的传输协议,可以保证数据传输的可靠性和完整性。可以通过使用TCP协议来避免丢包问题。 2. 增加重传机制:在通信过程中,可以增加重传机制,当发现数据包丢失时,及时重传数据包,保证数据的完整性。 3. 优化程序设计:在程序设计过程中,可以考虑数据包大小、发送频率等因素,避免数据包丢失。同时,可以增加数据校验机制,保证数据的完整性。 ### 回答2: Qt是一个跨平台的应用程序开发框架,其中包含了TCP通信的功能,可以用于在局域网内进行数据传输。丢包问题是指在通信过程中,部分数据包无法正常传输到目标主机的现象。 局域网丢包问题的解决可以从以下几个方面来考虑: 1. 检查网络环境:首先,需要检查局域网的网络环境是否稳定。可能是由于网络延迟、带宽限制或者网络拥堵等原因导致数据包丢失。可以尝试进行网络优化,例如调整网络带宽、增加网络缓冲区大小等方式来改善网络环境。 2. 优化代码逻辑:在进行TCP通信时,需要合理地编写代码逻辑,确保数据包的稳定传输。可以通过添加重传机制、数据校验等方式来提高通信的可靠性。同时,也要合理地设置缓冲区大小,防止数据包溢出或者缓存积压导致丢包。 3. 异常处理机制:考虑到网络通信的不确定性,需要在代码中添加异常处理机制,及时捕获并处理异常情况,避免程序崩溃或者数据丢失。可以使用Qt提供的信号槽机制来实现异常处理,例如捕获网络错误信号并进行相应处理。 4. 数据分包处理:如果遇到较大的数据传输,可以将数据分包发送,以减少数据包的丢失概率。可以将大块数据按照固定大小进行切割,并添加相关的标记进行拼接。在接收端接收到所有数据包后,再进行拼装。 总结来说,局域网丢包问题在Qt的TCP通信中是常见的,可以通过检查网络环境、优化代码逻辑、添加异常处理机制以及数据分包处理来解决。 ### 回答3: Qt是一种跨平台的C++应用程序开发框架,它提供了丰富的库和工具,方便开发人员进行图形界面和网络通信的实现。 在使用Qt进行tcp通信时,有时候会遇到局域网丢包的问题。丢包通常是由网络环境不稳定、网络拥塞或其他因素引起的。 为了解决局域网丢包问题,可以尝试以下方法: 1. 检查网络环境:确保局域网连接稳定,并且没有其他设备在占用过多带宽。 2. 设置超时时间:在Qt中,可以为tcp连接设置超时时间,如果在指定时间内没有收到响应,可以进行重试或其他处理。 3. 使用可靠的传输协议:如果对数据的可靠性要求较高,可以考虑使用可靠的传输协议,如TCP协议。 4. 重新建立连接:如果发现连接丢失或者数据丢失,可以尝试重新建立连接,或者通过心跳包等机制检测连接状态。 5. 错误处理和重试机制:在代码中添加适当的错误处理和重试机制,当发现丢包时,可以重试发送丢失的数据。 6. 数据校验和重传:在发送数据时可以附加校验和,接收端在接收数据后校验数据的完整性,并进行重传,以确保数据的准确传输。 总之,解决Qt tcp通信局域网丢包问题需要综合考虑网络环境、传输协议、错误处理和重试机制等多个方面。通过合理的设置和处理,可以提高局域网通信的可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值