本文首发于公众号:腐烂的橘子
三次握手的流程
在TCP连接建立过程中,三次握手是必不可少的步骤。具体流程如下:
SYN 标志位、ACK 标志位、序列号到底是什么?——TCP 报文段结构
在理解TCP连接之后,有必要了解TCP报文段的结构,报文段是TCP发送数据时的具体形式。其结构如下:
图片来源于:
https://www.geeksforgeeks.org/services-and-segment-structure-in-tcp/
TCP报文首部大小通常为20-60字节。其中40字节是可选的,因此典型的TCP报文首部大小为20字节。
报文首部包含了如下字段:
为什么是三次握手不是两次?
三次握手的第三步是客户端发送确认消息给服务端,主要目的是通知服务端,服务端发送的初始序列号已被客户端确认。
不同握手阶段的报文丢失,会发生什么
如果每个阶段都发生丢包,会出现以下三种情况:
由于三个阶段都有可能发生丢包,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等概念。这些知识将有助于更好地理解网络中的连接建立及其他流程机制。
参考