正常情况,TCP要经历三次握手建立连接,四次挥手断开连接
三次握手
第一次握手:主机A向主机B发起连接(SYN),主机B在收到SYN后,确认自己的接收能力没有问题 第二次握手:主机B返回一个ACK(应答消息)+SYN给主机A,主机A在收到主机B的SYN和ACK后,知道自己的发送能力和接收能力没有问题 第三次握手:主机A向主机B发送ACK,主机B收到ACK之后确认自己的发送能力没有问题,连接成功
问题: 三次握手必须是三次吗,能四次吗?两次呢?
不一定是三次,可以四次握手,但没必要,将主机B的ACK和SYN分开发送,但是这样会使网络开销增大。两次不行,三次握手的一部分目的是为了彼此双方的发送能力和接收能力都正常,两次的话就无法知道主机B的发送能力,所以不行。
四次挥手
第一次挥手:主机A向主机B发送结束报文段FIN,请求断开连接 第二次挥手:主机B在接收到FIN后,操作系统内核会返回一个ACK给主机A,表示收到请求 第三次挥手:主机B向主机A发送一个FIN,也请求断开连接 第四次挥手:主机A收到主机B的FIN后,回复一个ACK,表示收到请求,主机B收到ACK后彻底断开连接
问题: 四次挥手能不能三次挥手?为什么?
不一定 不能:ACK是由操作系统内核控制的,在收到FIN时,就会回复ACK,FIN是由应用程序控制的,在程序中执行close()时触发FIN发送,二者不在同一时机发送,所以不行。 能:当程序中调用close()时间和操作系统内核发送ACK时间错差不大时,就会触发TCP的”延时应答+捎带应答“机制。
TCP协议状态
1.ESTABLISHED连接成功,可以进行后续通信。 2.LISTEN服务器端进入的状态,服务器准备就绪,允许客户端随时来建立连接 3.CLOSE_WAIT断开连接的中间状态,一般出现在收到FIN,返回ACK到发送FIN这个时间里 4.TIME_WAIT断开连接的状态(谁先断开连接,谁进入TIME_WAIT),防止最后一个ACK丢包,当ACK发送完之后,并不会立刻就销毁连接,而是以TIME_WAIT状态,等待一定时间
|