- 0
- 75 浏览
TCP的三次握手
三次握手具体过程
TCP连接的建立时,双方需要经过三次握手,具体过程如下:
(1)第一次握手:Client进入SYN_SENT
状态,发送一个SYN
帧来主动打开传输通道,该帧的SYN
标志位被设置为1
,同时会带上Client分配好的SN
序列号,该SN
是根据时间产生的一个随机值,通常情况下每间隔4ms会加1。除此之外,SYN
帧还会带一个MSS
(最大报文段长度)可选项的值,表示客户端发送出去的最大数据块的长度。
(2)第二次握手:Server端在收到SYN
帧之后,会进入SYN_RCVD
状态,同时返回SYN+ACK
帧给Client,主要目的在于通知Client,Server端已经收到SYN
消息,现在需要进行确认。Server端发出的SYN+ACK
帧的ACK
标志位被设置为1
,其确认序号AN
(Acknowledgment Number
)值被设置为Client的SN+1
;SYN+ACK
帧的SYN
标志位被设置为1,SN
值为Server端生成的SN
序号;SYN+ACK
帧的MSS
(最大报文段长度)表示的是Server端的最大数据块长度。
(3)第三次握手:Client在收到Server的第二次握手SYN+ACK
确认帧之后,首先将自己的状态会从SYN_SENT
变成ESTABLISHED
,表示自己方向的连接通道已经建立成功,Client可以发送数据给Server端了。然后,Client发ACK
帧给Server端,该ACK
帧的ACK
标志位被设置为1
,其确认序号AN
(Acknowledgment Number
)值被设置为Server端的SN
序列号+1
。还有一种情况,Client可能会将ACK
帧和第一帧要发送的数据,合并到一起发送给Server端。
(4)Server端在收到Client的ACK
帧之后,会从SYN_RCVD
状态会进入ESTABLISHED
状态,至此,Server方向的通道连接建立成功,Server可以发送数据给Client,TCP的全双工连接建立完成。
三次握手的图解
三次握手的交互过程,具体如下图所示:
Client和Server完成了三次握手后,双方就进入了数据传输的阶段。数据传输完成后,连接将断开,连接断开的过程需要经历四次挥手。
TCP的四次挥手
业务数据通信完成之后,TCP连接开始断开(或者拆接)的过程,在这个过程中连接的每个端的都能独
立地、主动的发起,断开的过程TCP协议使用了四路挥手操作。
四次挥手具体过程
四次挥手具体过程,具体如下:
(1)第一次挥手:主动断开方(可以是客户端,也可以是服务器端),向对方发送一个FIN
结束请求报文,此报文的FIN位被设置为1
,并且正确设置Sequence Number
(序列号)和Acknowledgment Number
(确认号)。发送完成后,主动断开方进入FIN_WAIT_1
状态,这表示主动断开方没有业务数据要发送给对方,准备关闭SOCKET
连接了。
(2)第二次挥手:正常情况下,在收到了主动断开方发送的FIN断开请求报文后,被动断开方会发送一个ACK响应报文,报文的Acknowledgment Number
(确认号)值为断开请求报文的Sequence Number
(序列号)加1
,该ACK确认报文的含义是:“我同意你的连接断开请求”。之后,被动断开方就进入了CLOSE-WAIT
(关闭等待)状态,TCP协议服务会通知高层的应用进程,对方向本地方向的连接已经关闭,对方已经没有数据要发送了,若本地还要发送数据给对方,对方依然会接受。被动断开方的CLOSE-WAIT
(关闭等待)还要持续一段时间,也就是整个CLOSE-WAIT
状态持续的时间。
主动断开方在收到了ACK
报文后,由FIN_WAIT_1
转换成FIN_WAIT_2
状态。
(3)第三次挥手:在发送完成ACK
报文后,被动断开方还可以继续完成业务数据的发送,待剩余数据发送完成后,或者CLOSE-WAIT
(关闭等待)截止后,被动断开方会向主动断开方发送一个FIN+ACK
结束响应报文,表示被动断开方的数据都发送完了,然后,被动断开方进入LAST_ACK
状态。
(4)第四次挥手:主动断开方收在到FIN+ACK
断开响应报文后,还需要进行最后的确认,向被动断开方发送一个ACK
确认报文,然后,自己就进入TIME_WAIT
状态,等待超时后最终关闭连接。处于TIME_WAIT
状态的主动断开方,在等待完成2MSL
的时间后,如果期间没有收到其他报文,则证明对方已正常关闭,主动断开方的连接最终关闭。
被动断开方在收到主动断开方的最后的ACK
报文以后,最终关闭了连接,自己啥也不管了。
四次挥手图解
四次挥手的全部交互过程,具体如下图所示:
处于TIME_WAIT
状态的主动断开方,在等待完成2MSL
的时间后,才真正关闭连接通道,其等待的时间为什么是2MSL
呢?
2MSL
翻译过来就是两倍的MSL。MSL全称为Maximum Segment Lifetime
,指的是一个TCP报文片段在网络中最大的存活时间,具体来说,2MSL对应于一次消息的来回(一个发送和一个回复)所需的最大时间。如果直到2MSL
,主动断开方都没有再一次收到对方的报文(如FIN报文),则可以推断ACK
已经被对方成功接收,此时,主动断开方将最终结束自己的TCP连接。
所以,TCP的TIME_WAIT状态也称为2MSL等待状态。
有关MSL的具体的时间长度,在RFC1122协议中推荐为2分钟。在SICS(瑞典计算机科学院)开发的一个小型开源的TCP/IP协议栈——LwIP开源协议栈中MSL默认为1分钟。在源自Berkeley的TCP协议栈实现中MSL默认长度为30秒。总体来说,TIME_WAIT
(2MSL)等待状态的时间长度,一般维持在1-4分钟之间。通过三次握手建立连接和四次挥手拆除连接,一次TCP的连接建立及拆除,至少进行7次通信,可见其成本是很高的。
本文链接:https://www.lifd.site/tech/tcp-de-san-ci-wo-shou-si-ci-hui-shou/