Tcp 3 Way and 4 Way handshake

在 Github 上修改

TCP三次握手

TCP是一个面向连接的的协议,所以无论哪一方发送数据之前都必须要建立连接。三次握手是TCP/IP网络中用于在本地主机/客户端和服务器之间创建连接的方法。这是一种三步方法,要求客户机和服务器在实际数据通信开始之前交换SYN和ACK(确认)数据包。 要建立连接,将发生三次握手:

1.SYN:主动打开由客户机向服务器发送syn来执行。客户机将段的序列号(SEQ)设置为随机值A。
2.SYN-ACK:作为响应,服务器用SYN-ACK进行响应。确认号被设置为比接收到的序列号多一个,即A+1,服务器为数据包选择的序列号是另一个随机数B。
3.最后,客户机将一个ACK发送回服务器。序列号设置为接收到的确认值,即A+1,确认号设置为接收到的序列号(即B+1)的一个以上。

此时,客户机和服务器都已收到连接确认。步骤1、2建立一个方向的连接参数(序列号),并确认。步骤2、3为另一个方向建立连接参数(序列号),并确认。通过这些,建立了全双工通信。
TCP 3-way and 4-way handshake

TCP四次挥手

TCP的关闭是四次,也就是说需要双方都发送FIN告知对方我要关闭了,并回复FIN-ACK。所以在一方关闭的时候另一方还可以发送数据,我们把这种现象称为TCP半关闭。当然主动方发起方也可以选择不接受。TCP四次挥手:

1.FIN:主动打开方通知向被动方发送FIN,告知被动方我已经完成数据发送要关闭连接了。自己进入FIN_WAIT1
2.ACK:服务器收到对方FIN并回复ACK告知我已收到(这里不像建立连接一样,把ACK和自己的FIN一起发送是因为自己有可能还没完成数据的传输)自己可以继续进行未完成的数据传输并把状态设置成CLOSE_WAIT,对方收到ACK把自己的状态变成FIN_WAIT2并继续等待被动方的FIN
3.FIN:服务端数据传输完成后向主动打开方发送发送FIN,等待对方的ACK,被动关闭的一方进入LAST_ACK状态
4.ACK:主动方收到被动方发送的FIN,回复ACK

此时,主动方进入到TIME_WAIT状态然后等待2MSL(Maximum segment lifetime 它是任何报文段被丢弃前在网络内的最长时间)后进入到CLOSED关闭,被动方收到ACK后进入到CLOSED。因为网络环境是复杂多变的,有可能自己的最后一个ACK丢失导致对方重传FIN。所以主动发起方要等待2MSL来预防对方重传
最后附上一副TCP状态机,可以参考TCP/IP illustrated Vol. 1 第18章(强烈推荐英文版,如果英文不好可以买本中文的参考着看) TCP state machine