三次握手的流程及TCP报文段结构 | 木戈手机站

木戈手机站

当前位置: 首页 » 攻略 » 三次握手的流程及TCP报文段结构

三次握手的流程及TCP报文段结构

本文首发于公众号:腐烂的橘子


三次握手的流程

在TCP连接建立过程中,三次握手是必不可少的步骤。具体流程如下:

  • 第 1 步 – 初始连接请求 SYN(Synchronize)
  • 第 2 步 – 服务端回复 SYN—ACK(Synchronize-Acknowledge)
  • 第 3 步 – 客户端回复 ACK(Acknowledge)


SYN 标志位、ACK 标志位、序列号到底是什么?——TCP 报文段结构

在理解TCP连接之后,有必要了解TCP报文段的结构,报文段是TCP发送数据时的具体形式。其结构如下:



图片来源于:
https://www.geeksforgeeks.org/services-and-segment-structure-in-tcp/

TCP报文首部大小通常为20-60字节。其中40字节是可选的,因此典型的TCP报文首部大小为20字节。

报文首部包含了如下字段:

  • 源端口号(Source Port Address):16比特
  • 目标端口号(Destination Port Address):16比特
  • 序列号(Sequence Number):32比特
  • 确认应答号(Acknowledgement Number):32比特
  • 头部长度(HLEN,Header Length):4比特
  • 保留字段(Reserved):6比特
  • 6个标志位
  • 接收窗口大小(Window Size):16比特
  • 校验和(CheckSum):16比特
  • 紧急指针(Urgent Pointer):16比特


为什么是三次握手不是两次?

三次握手的第三步是客户端发送确认消息给服务端,主要目的是通知服务端,服务端发送的初始序列号已被客户端确认。


不同握手阶段的报文丢失,会发生什么

如果每个阶段都发生丢包,会出现以下三种情况:

  1. 第一次握手,客户端发送的请求包没有到达服务端
  2. 第二次握手,服务端回复的 SYN+ACK 包没有到达客户端
  3. 第三次握手,客户端发送的 ACK 包没有到达服务端

由于三个阶段都有可能发生丢包,TCP会触发重传机制,包括超时重传和快速重传等多种类型。


第一次握手失败,会发生什么?

如果第一次握手的请求包未到达服务端,客户端会触发超时重传机制,在发送SYN包的一定时间后,重新发送SYN包。


超时时间 x 的值是多少?

超时时间由操作系统内核代码中的TCP_TIMEOUT_INIT字段定义,其值根据TCP/IP规范文档RFC6298 2.1中的初始RTO(Retransmission Time Out,超时重传时间)时间确定。

根据RFC6298 2.1,RTO的初始值是3秒,因此超时时间为3秒,如果3秒后未收到服务端的响应,将重新发送SYN包。


第二次握手失败,会发生什么?

如果第二次握手的SYN+ACK报文丢失,客户端会重传SYN包,而服务端会重传SYN+ACK包。根据系统设置,SYN报文会重传6次,SYN+ACK报文会重传5次。


第三次握手失败,会发生什么?

如果第三次握手失败,服务端会重传ACK+SYN报文,根据系统设置,将重试5次。


总结

要深入理解三次握手,需要了解TCP报文段的格式以及重传机制、RTO、RTT等概念。这些知识将有助于更好地理解网络中的连接建立及其他流程机制。


参考

  1. https://www.geeksforgeeks.org/services-and-segment-structure-in-tcp/
  2. https://elixir.free-electrons.com/linux/v4.14.12/source/include/net/tcp.h
  3. https://datatracker.ietf.org/doc/html/rfc6298
猜你喜欢
本类排行