大家好,我是小林。
之前有个读者在秋招面试的时候,被问了这么一个问题:SYN 报文什么情况下会被丢弃?
好家伙,现在面试都问那么细节了吗?
不过话说回来,这个问题跟工作上也是有关系的,因为我就在工作中碰到这么奇怪的问题。
客户端向服务端发起了连接,但是连接并没有建立起来,通过抓包分析发现,服务端是收到 SYN 报文了,但是并没有回复 SYN+ACK(TCP 第二次握手),说明什么 SYN 报文被服务端忽略了,然后客户端就一直在超时重传 SYN 报文,直到达到最大的重传次数。
接下来,我就给出我遇到过的 SYN 报文被丢弃的两种场景:
- 开启 tcp_tw_recycle 参数,并且在 NAT 环境下,造成 SYN 报文被丢弃
- accpet 队列满了,造成 SYN 报文被丢弃
坑爹的 tcp_tw_recycle
TCP 四次挥手过程中,主动断开连接方会有一个 TIME_WAIT 这个状态,这个状态会持续 2 MSL 后才会转变为 CLOSED 状态。