TCP三次挥手与四次挥手

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GreatDistance/article/details/89302979

TCP三次握手过程

    刚开始客户端处于CLOSED的状态,服务端处于LISTEN状态。

    1、第一次握手:客户端给服务端发一个SYN (Synchronize Sequence Numbers)报文,并指明客户端的初始化序列号ISN(seq)。此时客户端处于SYN_SEND状态。

    2、第二次握手:服务端收到客户端的SYN报文之后,会以自己的SYN报文作为应答,并且也是指定了自己的初始化序列号ISN,同时会把客户端的ISN+1作为ACK(确认号)的值,表示自己收到了客户端的SYN,此时服务端处于SYN_RCVD的状态。

    3、第三次握手:客户端收到服务端发来的SYN报文后,会发一个ACK报文,也是把服务端的ISN+1作为ACK的值,表示自己收到了服务端的SYN报文,此时客户端处于ESTABLISED状态。

    4、服务端收到客户端发来的ACK报文后,服务端也处于ESTABLISED 状态。双方建立连接。

整个流程如图所示:

                                          图 1 TCP三次握手过程

一、为什么需要三次握手,两次不可吗?

1、第一次握手:客户端给服务端发送网络包,服务端收到了。这样服务端就知道,客户端的发送能力与自己的接收能力是正常的。

扫描二维码关注公众号,回复: 5968412 查看本文章

2、第二次握手:服务端给客户端发送网络包,客户端收到了。这样客户端就知道服务端的接收与发送能力是正常的,自己的接收与发送能力是正常的。但是现在服务端还不不能确定客户端的接收能力是否正常。

3、第三次握手: 客户端给服务端发送网络包,服务端收到了。这样服务端就知道了客户端的接收与发送能力都正常,服务端的接收与发送能力都正常。

因此需要三次握手才能确认客户端与服务端的接收与收发能力是否正常。而两次握手并不能确认双方的接收与发送能力是否正常。

二、三次握手的作用

1、确认双方的接收能力、发送能力是否正常。

2、指定自己的初始化序列号,为后面的可靠传输做准备。

三、半连接队列与全连接队列

服务端第一次收到客户端的SYN报文之后就会处于SYN_RCVD状态,此时双方还未完全建立起连接,服务端会把此种状态下的请求连接放在一个队列,这种队列称之为半连接队列。

已经完成三次握手,建立起连接的服务端会放在一个队列,这种队列称之为全连接队列。


 

TCP四次挥手

刚开始双方都处于ESTABLISED状态。假设是客户端发起断开请求

  1. 第一次挥手:客户端发送一个FIN报文,报文中会指定一个序列号,此时客户端处于FIN-WAIT-1状态。
  2. 第二次挥手:服务端收到FIN后,会发送ACK报文,客户端的序列号值+1作为ACK的值,表明收到了客户端的报文了,此时服务端处于CLOSED-WAIT状态。如果客户端收到了服务端发来的报文客户端就进入FIN-WAIT-2状态。等待服务端发出连接释放报文段。
  3. 第三次挥手:服务端给客户端发送FIN报文,并且指定一个序列号。此时服务端处于LAST-ACK状态。
  4. 第四次挥手:客户端收到FIN后,会发送一个ACK报文作为应答,此时客户端处于TIME-WAIT状态。需要过一段时间以确保服务端收到自己的ACK报文之后才会进入CLOSED状态。
  5. 服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。

四次挥手的过程:

                                     图 2 TCP四次挥手过程

一、为什么客户端收到服务端发来的FIN后不立即进入CLOSED状态,而需要等待一段时间后才进入CLOSED状态。

要确保服务器是否已经收到了我们的 ACK 报文,如果没有收到的话,服务器会重新发 FIN 报文给客户端,客户端再次收到 FIN 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK 报文。

至于 TIME_WAIT 持续的时间至少是一个报文的来回时间。一般会设置一个计时,如果过了这个计时没有再次收到 FIN 报文,则代表对方成功就是 ACK 报文,此时处于 CLOSED 状态。

猜你喜欢

转载自blog.csdn.net/GreatDistance/article/details/89302979
今日推荐