三次握手
为什么要三次握手,两次不行吗?
不行。三次握手的目的是为了防止已失效的连接请求报文段突然又传送到了服务端,从而产生错误。例如,客户端发送了两次建立请求,第一次丢失,第二次成功建立,随后通信完成,释放连接。但是,第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放之后才到达服务端,而这时若没有三次握手,便又再次建立连接,而此时没有数据传输,造成资源浪费。
四次挥手
为什么客户端在TIME-WAIT状态必须等待2MSL的时间?
- 保证客户端发送的最后一个ACK报文段能够到达服务端。
- 防止“已失效的连接请求报文段”出现在本连接中。
为什么建立连接需要三次,而断开连接需要四次?
建立连接时,因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,有可能自身还有数据需要传输,所以并不会立即关闭SOCKET,只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。