TCP建立连接与释放连接过程中的几个问题

TCP为何采用三次握手来建立连接,若采用两次握手可以吗,请说明理由?

  不可以。采用三次握手是为了防止失效的连接请求报文段突然又传送到服务器,从而发生错误。当客户端发出的连接请求报文段由于某些原因没有及时到达服务器,而客户端在等待一段时间后,又重新向服务器发送连接请求,且建立成功,顺序完成数据传输,那么第一次发送的连接请求报文段就称为失效的连接请求报文段。

  考虑这样一种情况,客户端第一次发送的连接请求并没有丢失,而是因为网络问题导致延迟到达服务器,服务器以为是客户端又发起的新连接,于是服务器同意连接,并向客户端发回确认,但是此时客户端不予理会,服务器就一直等待客户端发送数据,导致服务器资源浪费。

 

TCP为何会采用四次挥手来释放连接?

  关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了,但未必你所有的数据都发送给对方了,所以你未必会马上关闭socket,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你没有数据发送给对方了,针对每个FIN报文,都需要ack报文。所以需要四次挥手。

 

为何需要TIME_WAIT状态?

  1. 实现终止TCP全双工连接的可靠性

  假设最终的ACK状态消失,服务器将重新发送最终的FIN。因此客户必须维护状态信息以允许它重发最终的ACK,如果不维护状态信息,它将最终响应以RST,而服务器则把该分节解释成一个错误。如果TCP打算执行所有必要的工作以彻底终止某个连接方向的数据流,那么它必须能够处理连接终止序列四个分节中任何一个分节丢失的情况,也即主动关闭的那一端进入TIME_WAIT状态,因为它可能不得不重新发送最终的ACK。

  2. 允许老的重复分节在网络中消失

  我们假设12.106.32.254端口1500和206.168.112.219端口21之间有一个TCP连接,我们关闭这个连接后,在以后某个时候又建立起相同的IP地址和端口之间的TCP连接。后一个连接称为前一个连接的化身,因为它们的IP地址和端口号是相同的,TCP必须防止来自某个连接的老的重复分组在连接终止后再现,从而被误解成属于同一个连接的化身。要实现这种功能,TCP不能给处于TIME_WAIT状态的连接启动新的化身,既然TIME_WAIT状态的持续时间是2MSL,这就足够让某个方向上的分组存活MSL秒即被丢弃,另一个方向上的应答最多存活MSL秒也被丢弃,通过实施这个规则,我们就能保证当成功建立一个TCP连接时,来自该连接的先前的化身的老重复分组都已在网络中消失了。

  

参考资料:

  1.http://coolshell.cn/articles/11564.html

  2.《王道程序员求职宝典》

  

posted @ 2015-08-19 09:21  vincently  阅读(4226)  评论(0编辑  收藏  举报