当前位置:   article > 正文

TCP三次握手,四次挥手_三次握手如何去除重复数据

三次握手如何去除重复数据

三次握手

  1. 第一次握手:客户端将标志位SYN置为1,随机发送一个值seq=x,并将该数据包发送个服务端,客户端进入SYN_SENT状态,等待服务端确认。
  2. 第二次握手:服务端收到收据包后由标志位SYN=1,ACK=0知道客户端请求建立连接,服务端将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送个客户端以确认连接请求,服务端进入SYN_RCVD状态。
  3. 第三次握手:客户端收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给服务端,服务端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务端进入ESTABLISHED状态,完成三次握手,随后客户端与服务端之间可以开始传输数据了。此时客户端和服务端都进入Establish状态。

为什么需要三次握手,两次不行吗?

为了避免重复连接,例如在比较复杂的网络环境中,客户端有可能会重复发送了解请求,如果设计成两次握手,那么服务端只能接受请求,造成重复连接。如果是三次握手,客户端在接收到服务端SEQ+1的返回消息之后,就会知道这个连接是历史连接,所以会发送报文给服务端,告诉服务端。

半连接队列

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

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

ISN(Initial Sequence Number)是固定的吗

三次握手的其中一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。如果 ISN 是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的。

三次握手过程中可以携带数据吗

其实第三次握手的时候,是可以携带数据的。但是,第一次、第二次握手不可以携带数据,第一次握手不可以放数据,其中一个简单的原因就是会让服务器更加容易受到攻击了。而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据也没啥毛病。

四次挥手

  1. 第一次挥手,客户端将FIN标志位设置为1,随机发送seq=u,并将此数据包发送给服务端,此时,客户端进入FIN_WAIT_1状态,表示客户端没有数据要发送给服务端了。
  2. 第二次挥手,服务端收到数据包后由标志位FIN=1知道客户端请求断开连接,服务端将ACK标志位设置为1,发送seq=v,ack=u+1,并将改数据包发送给客户端,此时服务端进入CLOSE-WAIT状态。
  3. 第三次挥手,服务端向客户端发送FIN报文段,请求关闭连接,同时服务端进入LAST_ACK状态
  4. 第四次挥手,客户端收收到服务端发送的FIN报文段后,向服务端发送ACK报文段,然后客户端进入TIME_WAIT状态,服务端收到客户端的ACK报文段以后,就关闭连接。此时,客户端等待2MSL(只一个片段在网络中最大的存活时间)后依然没有收到回复,则说明服务端已经正常关闭,这样客户端就可以关闭连接了

为什么要四次挥手?

客户端发送了FIN连接释放报文之后,服务器收到了这个报文,就进入了CLOSE_WAIT状态。这个状态是为了让服务端发送还未传送完毕的数据,传送完毕之后,服务端会发送FIN连接释放报文。

为什么 TIME-WAIT 状态必须等待 2MSL 的时间呢

MSL,Maximum Segment Lifetime,最大报文段生存时间。即任何TCP报文在网络中存在的最大时长,如果超过这个时间,这个TCP报文就会被丢弃。
2MSL,即两个最大报文段生存时间。
TIME_WAIT状态为什么是2MSL的时长?因为客户端不知道服务端是否能收到ACK应答数据包,服务端如果没有收到ACK,会进行重传FIN,考虑最坏的一种情况:第四次挥手的ACK包的最大生存时长(MSL)+服务端重传的FIN包的最大生存时长(MSL)=2MSL

TCP 协议是如何保证可靠传输的

1. 数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时 TCP 发送数据端超时后会重发数据;

2. 对失序数据包重排序:既然 TCP 报文段作为 IP 数据报来传输,而 IP 数据报的到达可能会失序,因此 TCP 报文段的到达也可能会失序。TCP 将对失序数据进行重新排序,然后才交给应用层;

3. 丢弃重复数据:对于重复数据,能够丢弃重复数据;

4. 应答机制:当 TCP 收到发自 TCP 连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;

5. 超时重发:当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;

6. 流量控制:TCP 连接的每一方都有固定大小的缓冲空间。TCP 的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP 使用的流量控制协议是可变大小的滑动窗口协议。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/148906
推荐阅读
相关标签
  

闽ICP备14008679号