TCP(Transmission Control Protocol,传输控制协议),它是一种面向连接的、可靠的、全双工、基于字节流的传输层通信协议。
传输层接收应用层传过来的字节流数据,将这些数据进行分段打包,以TCP报文的形式传给网络层,由IP协议承载这些TCP报文。
三次握手(Three-way Handshake)和四次挥手(Four-way Handshake)都是基于TCP报文创建和关闭的连接。
TCP报文:
源端口号(Source Port):发送端报文的端口号,标识发送源端口以。
目的端口号(Destination Port):接收端目的端口号,标识接收目的端口。
*注意:TCP报文中的源端口号和目的端口号同IP数据报中的源IP和目的IP,建立了网络中唯一的一条连接。
序号(Sequence Number):当前报文的序号,在一次数据传送过程中(一次数据传输可能有多个TCP报文,序号一般为当前报文数据的第一个字节的序列号,这个序列号在一次数据传送过程中是唯一的。在建立连接和关闭连接时序号是随机值)是唯一的。
确认序号(Acknowledgment Number):确认收到报文,并标识下一个希望收到的报文(建立连接和关闭理解时由于不携带数据,确认序号为 发送方报文序号+1 ,当传送数据时,确认序号为: 发送方报文序号+偏移量(多少字节的数据))
控制位:(0|1)
ACK:确认位,当为1时,确认序号才有效。
SYN : 同步位,指的是要求同步自己的序号,即请求连接。
FIN:结束位,指当前方数据已经发送完毕,没有数据可以发送了,要求关闭连接。
三次握手(Three-way Handshake)
三次握手指的是在需要建立连接的时候,需要双方发送三个TCP报文才能确认连接,如下图:
*大写表示控制位,小写表示序号。
第一次握手:由主动方发送SYN报文。表示请求建立连接,初始自己的序号X(这个序号是随机值)。
第二次握手:被动方接收到SYN报文,如果在可连接的情况下,发送SYN+ACK报文(表示接受到主动方的报文,并需要同步自己的序号),初始自己的序号Y(随机值),并将确认序号设置为X+1,表示希望收到下一个报文的序号。
第三次握手:主动方收到被动方的SYN+ACK报文,ACK=1且ack=X+1表示被动方已经确认主动方可以建立连接。然后主动方发送ACK报文,序号为X+1,确认序号为Y+1。当被动方收到这个报文的时候,ACK=1且ack=Y+1,表示主动方已经确认被动方可以建立连接。这个时候双方都已经确认可以建立连接,于是连接就由此建立。
三次握手实际上就是一次:请求→确认+请求→确认。
四次挥手(Four-way Handshake)
四次挥手指的是在需要建立连接的时候,需要双方发送四个TCP报文才能确认连接,如下图:
第一次挥手:主动方发送FIN报文,表示主动方的数据发送完了,已经没有数据可以发送了。初始序号为X。
第二次挥手:被动方接收到主动方的FIN报文,如果确认接收完毕,发送ACK报文,表示确认数据接收完毕。初始序号为Y,去人序号为X+1(这次ack表示确认)
*这个时候主动方接收到被动的ACK报文后并不会发送报文,需要被动方发送FIN报文后才能够发送ACK报文。
第三次挥手:当被动方没有数据可发送的时候,被动方发送FIN+ACK报文,并重设自己的序号为Z,表示和第二次挥手不是同一个报文,ack设为X+1(这次ACK表示希望收到的报文序号)
第四次挥手:当主动方接收到被动方的FIN+ACK报文后,确认自己已经完全接收数据以后发送ACK报文(序号为X+1 确认序号为Z+1)。当被动端接到这个ACK报文后,确认主动端也接收数据完毕。这个时候,确认双方都已经发送和接收数据完毕,连接就可以断开了。
四次挥手实际就是:请求→确认 请求→确认。
为什么连接三次、断开四次?
在连接时是没有在传送和接收数据的,SYN和ACK报文可以同时发送。在断开连接时,主动端发送FIN报文表示没有数据可以发送了,但可以接收数据。被动端接收到FIN报文后,先确认自己接收数据完了,但有可能自己的数据还没有发送完,所以先发送一个ACK报文,确认自己已经接收完了。等到自己的数据发送完之后,再发送FIN报文,表示被动端已经没有数据可以发送了,主动端接收到FIN报文后,确认已经接受完数据,就返回ACK报文,确认被动端也可以关闭连接了。