• 3、TCP状态


    TCP状态

    1、TCP通信时序

    在这里插入图片描述

    三次握手成功后,服务器和客户端进入了状态ESTABLISHED

    当处于Time_WAIT状态后,不会马上变成CLOSE状态,会经历2MSL(约40秒),之后才会进入CLOSE状态。

    总结:

    主动发起请求连接端:

    发送SIN
    接收ACK\SYN
    发送ACK
    即为
    CLOSE
    SYN_SENT
    SYN_SEND1
    ESTABLISHED
    数据通信状态

    主动关闭连接请求端:

    发送SIN
    接收ACK
    接收FIN
    发送ACK
    ESTABLISHED
    FIN_WAIT1
    半关闭
    TIME_WAIT
    2MSL
    CLOSE

    主动端只有发出信号或接收ACK状态才会发生变化

    被动接收连接请求端:

    程序启动
    接收SYN
    发送SYN和ACK
    接收ACK
    CLOSE
    LISTEN
    SYN_RCVD
    ESTABLISHED

    如果没有收到ACK应答,就会抑制发送SYN_RCVD状态

    被动端关闭连接:

    接收FIN
    发送ACK
    发送FIN
    接收ACK
    ESTABLISHED
    CLSOE_WAIT
    LAST_ACK
    CLOSE

    被动端直接进入CLOSE,不需要2MSL等待时间

    2MSL时长存在的意义:

    ​ 保证最后一个ACK能够被对端接收,如果在等待期间对端没收到我发的ACK,对端会再次发送FIN请求。其只会出现在主动连接请求端。

    2、端口复用

    ​ 当服务器进入2MSL时,客户端不能在绑定服务器了。此时需要用端口复用,让客户端可以在2MSL绑定服务器。

    setsockopt:设置端口选择。

    setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optname);
    /*
    int opt = 1;//设置端口复用
    int opt = 0;//设置端口不可复用
    optname:
    SO_REUSEADDR 重用本地地址
    SO_REUSEPORT 重用本地端口
    setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,(void *)&opt,sizeof(opt));
    返回值:
    成功为0;
    失败为1;
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    ​ 这行代码的作用是启动端口复用,跳过2MSL。

    ​ 这行代码应该插入到bind之前。

    3、半关闭总结

    ​ 通信双方中,只有一端关闭通信 。 FIN_WAIT_2

    close(cfd);
    shutdown(int sockfd, int how);//特殊的半关闭,只关闭读缓冲或者写缓冲或者都关。
    //SHUT_WR SHUT_RD SHUT_RDWR
    //shutdown在关闭多个文件描述符应用的文件时,采用全关闭方法,而close只关闭一个
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    # Go学习-Day10
    git常用命令
    泰裤辣!!!手摸手教学,如何训练一个你的专属AI歌姬~
    华为设备NAC配置命令
    ssm基于BS架构的校园爱心捐赠与物品交换平台的设计与实现毕业设计源码
    计算机毕业设计(附源码)python中小学在线考试系统
    高效IO模型
    如何通过进程启动来分析和解决EasyCVR内核端口报错问题?
    【计算机网络Part 1】概述+物理层
    剑指offer 46. 把数组排成最小的数
  • 原文地址:https://blog.csdn.net/misikamikirto/article/details/133761153