您的位置:首页 > 理论基础 > 计算机网络

[置顶] TCP三次握手与四次挥手调研

2017-06-20 17:21 531 查看
学过网络的人都听过TCP,TCP中的“三次握手”和“四次挥手”可能也是人人都知道,那么到底什么是三次握手和四次挥手以及为什么要三次握手和四次挥手?

一、三次握手

1. 什么是三次握手?

1)首先,发送方主机(客户端)向接收方主机(服务器)发起一个建立连接的同步(SYN)请求;

2)接收方主机(服务器)收到这个请求后向发送方主机(客户端)回复一个同步/确认(SYN/ACK)问答;

3)发送方主机(客户端)收到此包后再向接收方主机(服务器)发送一个确认(ACK);

如下图是我在网上找的关于三次握手的过程:



或者



2.为什么要三次握手?

假设不是三次握手,那么只有服务器发出确认,新的一个连接就建立了。由于现在客户端并没有发出建立连接的请求,因此它不会理睬服务器的确认,也就不会向服务器发生ACK。

但是这是服务器以为新的运输连接以及建好了,并一直等待客户端发来数据……,这样服务器的资源就被浪费了。而三次握手可以防止此类事情的发生。

当客户端不会向服务器的确认发出确认,服务器就收不到确认,那么就知道客户端并没有要求建立连接;

这样的目的是:即为了防止已失效的连接请求报文段突然又传送到了服务器,因而产生错误。

二、四次挥手

1.什么是四次挥手?

1)发送方发出关闭连接的请求;

2)接收方发出应答发送方的关闭连接请求;

3)接收方发出向发送方发送关闭连接请求;

4)发送方发出应答接收方的关闭连接的请求;

2. 为什么要四次挥手?

因为TCP有个半关闭状态,假如客户端和服务器要释放连接,那么客户端发送一个释放连接报文给服务器,服务器收到这个报文后发送确认,此时客户端不发送数据,但是服务器如果发送数据客户端还是会接收,这就是半关闭。然后服务器还有发给客户端连接释放报文,然后客户端发确认,所以是四次挥手。

下图是我在网上找的关于四次挥手图解:



或者



三、对TIME_WAIT状态的理解

主动断开链接的一方为什么要进入TIME_WAIT状态(TIME_WAIT状态存在的理由)?

通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态。客户端主动关闭连接时,会发送最后一个ack后,然后会进入TIME_WAIT状态,再停留2个MSL时间(后有MSL的解释),进入CLOSED状态。

TCP/IP协议就是这样设计的,是不可避免的。主要有以下两个原因:

1)可靠地实现TCP全双工连接的终止

TCP协议在关闭连接的四次挥手过程中,最终的ACK是由主动关闭连接的一端(后面统称A端)发出的,如果这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,因此A端必须维护状态信息(TIME_WAIT)允许它重发最终的ACK。如果A端不维持TIME_WAIT状态,而是处于CLOSED 状态,那么A端将响应RST分节,B端收到后将此分节解释成一个错误。

因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢失情况,主动关闭连接的A端必须维持TIME_WAIT状态 。

2)允许老的重复分节在网络中消逝

TCP分节可能由于路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能会引起问题。在关闭“前一个连接”之后,马上又重新建立起一个相同的IP和端口之间的“新连接”,“前一个连接”的迷途重复分组在“前一个连接”终止后到达,而被“新连接”收到了。为了避免这个情况,TCP协议不允许处于TIME_WAIT状态的连接启动一个新的可用连接,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个新TCP连接的时候,来自旧连接重复分组已经在网络中消逝。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: