TCP报文首部
????????先了解TCP报文的首部,报文首部可以理解为报文的元数据,里面存放着与这次报文相关的其他信息,图我就不摆了,介绍一下跟三次握手相关的报文首部字段。
1、序号seq
????????对字节流的编号。例如第一个字节的序号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。注意第一份报文段的序号是随机生成的,后面的报文段序号是根据上一个报文段序号及报文长度生成的。
2、确认号ack
????????期望收到的下一个报文段的序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。
3、SYN
????????控制位的一种,用于建立连接,该位设为 1,表示希望建立连接,并对第一份报文的序号进行随机初始化。
4、ACK
????????控制位的一种,确认应答的字段有效,TCP规定除了最初建立连接时的 SYN 包以外该位必须设为 1。
5、FIN
????????控制位的一种,当FIN=1,表明此报文的发送方的数据已经发送完毕,要求关闭连接。
三次握手具体过程
如下图所示:
1、第一次握手
????????Client端将SYN置为1,表示希望与Server端建立连接;序号seq初始化为J,并将该数据包发送给Server端,Client进入SYN_SENT状态,等待Server确认。
2、第二次握手
????????Server端检查报文发现SYN为1,知道了Client端想建立连接;Server端将SYN置为1,表示Server端也希望与Clinet端建立连接;Server端将ACK置为1,表示收到了Client端建立连接的请求;Server端将seq初始化为K;Server端将ack置为J+1,这里ack=seq + 1。第二次握手包括服务端确认客户端发来的报文和服务端向客户端发送报文两个过程。
3、第三次握手
????????Client收到报文后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。第三次握手包括客户端确认服务端发来的报文,客户端向服务端发送报文和服务端确认客户端发来的报文三个过程。
四次挥手
????????三次握手是建立TCP连接,四次挥手是断开TCP连接,即客户端和服务端总共要收发4个包才能确定断开连接。 如下图所示:
1、第一次挥手
????????假设客户端主动发起断开请求,客户端向服务端发送报文,报文首部包括FIN=1,这个控制位代表客户端想要断开连接;序列号seq=u,这时客户端进入FIN-WAIT-1(终止等待1)状态,停止发送数据,并等待服务端的确认。
2、第二次挥手
????????服务端收到客户端的报文后发出确认报文,控制位ACK=1;确认号ack=u+1;序列号seq=v;然后服务端就进入CLOSE-WAIT(关闭等待)状态。TCP服务端会告知上层的应用进程来自客户端的连接即将关闭,让应用程序做好相应的准备。此时客户端已经没有数据向服务端发送了,但服务端向客户端发送数据,客户端依然能接收。
3、第三次挥手
????????客户端收到服务器确认报文后,进入FIN-WAIT-2状态。此时服务器再次发送报文,报文首部控制位FIN=1,表示服务端向客户端发送断开连接请求;确认标志ACK=1;确认序号ack=u+1;序号seq=w,然后服务器进入LAST-ACK(最后确认态),等待客户端确认。
4、第四次挥手
????????客户端收到了服务端的断开连接的报文后,必须发出确认报文,标志位ACK=1;确认号ack=w+1;序号seq=u+1;之后客户端就进入了TIME-WAIT(时间等待)状态。注意此时客户端的TCP连接还没有释放,必须经过2*MSL(最长报文段寿命)的时间后,客户端才进入CLOSED状态关闭连接。而服务端只要收到了客户端发送的确认报文后就会进入CLOSED状态关闭服务端连接。当客户端和服务端都进入了CLOSED状态后,客户端和服务端之间的连接才完全断开。
|