• 【计算机网络】TCP连接建立和释放


    TCP连接的建立:

     (1)B的TCP服务器进程首先创建传输控制块TCB,准备接受客户进程的连接请求。

    然后服务器进程处于LISTEN状态,等待客户的连接请求。

    (2)A的TCP进程首先创建传输控制块TCB,然后在打算建立TCP连接时,向B发出连接请求报文段,首部的同步位SYN=1。首部的同步位SYN=1,同时选择一个初始序号seq=x。

    TCP规定,SYN报文段不能携带数据,但是要消耗掉一个序号。

    客户端进入SYN-SENT状态

    (3)客户端收到B的确认后,还要向B给出确认。

    确认报文段ACK=1,确认号ack=x+1

    同时发送SYN=1,seq=y

    TCP服务器进入SYN-RCVD状态。

    (4)TCP客户进程收到B的确认后,还要向B给出确认。

    确认报文段ACK=1,ack=y+1

    seq=x+1。如果不携带数据则不消耗序号。

    A进入ESTABLISHED状态

    (5)B收到A的确认后进入ESTABLISHED状态

    TCP连接的释放:

    (1)A应用进程向TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接。

    A把连接释放报文段首部的终止控制位FIN置1,序号seq=u,等于前面已传送过的数据的最后一个字节的序号加1。

    A进入FIN-WAIT-1状态,等待B确认。

    FIN报文段即使不携带数据,也消耗掉一个序号。

    (2)B收到连接释放报文段后发出确认

    ACK=1,ack=u+1,seq=v

    TCP服务器处于半关闭状态。从B到A方向的连接并未关闭。

    (3)A收到来自B的确认后进入FIN-WAIT-2状态,等待B发出的连接释放报文

    (4)如果B已经没有要向A发送的数据,B发出连接释放报文。

    FIN=1,B必须重复上次已发送过的确认号ack=u+1,seq=w(在半关闭状态B又可能发送了一些数据)

    B进入LAST-ACK状态,等待A的确认

    (5)A收到B的连接释放报文后发送确认

    ACK=1,ack=w+1,seq=u+1

    TCP连接没有立即释放掉,必须经过时间等待计时器设置的时间2MSL后,A才进入到CLOSED状态。MSL叫最长报文段寿命。

    (1)为了保证A发送的最后一个ACK报文段能够到达B

    (2)A发送完最后一个ACK报文段后,再经过2MSL,就可以是本连接持续的时间内所产生的所有报文段都从网络上消失

     

    wireshark三次握手实验:

    三次握手:

    SYN标志位为0x002,Sequence号为558864304,ack=0

    SYN=1,ACK=1,ack=558864305,为上一个报文的seq+1。

    ack=2249409165为上一个报文的seq+1,ACK=1。连接建立。

  • 相关阅读:
    微信小程序中使用vant组件
    【postgresql】CentOS7 安装Pgweb
    100天精通Oracle-实战系列(第21天)Oracle 数据泵常用参数和命令
    【论文阅读】时序动作检测系列论文精读(2020年)
    opencv重点知识
    联盟 | SHOPYY 与 HelpLook 达成战略合作,携手助力独立站卖家快速增长!
    Spring Boot 加载本地 JAR 包的技术实践
    EasyExcel的使用
    LeetCode简单题之数组能形成多少数对
    【性能测试】初识 Jmeter 中的 BeanShell
  • 原文地址:https://blog.csdn.net/m0_52043808/article/details/127829291