三次握手和四次断开都是为了确保网络连接的可靠性和稳定性。
客户端(A)和服务端(B)三次握手:
第一次握手是在A向B传输数据之前由A向B发送一个请求建立连接的报文--SYN(SYN=1),并选择一个序列号(seq)(假设seq=n)一并发送给B。
第二次握手是当B收到A的请求后向A回复一个确认收到的报文--ACK,此时ACK=1。并且一同发送SYN=1和确认号n+1以及自己的序列号seq(假设seq=m)。
此时我们能确定B可以收到A的请求,也可以向A发送请求。但是只知道A可以向B发送请求,不知道A能否收到B的请求,所以还需要第三次握手,来确认A可以收到B的请求。
第三次握手是当A收到B的确认包(ACK)和请求包(SYN)后,向B发送确认包ACK=1,确认号为m+1,序列号为n+1。
当B收到A的确认包后,A与B建立连接,可以开始传输数据。
客户端(A)和服务端(B)四次断开:
第一次断开是当A向B完成数据的传输后,A会向B发送请求释放的报文FIN=1,并附有序列号seq(假设seq=x)。此时A进入“等待状态1”等待B的确认。
第二次断开是当B收到A的释放报文后,会向A发送ACK确认报文,确认号为x+1。
当A收到B的确认后,进入“等待状态2”此状态TCP为半关闭状态,B可以向A发送数据,但是A不能向B发送数据。此状态是为了将B要给未发送完的数据全部发送给A。
第三次断开是在B将要发送的数据全部发送给A后,在向A发送一个请求释放报文FIN=1,并附带序列号seq(假设seq=y)。
第四次断开是A在收到B的请求释放报文后,向B发送确认报文ACK=1,确认号为y+1。并进入“时间等待”等待2MSL(此时间为报文存活的最大时间)。当B收到A的确认报文后,B释放连接。当B释放连接后,A释放连接。
等待2MSL是因为,A所发出的确认报文,有可能因为网络出现问题或者其他原因而丢包。若2MSL结束后B未能断开连接,则A会继续向B发送确认报文,A等待2MSL就是为了处理这种情况的发生。