• tcp四次挥手


    在讲解tcp四次挥手之前我们也先来认识一下tcp首部中的某些字段:

    ACK:只有该字段置1时ack(确认号)才有效

    FIN:当该字段置1时用于请求释放连接

    seq:序列号,表示该报文段的序号

    ack:确认号,表示希望收到的下一个报文段,并且该报文段以前的报文已经收到

    四次挥手

    先来讲解一下大体的一个过程:(以客户端先主动释放连接为例)

    一、 客户端释放连接,客户端进入FIN-WAIT1状态

    二、 服务端收到tcp报文段,并发出确认 服务端进入CLOSE-WAIT状态

    客户端收到确认后进入FIN-WAIT2状态。

    这两个步骤完成后该tcp进入半关闭状态,即客户端到服务端的连接已经关闭,但有可能服务端需要向客户端发送数据,所以有可能需要等待服务端继续发送数据

    三、 服务端释放连接 服务端进入LAST-ACK状态

    四、 客户端收到该报文段,发出确认,客户端进入TIME-WAIT状态,在经过2MSL(最长报文段寿命)时间后进入CLOSED状态

    服务端收到确认报文后也进入COISED状态。

    为什么最后客户端需要等待2MSL的时间,原因有两个:

    一、 保证客户端最后发送的确认报文段可以被服务端收到,使服务端顺利进入CLOSED状态。因为最后客户端发出的确认请求报文可能不能到达服务端,而2MLS的时间可以保证服务端重发释放连接的报文可以到达客户端,这样才能保证客户端确认报文一定可以到达服务端。

    二、 防止已失效的连接请求报文。

    2MLS时间可以让本报文段所产生的所有报文都从网络中消失。

    具体过程:

    一、 客户端将tcp头部 FIN置1,seq=u(u等于前面发送报文段序号+1),向服务端发送该报文,客户端进入FIN-WAIT1状态

    二、 接收到客户端的报文后,将tcp头部ACK置1, ack=u+1,seq=v(v等于前面发送报文段序号+1),服务端进入CLOSE-WAIT状态

    客户端收到确认报文后进入FIN-WAIT2状态,整个tcp连接进入半关闭状态

                 

    中间可能服务端依然向客户端发送数据

    三、 服务端数据发送完成后,将tc头部FIN置1,seq=w(w等于v加上中间向服务端发送的数据),ack=u+1(这里需要注意),发送该报文段,服务端进入LAST-ACK状态

    四、 客户端收到服务端报文后,将tcp头部ACK置1,ack=w+1,seq=u+1,发送该报文后客户端进入TIME-WAIT状态,再等待2MSL时间后进入到CLOSED状态。

    服务端收到确认后也进入到CLOSED状态。

    心有多大,天有多高,一起奋斗!!
  • 相关阅读:
    关于MATLAB处理大数据坐标文件2017527
    关于MATLAB处理大数据坐标文件2017526
    关于MATLAB处理大数据坐标文件
    Python入门(2)
    Python入门
    [leetcode] 349. Intersection of Two Arrays 解题报告
    [leetcode] 283. Move Zeroes 解题报告
    [leetcode] 389. Find the Difference 解题报告
    [leetcode] 104. Maximum Depth of Binary Tree
    [leetcode] 258. Add Digits
  • 原文地址:https://www.cnblogs.com/zhaolei1996/p/10738501.html
Copyright © 2020-2023  润新知