TCP全连接队列和半连接队列已满之后的连接建立过程抓包分析

本文详细分析了Linux内核中TCP连接的全连接队列和半连接队列在满载情况下的处理流程。当全连接队列已满,新的连接请求会被服务端接纳但不转为ESTABLISHED状态,而半连接队列满时,服务端会丢弃新的SYN分节。通过抓包实例展示了连接建立过程,并探讨了队列长度设置对连接处理的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

另外,0端口是系统的保留端口号,若bind时用了0端口,则表示由系统分配一个端口,该端口介于1024和5000之间。


在进行client不断的对server端进行connect的过程中发现下面这个syn_recv状态,而且循环6w次的链接只进行了2W多次就出错了。





于是去查找了下原因:

Linux内核协议栈为一个tcp连接管理使用两个队列,一个是半链接队列(用来保存处于SYN_SENT和SYN_RECV状态的请求),一个是全连接队列(accpetd队列)(用来保存处于established状态,但是应用层没有调用accept取走的请求)。


也就是说,client进行connect之后先进入server的半连接队列,client就直接进入established状态,如果server的全连接队列(accept队列)未满,则将其放入全连接队列(未被应用层进行accpet函数调用取走),然后server也进入established状态。如果全连接队列满了,则server停留在syn_recv状态。

其中全连接队列somaxconn的参数为1表示监听队列的总长度(实际可以完成somaxconn+1个连接的建立)

半连接队列tcp_max_syn_backlog为1(实际可以将tcp_max_syn_backlog+1个syn分节放入其中)

但是在应用层有 int listen(int sockfd, int backlog);。。。然后实际的全连接队列的长度限制是min(backlog, somaxconn);

默认的话半连接队列的长度是/proc/sys/net/ipv4/tcp_max_syn_backlog,默认是1024。如果开启了syncookies,那么基本上没有限制。

全连接队列的长度是/proc/sys/net/core/somaxconn,默认是128,表示最多有129个established链接等待accept。(为什么是129?详见下面的附录1)。


当全连接队列已满且半连接队列未满的情况下:

当客户端发起一个syn分节时,服务端不会丢弃该syn分节,而是直接响应ack和syn,这时客户端响应ack,并成为established状态,而服务端收到ack响应后,试图将该syn分节从半连接队列中移除,并加入全链接队列,然后由于全连接队列已经满了,这时,在默认情况下,服务端啥也不做,而且不会将该连接由SYN_RECV变成ESTABLISHED,服务端仅仅只是创建一个定时器,以固定间隔重传syn和ack到客户端,直到到达系统默认的synack重传阖值,然后服务端将处于半连接队列里面的syn分节丢弃。

当全连接已满且半连接队列也满的情况下:

当客户端发起一个syn分节时,服务端发现半连接队列已经满了,同时该syn分节尚未重传过,服务端直接丢弃该syn分节,然后客户端过了4秒重传syn分节,这个时候服务端发现半连接队列已满同时,该syn分节已经重传过了,服务端收下了该syn分节,并响应客户端syn+ack,客户端收到syn+ack后,响应ack。客户端三次握手已经完成,而服务端收到ack之后,发现全连接队列是满的,这个时候不会将该连接从SYN_RECV转换成ESTABLISHED,服务端创建定时器,定时重传syn+ack, 直到到达系统默认的synack重传阖值,然后服务端将处于半连接队列里面的syn分节丢弃





实际队列中的数量比max的数值大1,标号从0开始,直到max数值也能使用:



实际队列中的数量比max的数值大1,标号从0开始,直到max数值也能使用:


附录1

when I use linux TCP socket, and find there is a bug in function sk_acceptq_is_full()

When a new SYN comes, T

<think>我们正在排查网络丢包延迟问题。根据用户需求,我们需要结合之前的DHCP故障排查经验,但重点转向丢包延迟。引用[1][2]提到了网络丢包是常见故障,可能由多种因素引起,包括网络拥塞、硬件故障、配置错误等。我们将从基础到深入逐步排查。排查思路:1.确定问题范围模式:是持续丢包还是间歇性?是特定目标还是普遍?延迟是否伴随丢包?2.分层排查:物理层、数据链路层、网络层、传输层等。3.使用工具:ping,traceroute, mtr,netstat, iperf,Wireshark等。具体步骤:###一、问题定位与基础测试1. **确定故障范围**-测试不同目标:```bashping -c1008.8.8.8#测试公网地址ping -c100192.168.1.1 #测试网关ping-c100同网段其他主机 #测试局域网内```-结果分析:-如果仅公网丢包,问题可能出在出口或ISP链路-如果仅网关丢包,问题可能在本地网络或网关设备-如果局域网内就丢包,问题可能在物理层或二层2. **持续监控工具**-使用`mtr`(结合tracerouteping):```bashmtr-r-c1008.8.8.8#生成100个包的报告,显示每一跳的丢包率延迟```-关键指标:-最后一跳丢包率>1%即异常[^1]-中间跳出现丢包但最后一跳不丢包,可能是设备配置丢弃探测包(正常)###二、物理层与数据链路层排查1. **物理连接检查**-网线/光纤:更换线缆测试,检查接口氧化-网卡状态:```bashethtooleth0#Linux查看网卡状态(关注Speed,Duplex, Errors)netstat -i#查看接口错误计数(I-Err, O-Err)```-错误类型分析:-`CRC errors`:物理层干扰或线缆问题-`collisions`:半双工冲突(现代网络少见)-`overruns`:系统处理能力不足2.**二层环路与广播风暴**-检查交换机端口状态:```bashshow interfaces|include errors|broadcast#查看错误包广播包```-广播风暴特征:-端口广播包>10,000pps(每秒包数)- CPU利用率突增-防护措施:-启用STP(生成树协议)-配置广播风暴控制:```bashinterface GigabitEthernet0/1storm-control broadcastlevel10#限制广播流量为10%```###三、网络层与路由分析1.**路由路径验证**-使用`traceroute`:```bashtraceroute-n8.8.8.8#不解析域名,显示路径```-异常情况:-路由循环(同一IP重复出现)-路径不对称(去程回程路径不一致)2. **MTU不匹配**-症状:大包丢包,小包正常-测试方法:```bashping -s1472-Mdo8.8.8.8# Linux(1472+28=1500)ping -l1472-f8.8.8.8#Windows```-如果1472成功,1500失败,则存在MTU问题-解决方案:调整MTU或启用分片(避免路径MTU黑洞)###四、传输层与拥塞控制1. **TCP重传分析**-使用Wireshark过滤:```bashtcp.analysis.retransmission#显示重传包```-重传率>1%即需关注[^2]-常见原因:-网络拥塞(Bufferbloat)-不稳定的无线连接2.**带宽拥塞检测**-使用`iperf3`测试带宽:```bash#服务端iperf3 -s#客户端iperf3-cserver_ip -t30 -P10#10个并行流测试30秒```-观察抖动(Jitter)丢包:-丢包集中在高带宽时→带宽不足-持续高抖动→线路质量差###五、设备性能与配置1. **设备资源瓶颈**-检查路由器/交换机CPU/内存:```bashshowprocesses cpusorted#查看CPU占用最高的进程showmemory statistics```-关键阈值:-CPU持续>70%-内存使用率>80%2. **QoS策略冲突**-检查策略路由:```bashshowpolicy-mapinterface#查看QoS策略应用```-典型错误:-限速策略过严-优先级队列配置错误###六、高级诊断工具1.**主动探测工具**-`smokeping`:长期监控延迟丢包- `netperf`:专业级网络性能测试2. **数据中心网络**-使用`perfSONAR`:跨域性能监测-光纤质量检测:OTDR测试仪(光衰减超标)###故障解决流程图```mermaidgraph TDA[发现丢包/高延迟]--> B{定位范围}B-->|单点问题| C[检查物理链路/网卡]B-->|局部网络| D[测试二层环路/广播风暴]B-->|全网问题| E[检查核心设备状态]C -->F{是否解决?}D -->FE--> FF -->|否| G[分段抓包分析]G -->H[检查TCP重传/MTU]H--> I{是否解决?}I -->|否| J[排查QoS/设备性能] ```###典型解决方案1. **物理层错误修复**:-更换损坏网线-调整网卡双工模式:```bashethtool-seth0speed1000duplex fullautonegoff#强制千兆全双工```2.**路由优化**:-调整OSPF/BGP成本值-启用ECMP(等价多路径)3. **拥塞控制**:-部署流量整形:```bash#LinuxTC示例tcqdiscadd deveth0root tbf rate100mbitburst1mbitlatency50ms```4.**MTU问题**:-在路由器上启用`ip tcp adjust-mss`-或手动设置客户端MTU:```bashifconfig eth0 mtu1400#Linuxnetshinterface ipv4set subinterface “Ethernet” mtu=1400# Windows``` ---###相关问题1.如何通过Wireshark分析TCP重传的具体原因?2.在无线网络中,如何区分信号干扰带宽不足导致的丢包?3.如何利用BGP监控工具诊断跨国链路的延迟问题?4.数据中心RDMA网络中丢包对性能的影响有何特殊性?5.网络拥塞控制算法(如BBR)如何改善高延迟链路的表现?</think>### 网络丢包延迟问题排查与解决指南 #### **一、问题定位与基础测试** 1. **确定故障范围** - 测试不同目标地址: ```bash ping -c 100 8.8.8.8 # 测试公网地址 ping -c 100 192.168.1.1 # 测试网关 ping -c 100 同网段其他主机 # 测试局域网内通信 ``` - 关键指标分析: - 公网丢包→ISP链路或出口设备问题 - 网关丢包→本地网络问题 - 局域网丢包→物理层或二层故障 2. **持续监控工具** - 使用`mtr`(综合traceroute+ping): ```bash mtr -r -c 100 8.8.8.8 # 生成100个包的路径报告 ``` - 诊断要点: - 最后一跳丢包率>1%即异常[^1] - 中间节点丢包但目的节点正常→路径设备问题 #### **二、物理层与数据链路层排查** 1. **物理连接检测** - 网卡状态检查: ```bash ethtool eth0 # Linux(关注Speed/Duplex/Errors) Get-NetAdapterStatistics # Windows PowerShell ``` - 错误计数器分析: - `CRC errors`:线缆干扰或接口氧化 - `collisions`:半双工冲突(现代网络少见) - `overruns`:系统处理能力不足 2. **二层环路与广播风暴** - 交换机诊断: ```bash show interfaces | include errors|broadcast # 查看错误包广播包 ``` - 风暴特征: - 端口广播包>10,000 pps - CPU利用率>90%且波动剧烈 - 解决方案: ```bash # 启用广播风暴控制 interface GigabitEthernet0/1 storm-control broadcast level 10 # 限制广播流量为10% ``` #### **三、网络层与路由分析** 1. **路径验证** - 路由追踪: ```bash traceroute -n 8.8.8.8 # 禁用DNS解析 ``` - 异常场景: - 路由循环→路由协议故障 - 非对称路径→策略路由配置错误 2. **MTU不匹配检测** - 测试方法: ```bash ping -s 1472 -M do 8.8.8.8 # Linux(1472+28=1500) ping -l 1472 -f 8.8.8.8 # Windows ``` - 症状:小包通,大包不通→MTU黑洞 - 解决: ```bash ifconfig eth0 mtu 1400 # 临时调整MTU ``` #### **四、传输层与拥塞控制** 1. **TCP性能分析** - Wireshark关键过滤: ```bash tcp.analysis.retransmission # 重传包 tcp.analysis.zero_window # 接收端拥塞 ``` - 重传率>1%需重点排查[^2] 2. **带宽拥塞测试** - iperf3压力测试: ```bash # 服务端 iperf3 -s # 客户端 iperf3 -c server_ip -t 30 -P 10 # 10个并行流 ``` - 判定标准: - 丢包伴随高抖动→线路质量差 - 丢包仅在高带宽时出现→带宽不足 #### **五、设备性能与配置** 1. **资源瓶颈检查** - 路由器/交换机诊断: ```bash show processes cpu sorted # CPU占用排序 show memory statistics # 内存分析 ``` - 危险阈值: - CPU持续>70% - 内存使用>80% 2. **QoS策略冲突** - 检测配置: ```bash show policy-map interface # 查看QoS应用 ``` - 典型错误: - 限速策略过严导致丢包 - 优先级队列配置错误 #### **六、高级诊断工具** | **工具** | **应用场景** | **关键命令/操作** | |----------------|----------------------------------|-----------------------------------| | **smokeping** | 长期延迟波动监控 | 配置多目标持续探测 | | **netperf** | 专业级TCP/UDP性能测试 | `netperf -H target -t TCP_STREAM` | | **perfSONAR** | 跨域网络性能分析(科研网常用) | 部署测量节点进行端到端测试 | | **OTDR测试仪** | 光纤质量检测(衰减>0.2dB/km异常)| 物理层故障定位 | ### 故障解决流程图 ```mermaid graph TD A[发现丢包/高延迟] --> B{定位范围} B -->|单点问题| C[检查物理链路/网卡] B -->|局部网络| D[测试二层环路/广播风暴] B -->|全网问题| E[检查核心设备状态] C --> F{是否解决?} D --> F E --> F F -->|否| G[分段抓包分析] G --> H[检查TCP重传/MTU] H --> I{是否解决?} I -->|否| J[排查QoS/设备性能] ``` ### 典型解决方案 1. **物理层故障**: ```bash # 更换损坏网线后测试 ethtool -s eth0 speed 1000 duplex full autoneg off # 强制千兆全双工 ``` 2. **路由优化**: ```bash # 调整OSPF成本值 router ospf 1 auto-cost reference-bandwidth 10000 # 万兆参考带宽 ``` 3. **拥塞控制**: ```bash # Linux流量整形 tc qdisc add dev eth0 root tbf rate 100mbit burst 1mbit latency 50ms ``` --- ### 相关问题 1. 如何通过Wireshark区分TCP重传与网络拥塞导致的丢包? 2. 在无线网络中如何精准定位信号干扰导致的延迟波动? 3. 如何利用BGP监控工具诊断跨国链路的丢包问题? 4. 数据中心RDMA网络中丢包对性能的影响有何特殊性? 5. 网络拥塞控制算法(如BBR)如何优化高延迟链路?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值