tcp的三次握手 – 数据包丢失处理

  • Post author:
  • Post category:其他




1.基础概念



三次握手的丢包重传机制的次数限制和RTO的增长

  1. 第一次握手(syn包):

    tcp_syn_retires

    的参数来限制第一次握手(syn包)的重传次数,

    默认为5次

  2. 第二次握手(ack+ack包):

    tcp_synack_retires

    的参数来限制第二次握手(ack+syn包)的重传次数,

    默认为5次

  3. 第三次握手(ack包):

    tcp_retires2

    的参数来限制第三次握手(ack包)的重传次数,

    默认为15次

  4. 每次重传都会导致

    RTO超时重传的时间成倍增长



2.第一次握手(syn包)丢失

  1. 当客户端发起的 TCP 第一次握手 SYN 包,在

    超时时间内没收到服务端的 ACK

    ,就会在

    超时重传 SYN 数据包

    ,每次超时

    重传的 RTO 是翻倍上涨

    的,直到

    SYN 包的重传次数到达 tcp_syn_retries

    值后,客户端

    不再发送 SYN 包



3.第二次握手(ack+syn包)丢失

  1. 当 TCP 第二次握手 SYN、ACK 包丢了后,客户端

    第一次握手的SYN 包会发生超时重传

    ,服务端

    第二次握手的SYN、ACK 也会发生超时重传

  2. 客户端 SYN 包超时重传的最大次数,是由

    tcp_syn_retries 决定的

    ,默认值是 5 次;服务端 SYN、ACK 包时重传的最大次数,是由

    tcp_synack_retries 决定的

    ,默认值是 5 次。



4.第三次握手(ack包)丢失

对于

服务器

  1. 在建立 TCP 连接时,如果第三次握手的 ACK,服务端无法收到,则服务端就会

    短暂处于 SYN_RECV 状态

    ,而客户端会

    处于 ESTABLISHED 状态

  2. 由于服务端一直收不到 TCP 第三次握手的 ACK,则

    第二次握手会一直重传 SYN、ACK 包

    ,直到重传次数

    超过 tcp_synack_retries 值

    (默认值 5 次)后,服务端就会

    断开 TCP 连接

    。 (这里的断开是

    服务器单方面主动断开

    ,客户端的状态还是established的)



客户端

则会有两种情况:

  1. 如果

    客户端没发送数据包

    ,一直处于 ESTABLISHED 状态,当

    达到我们保活机制的时间限制时会触发保活机制

    来看看这个tcp连接是否还存活,如果不存活,则为死亡连接,客户端断开连接。 (

    触发保活机制

  2. 如果

    客户端发送了数据包

    ,一直没有收到服务端对该数据包的确认报文,则会一直重传该数据包,直到

    重传次数超过 tcp_retries2 值(默认值 15 次)

    后,客户端就会

    断开 TCP 连接。



版权声明:本文为qq_45788043原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。