服务器丢包是网络通信中常见的问题之一,它会导致网络不稳定和数据丢失,进而影响业务的正常运行。面对这种情况,我们需要采取一系列措施来诊断和解决问题。以下是一些有效的解决方法和建议,帮助你应对服务器丢包问题。
首先
,我们要知道网络数据是如何封装及流向的,涉及哪些设备。当两台电脑需要传输数据时,它们首先通过各自的网卡建立起网络连接。发送方电脑将需要传输的数据按照网络协议(如TCP/IP)封装成数据包,这些数据包包含了目标电脑的IP地址、端口号等信息,以确保数据能够准确地被接收方电脑识别和处理。一旦数据包准备好,发送方电脑的网卡将其发送到与之相连的网络设备(如交换机、路由器)上。网络设备根据数据包中的目标IP地址,通过查找路由表等机制,将数据包转发到接收方电脑所在的网络路径上。在这个过程中,数据包可能会经过多个网络设备和链路,直到最终到达接收方电脑的网卡。
其次
,要了解电脑网卡是如何收发数据的。在接收数据时,网卡首先通过其物理接口(如RJ45接口)捕获来自网络传输介质(如双绞线、光纤等)上的模拟信号。这些信号随后被网卡的物理层(PHY)芯片进行模数转换、时钟恢复、信号均衡等处理,以提取出数字比特流。接着,MAC(媒体访问控制)层芯片负责将这些比特流解码,并根据以太网协议将其组装成完整的数据帧。数据帧在通过错误检测(如CRC校验)后被暂时存储在网卡的接收FIFO(先进先出队列)中。
随后,网卡利用DMA(直接存储器存取)技术,无需CPU干预,直接将数据帧从接收FIFO传输到主机内存中的特定缓冲区(通常是操作系统为网络栈分配的环形缓冲区)。一旦数据帧被成功传输到内存,网卡会触发一个硬中断来通知CPU有新的数据到达。CPU响应这个中断,进而触发软中断(或称为延迟过程调用)来处理这些数据。在软中断处理过程中,系统会关闭硬中断以避免后续数据到达时再次打断CPU,然后从缓冲区中取出数据帧,上传到网络协议栈进行解析、处理或转发。
在这个过程中,网络协议栈、网卡驱动程序、网络设备以及网络传输介质等多个组件和层次都发挥了关键作用,共同确保了数据的准确、高效传输。同时,为了保证数据传输的可靠性和安全性,还可能采用了诸如错误检测与重传、数据加密等技术。
链路层
首先,来看最底下的链路层。当缓冲区溢出等原因导致网卡丢包时,Linux会在网卡收发数据的统计信息中,记录下收发错误的次数。你可以通过ethtool或者netstat,来查看网卡的丢包记录。例如,可以在Linux中执行下面的命令,查看丢包情况:
[hik@HikvisionOS ~]$ netstat -i
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eno1 1500 280564513 0 1014149 0 125719128 0 0 0 BMRU
lo 65536 208404457 0 0 0 208404457 0 0 0 LRU
输出中的RX-OK、RX-ERR、RX-DRP、RX-OVR ,分别表示接收时的总包数、总错误数、进入Ring Buffer后因其他原因(如内存不足)导致的丢包数以及Ring Buffer溢出导致的丢包数。TX-OK、TX-ERR、TX-DRP、TX-OVR也代表类似的含义,只不过是指发送时对应的各个指标。
还需要查看是否配置了tc规则,并查看有没有丢包。
[hik@HikvisionOS ~]$ tc -s qdisc show dev eno1
qdisc mq 0: rootSent 52814288926 bytes 125720226 pkt (dropped 0, overlimits 0 requeues 532)backlog 0b 0p requeues 532
qdisc pfifo_fast 0: parent :8 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1Sent 9014793964 bytes 20583761 pkt (dropped 0, overlimits 0 requeues 81)backlog 0b 0p requeues 81
qdisc pfifo_fast 0: parent :7 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1Sent 5054813125 bytes 14804826 pkt (dropped 0, overlimits 0 requeues 97)backlog 0b 0p requeues 97
qdisc pfifo_fast 0: parent :6 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1Sent 5659461166 bytes 15967932 pkt (dropped 0, overlimits 0 requeues 63)backlog 0b 0p requeues 63
qdisc pfifo_fast 0: parent :5 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1Sent 9185688609 bytes 18295290 pkt (dropped 0, overlimits 0 requeues 63)backlog 0b 0p requeues 63
qdisc pfifo_fast 0: parent :4 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1Sent 7781681631 bytes 15873604 pkt (dropped 0, overlimits 0 requeues 59)backlog 0b 0p requeues 59
qdisc pfifo_fast 0: parent :3 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1Sent 7958014505 bytes 18497947 pkt (dropped 0, overlimits 0 requeues 63)backlog 0b 0p requeues 63
qdisc pfifo_fast 0: parent :2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1Sent 5448067818 bytes 12943905 pkt (dropped 0, overlimits 0 requeues 59)backlog 0b 0p requeues 59
qdisc pfifo_fast 0: parent :1 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1Sent 2711768108 bytes 8752961 pkt (dropped 0, overlimits 0 requeues 47)backlog 0b 0p requeues 47
如果发现有TC规则,可以使用如下命令删除
tc qdisc del dev eno1 root 规则名称 loss 规则中的百分比
网络层和传输层
[hik@HikvisionOS ~]$ netstat -s
Ip: Forwarding: 1 //开启转发 31 total packets received //总收包数 0 forwarded //转发包数 0 incoming packets discarded //接收丢包数 25 incoming packets delivered //接收的数据包数 15 requests sent out //发出的数据包数
Icmp:0 ICMP messages received //收到的ICMP包数 0 input ICMP message failed //收到ICMP失败数ICMP input histogram: 0 ICMP messages sent //ICMP发送数 0 ICMP messages failed //ICMP失败数 ICMP output histogram:
Tcp:0 active connection openings //主动连接数 0 passive connection openings //被动连接数 11 failed connection attempts //失败连接尝试数 0 connection resets received //接收的连接重置数 0 connections established //建⽴连接数 25 segments received //已接收报⽂数 21 segments sent out //已发送报⽂数 4 segments retransmitted //重传报⽂数 0 bad segments received //错误报⽂数 0 resets sent //发出的连接重置数
Udp:0 packets received
...
TcpExt: 11 resets received for embryonic SYN_RECV sockets //半连接重置数 0 packet headers predicted TCPTimeouts: 7 //超时数 TCPSynRetrans: 4 //SYN重传数
iptables
除了网络层和传输层的各种协议,iptables和内核的连接跟踪机制也可能会导致丢包。所以,这也是发生丢包问题时,我们必须要排查的一个因素
从这儿你可以看到,连接跟踪数只有54,而最大连接跟踪数则是 262144。显然,这里的丢包,不可能是连接跟踪导致的。
接下来,我们可以通过iptables -nvL命令,查看各条规则的统计信息。
素材来源官方媒体/网络新闻
>原创 晓致知 电脑知识