详谈三次握手与四次挥手

作者:爱塔居

专栏:计算机网络

作者简介:大三学生,希望和大家一起进步

详谈三次握手与四次挥手_第1张图片

一、三次握手

详谈三次握手与四次挥手_第2张图片

 经过三次的对话,这两个火柴人才确认了双方都能够说话,都能听见。三次握手也是一样的,只要这样才能确认双方的接受与发送能力是否正常。

详谈三次握手与四次挥手_第3张图片

 1.第一次握手:客户端给服务器发一个SYN报文,并指明客户端的初始化序列号ISN(c)。此时,客户端处于SYN_Send状态

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

3.第四次握手:客户端收到SYN报文之后,会发送一个ACK报文,也是将服务器的ISN+1作为ACK的值,表示已经收到了服务端的SYN报文,此时客户端处于establised状态。

4.服务器收到ACK报文之后,也处于setablised状态,双方建立连接。

 【注意】

1.ISN是动态生成的。

三次握手的一个重要功能便是客户端和服务端交换ISN,以便于对方知道接下来接受数据的时候,如何按序列号组装数据。如果ISN是固定的,攻击者就会很容易就猜出后续的确认号。

2.半连接序列和全连接序列

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

全连接序列就是已经完成三次握手,建立起连接的就会放在全连接队列。如果队列满了,就可能会出现丢包的现象。

3.携带数据

第一次、第二次握手不能携带数据,第三层握手可以携带数据。

如果第一次握手能携带数据,如果有人恶意攻击服务器,每次在第一次握手中的SYN报文中放入大量的数据,因为攻击者不理会服务器的接受、发送能力是否正常,疯狂重复发送SYN报文,就会使服务器花费很多时间、内存空间来接受这些报文。当第三次的时候,对于客户端,已经建立连接了,接受、发送能力也正常,所以就能携带数据。

4.出现差错的情况

两种情况:

①丢包

详谈三次握手与四次挥手_第4张图片

主机A发送数据给B之后,可能因为网络拥堵等原因,数据无法到达主机B;

如果主机A在一个特定时间间隔内没有收到B发来的确认应答,就会进行重发。 

 ②ACK丢失了

详谈三次握手与四次挥手_第5张图片

没有接收到确认应答,会重新发送的机制,会使一方收到很多重复的数据。TCP协议需要能够识别出那些包是重复的,并且把重复的包丢弃掉。利用前面的序列号,就能很容易做到去重的效果。

确认超时重传的时间:

超时时间的长短会受网络环境的影响,太长会影响整体重传效率,太短,会频繁发送重复的包。

TCP为了保证无论在任何环境下都能比较高性能的通信,会动态计算这个最大超时时间。

二、四次挥手

详谈三次握手与四次挥手_第6张图片

 接下来,让我们详细介绍四次挥手的具体过程。

详谈三次握手与四次挥手_第7张图片

刚开始,双方都处于establised状态,假如是客户端先发起关闭请求,则:

1.第一次挥手:客户端发送一个FIN报文,报文中会指定一个序列号。此时客户端处于CLOSED_WAIT1状态

2.第二次挥手:服务端收到FIN之后,会发送ACK报文,且把客户端的序列号值+1作为ACK报文的序列号值,表明已经收到客户端的报文,此时服务器处于CLOSE_WAIT2状态。

3.第三次挥手:如果服务器也想断开连接了,和服务端第一次挥手一样,发送FIN报文,并指定一个序列号,ishi服务端处于LAST_ACK状态

4.第四次挥手:客户端收到FIN之后,一样发送一个ACK报文作为应答,且把服务端的序列号值+1作为ACK报文的序列号值,此时客户端处于TIME_WAIT状态。需要过一阵子以确保服务端收到自己的ACK报文之后,才会进入CLOSED状态。

5.服务端收到ACK报文之后,就关闭连接,处于CLOSED状态。

详谈三次握手与四次挥手_第8张图片

 【注意】

TIME_WAIT状态是面试的重点。

为什么客户端发送ACK之后,不直接关闭,而是等一阵子才关闭?因为要确保服务器是否已经收到了我们的ACK报文,如果没有收到的话,服务器会重新发FIN报文给客户端,客户端再次收到FIN报文之后,就知道之前的ACK报文丢失了,就会再次发送ACK报文。

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

你可能感兴趣的:(计算机网络,网络)