网络TCP建立连接为什么需要三次握手而结束要四次
A是客户端,B是服务器。
- 三次握手
第一个数据报只有同步位SYN
第二个数据报有同步位SYN和确认位ACK
-
第三个数据报只有确认位ACK
前两个数据报应该没有疑问,但是为什么会有第三个数据报呢?主要是为了防止“已失效的连接请求报文段”。考虑这样一种情况,A发送的第一个连接请求数据报在某个网络结点滞留了,因此A发送第二个连接请求数据报,然后正常释放连接。但是滞留的报文段最后又再次到达了B,这时B发送确认数据报,如果不需要第三个数据报,B就认为连接已经建立了,但是A并没有发送建立连接的请求,因此对B的请求不予理睬。但是B却以为新的运输连接已经建立了,并一直等待A发来的数据。B的许多资源就这样白白浪费了。
- 四次挥手
第一个数据有只有FIN位
第二个数据报只有ACK位
第三个数据报有FIN位和确认位
-
第四个数据报只有ACK
其实TCP可靠传输的实现,还是基于滑动窗口机制,对于A发送的数据报,B都会再发送给A一个确认的数据报,即数据报总会是成对出现的。B发送第二个数据报之后,A到B这个方向的连接就释放了,A就不能向B发送数据报了,但是A可以接收数据报。B把要发送的数据发送完之后,发送第三个带FIN位的数据报,而且第三个数据报和第四个数据报一定是要成对的。因为如果只发送第三个数据报,B就认为连接释放了,第三个数据报如果丢包了,A就会一直保持接听的状态,但是B不会再发送FIN了,所以A就会一直阻塞下去。只有B接收了A发送的第四个数据报,才会认为A收到了第三个数据报,此时结束LAST-ACK阶段。同样的,A也会有TIME-WAIT这个阶段,来确保B收到第四个数据报。