网络异常案例五_SYN被丢弃

问题现象

公司同事使用的时候,反馈系统不稳定,访问的时候,有时候会出现白屏(连接超时),或者系统页面点击没有响应,过一会之后刷新系统又可以正常展示了。之前未收到过类似反馈,一直都是正常的。
在这里插入图片描述

浏览器控制台信息如下
在这里插入图片描述

可疑点

所有请求,request header显示的是临时报文头

在这里插入图片描述

chrome.devtools上面的介绍
在这里插入图片描述

按网上资料,可能和chrome浏览器插件有关系

前面几个请求耗时很久,均卡在Stalled这个状态

在这里插入图片描述

问题排查

查看异常附近时段的监控。服务器cpu、内存、带宽、网络连接数无明显变化,未发现异常。
查看服务端应用、入口nginx组件的日志,未看到异常信息,没有看到请求处理超时。

客户端抓包,发现SYN请求建立连接,服务端没有回SYN+ACK。
在这里插入图片描述

服务器抓包,未针对SYN包进行响应。
在这里插入图片描述

基于这个信息查询,定位系统开启了TCP连接复用参数(tcp_tw_recyle)。和运维沟通,近期针对tcp连接参数进行过调整。恢复了调整参数,然后反馈服务正常。

为什么会丢弃SYN包

服务器任务该数据包是无效的包,故丢弃了。
启用了tcp_tw_recyle之后,开启了per-host的PAWS检查。但数据包里面的时间戳比上一次小,忽略该数据包。

相关知识串联

TCP基础知识点

  • TCP/IP的职能定位
    • IP,提供的是端到端的传输。从源IP传输到目标IP,选择合适的传输路线,但不保证可靠性。尽力而为。
    • TCP,在IP的基础上,提供点到点的服务。从源IP的源端口传输到目标IP的目标端口,保证同一个连接下传输的有序、可靠。
  • 如何识别同一个TCP连接
    • 通过四元组识别,四元组:源IP、源端口、目标IP、目标端口(还有一个隐性条件:协议类型)。这四个信息一样的即认为同一个TCP连接。
  • TCP有序性保障
    • 在每个传输的报文段里面添加了sequence信息,接收方接收到数据后进行应答,告知发送方已收到相应的sequence数据。由于网络的不可靠性,可能会出现丢包,或者延时的情况。如接收方已接收到sequence 10000及之前所有的数据包并进行了处理,此时如果收到该sequence之前的包,会丢弃掉不进行处理。(此处为理解问题进行了简化,实际上也会回ack应答)
    • sequence标识的是传输内容字节的顺序,而非报文的序号。sequence有长度限制(32bit),最大为4G(2^32),当超过上限后会循环开始。

PAWS+时间戳选项的起因

  • 高速带宽+接收方接收能力提升导致sequence不够用,为了解决sequence不够用的场景,增加时间戳用于辅助识别数据包的有效性
    • 见下面截图介绍(来源于TCP/IP详解*卷一)
      在这里插入图片描述

TCP挥手过程

见下图。主动发起断开方最后需要等待2MSL时间
在这里插入图片描述

TCP连接复用+快速回收

tcp_tw_recycle:快速回收TIME_WAIT状态的连接;不推荐在NAT模式下使用;
tcp_tw_reuse:快速复用TIME_WAIT状态的连接;
在这里插入图片描述

NAT联网介绍

在这里插入图片描述
图片来源于《计算机网络*自顶向下方法》

per-host PAWS机制

当开启了tcp_tw_recycle和tcp_timestamps之后,会开启per-host的PAWS机制,tcp识别由连接的识别由四元组(源IP、源端口、目标ip、目标端口)变为三元组(源IP、目标ip、目标端口)。
在这里插入图片描述

问题产生过程

server端是linux系统,默认开始了tcp_timestamps机制。现在又开启了tcp_tw_recycle。
客户端电脑,一般都是NAT联网。不同电脑的时间戳是不一样的。
当A电脑和server端交互完成后,B电脑马上和server端交互,且时间戳比A小。server端会认为是一个无效的包,丢弃它。

验证的部分场景截图

server端主动断开(相同的四元组),syn包被忽略。第二次请时间戳<第一次时间戳
在这里插入图片描述

client主动断开(不同的四元组),syn包没有应答。一台client关闭了timestamp选项
在这里插入图片描述

相同的四元组,server端主动断开,有应答。第二次请时间戳>第一次时间戳
在这里插入图片描述

不同的四元组,server端主动断开,有应答。第二次请时间戳>第一次时间戳(第一台的client关闭了timestamp)
在这里插入图片描述

参考资料

syn丢弃场景介绍
tcp_tw_recycle引发的问题
TCP时间戳介绍

附*系列文章索引

整理起因
报文分析
报文格式解读
握手+挥手过程状态变化分析
滑动窗口介绍
可靠数据传输原理
拥塞控制
网络异常案例(123456
结束语

  • 52
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: tcp_max_syn_backlog 是一个 TCP 协议的参数,用于控制 TCP SYN 连接请求的最大队列长度。当有大量的客户端同时向服务器发起连接请求时,服务器可能会出现 SYN 队列溢出的情况,导致客户端连接失败。通过调整 tcp_max_syn_backlog 参数,可以增加 TCP SYN 队列的最大长度,从而提高服务器的连接请求处理能力。 在 Linux 系统中,tcp_max_syn_backlog 默认值为 1024。可以通过修改 /proc/sys/net/ipv4/tcp_max_syn_backlog 文件来调整该参数的值。但需要注意的是,过大的 tcp_max_syn_backlog 值会占用过多的系统资源,从而影响系统的性能表现。 ### 回答2: tcp_max_syn_backlog是TCP协议中一个参数,用于控制SYN队列的最大长度。SYN队列存储了正在与服务器建立连接的客户端请求,当服务器接收到客户端的SYN请求时,会将其放入SYN队列中。tcp_max_syn_backlog参数的作用就是控制SYN队列的最大长度,当SYN队列已满时,服务器将无法接受新的连接请求。 如果tcp_max_syn_backlog值设置过小,当服务器接收到大量的客户端连接请求时,有可能会导致SYN队列溢出,从而导致新的连接请求丢弃,客户端无法与服务器建立连接。在高并发的网络环境下,适当增大tcp_max_syn_backlog值可以提高服务器的处理能力,减少客户端连接丢失的概率。 然而,设置过大的tcp_max_syn_backlog值也会有一些问题。首先,SYN队列的长度是有限的,如果设置过大,会占用服务器的内存资源。其次,如果服务器无法及时处理SYN队列中的请求,会造成客户端连接的延迟增加。 因此,在调整tcp_max_syn_backlog值时,需要根据服务器的实际情况进行综合考虑。一般来说,如果服务器处于高并发的环境中,可以适当增大tcp_max_syn_backlog值。而对于低并发的场景,则可以适当减小tcp_max_syn_backlog值,以节省服务器资源。为了保证服务器的稳定性和性能,在调整tcp_max_syn_backlog值时,还需要结合服务器的硬件配置、网络带宽以及预计的连接请求负载等因素进行综合评估和测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值