本文结构如下:
- 部分字段简介
- 三次握手
- 四次挥手
部分字段简介:
TCP(传输控制协议):是一种面向连接、可靠的传输层协议。
在进行连接和释放连接时会用到TCP报文段首部中的以下字段:
- 序列号:TCP为传输过程中的所有数据字节编号,初始化序列号为随机数。
- 确认号:其中的内容是接收方期望下次收到的字节的编号(序列号)。此时说明接收方已经收到了该字节之前的所有字节。
- ACK标志:
ACK=1
表示确认号字段有效,ACK=0
,则表示确认号字段无效 - SYN标志:建立连接时用于同步序号,当
SYN=1,ACK=0
时表示其是一个连接请求报文段,若同意请求则返回ACK=1,SYN=1
. - FIN标志:用于释放一个连接,当
FIN=1
,表示此报文段的发送端已发送完毕,并要求释放传输连接。
三次握手:
当客户端需要与服务端建立连接时,通过三次握手完成,过程如图:
过程描述:
① 客户端向服务器发送含有 SYN =1,ACK=0,seq = i
(随机数) 的报文段,向进行连接请求
② 服务端接收到客户端发来的报文段后,发送SYN=1, ACK=1
,表示同意连接,同时发送seq = j
(j也为随机数),ack = i+1
,表明其已收到序号i及其之前发送的所有数据。
③ 客户端接收到服务端发送的报文段后,发送ACK=1,ack=j+1,
表明已经收到j及其之前的所有消息。至此连接建立完毕。
四次挥手:
在释放连接时,客户端和服务端通过四次挥手来完成。过程如图:
① 客户端向服务器发送FIN=1
请求终止连接。
② 服务器收到后,ACK=1
(说明ack字段有效),ack=x+1
表明收到序号x及其之前的报文段。
③ 服务器发送FIN=1
的请求,向客户端请求终止连接。
④ 客户端确认收到③的报文段,向服务端发送ACK=1,ack=z+1
报文段,并处于TIME-WAIT状态。在等待2MSL(Maximum Segment Lifetime 最长报文段寿命)个时间后,才释放掉连接。
这里就有一个问题:为什么要经过2MSL时间后才释放连接?
原因有两点:
- 确保客户端发送的确认信息能够到达服务端。
- 防止 已失效的报文段连接请求报文 出现在之后的连接中。等待2MSL时间后,本次连接的所有请求均从网络消失。而不会出现在下一次连接。即,可以保证下次连接不受影响。