TCP 三次握⼿异常情况实战分析(笔记)

一、TCP 第⼀次握⼿ SYN 丢包

tcp_syn_retries :应用程序进行connect()系统调用时,在对方不返回SYN + ACK的情况下(也就是超时的情况下),第一次发送之后,内核最多重试几次发送SYN包。                                       tcp_synack_retries :

当客户端发起的 TCP 第⼀次握⼿ SYN 包,在超时时间内没收到服务端的ACK,就会在超时重传 SYN 数据包,每次超时重传的 RTO 是翻倍上涨的,直到 SYN 包的重传次数到达tcp_syn_retries 值后,客户端不再发送 SYN 包。

 二、TCP 第⼆次握⼿ SYN、 ACK 丢包

       在客户端加上防⽕墙限制,直接把来⾃服务端的数据都丢弃。                                                   当第⼆次握⼿的 SYN、 ACK 丢包时,客户端会超时重发 SYN 包,服务端也会超时重传SYN、 ACK 包。

⽹络包进⼊主机后的顺序如下:
进来的顺序 Wire -> NIC -> tcpdump -> netfilter/iptables
出去的顺序 iptables -> tcpdump -> NIC -> Wire

       当 TCP 第⼆次握⼿ SYN、 ACK 包丢了后,客户端 SYN 包会发⽣超时重传,服务端 SYN、 ACK 也会发⽣超时重传。客户端 SYN 包超时重传的最⼤次数,是由 tcp_syn_retries 决定的,默认值是 5 次;服务端 SYN、 ACK 包时重传的最⼤次数,是由 tcp_synack_retries 决定的,默认值是 5 次。

三、TCP 第三次握⼿ ACK 丢包

       在服务端配置防⽕墙,屏蔽客户端 TCP 报⽂中标志位是ACK 的包,也就是当服务端收到客户端的 TCP ACK 的报⽂时就会丢弃。

在建⽴ TCP 连接时,如果第三次握⼿的 ACK,服务端⽆法收到,则服务端就会短暂处于SYN_RECV 状态,⽽客户端会处于 ESTABLISHED 状态。由于服务端⼀直收不到 TCP 第三次握⼿的 ACK,则会⼀直重传 SYN、 ACK 包,直到重传次数超过tcp_synack_retries 值(默认值 5 次)后,服务端就会断开 TCP 连接。
⽽客户端则会有两种情况:
如果客户端没发送数据包,⼀直处于 ESTABLISHED 状态,然后经过 2 ⼩时 11 分 15 秒才可以发现⼀个「死亡」连接,于是客户端连接就会断开连接。如果客户端发送了数据包,⼀直没有收到服务端对该数据包的确认报⽂,则会⼀直重传该数据包,直到重传次数超过 tcp_retries2 值(默认值 15 次)后,客户端就会断开 TCP 连接。

TCP 的 保活机制:
定义⼀个时间段,在这个时间段内,如果没有任何连接相关的活动, TCP 保活机制会开始作⽤,每隔⼀个时间间隔,发送⼀个「探测报⽂」,该探测报⽂包含的数据⾮常少,如果连续⼏个探测报⽂都没有得到响应,则认为当前的 TCP 连接已经死亡,系统内核将错误信息通知给上层应⽤序。
 



                               

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值