• TCP状态转换


    TCP状态转换 

    2MSL(Maximum Segment Lifetime)
    主动断开连接的一方, 最后进入一个 TIME_WAIT状态, 这个状态会持续: 2msl

    msl: 官方建议: 2分钟, 实际是30s
    当 TCP 连接主动关闭方接收到被动关闭方发送的 FIN 和最终的 ACK 后,连接的主动关闭方
    必须处于TIME_WAIT 状态并持续 2MSL 时间。
    这样就能够让 TCP 连接的主动关闭方在它发送的 ACK 丢失的情况下重新发送最终的 ACK。
    主动关闭方重新发送的最终 ACK 并不是因为被动关闭方重传了 ACK(它们并不消耗序列号,被动关闭方也不会重传),而是因为被动关闭方重传了它的 FIN。事实上,被动关闭方总是重传 FIN 直到它收到一个最终的 ACK。

    半关闭 

    半关闭
    当 TCP 链接中 A 向 B 发送 FIN 请求关闭,另一端 B 回应 ACK 之后(A 端进入FIN_WAIT_2状态),并没有立即发送 FIN 给 A,A 方处于半连接状态(半开关),此时 A 可以接收 B 发送的数据,但是 A 已经不能再向 B 发送数据。 

     从程序的角度,可以使用 API 来控制实现半连接状态:

    1. #include
    2. int shutdown(int sockfd, int how);
    3. sockfd: 需要关闭的socket的描述符
    4. how: 允许为shutdown操作选择以下几种方式:
    5.         SHUT_RD(0): 关闭sockfd上的读功能,此选项将不允许sockfd进行读操作。该套接字不再接收数据,任何当前在套接字接受缓冲区的数据将被无声的丢弃掉。
    6.         SHUT_WR(1): 关闭sockfd的写功能,此选项将不允许sockfd进行写操作。进程不能在对此套接字发出写操作。
    7.         SHUT_RDWR(2):关闭sockfd的读写功能。相当于调用shutdown两次:首先是以SHUT_RD,然后以SHUT_WR。

    使用 close 中止一个连接,但它只是减少描述符的引用计数,并不直接关闭连接,只有当描述符的引用计数为 0 时才关闭连接。shutdown 不考虑描述符的引用计数,直接关闭描述符。也可选择中止一个方向的连接,只中止读或只中止写。
    注意:
    1. 如果有多个进程共享一个套接字,close 每被调用一次,计数减 1 ,直到计数为 0 时,也就是所用进程都调用了 close,套接字将被释放。
    2. 在多进程中如果一个进程调用了 shutdown(sfd, SHUT_RDWR) 后,其它的进程将无法进行通信。但如果一个进程 close(sfd) 将不会影响到其它进程。

     端口复用

    端口复用最常用的用途是:
    防止服务器重启时之前绑定的端口还未释放
    程序突然退出而系统没有释放端口

     

    1. #include
    2. #include
    3. // 设置套接字的属性(不仅仅能设置端口复用)
    4. int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t
    5. optlen);
    6. 参数:
    7.     - sockfd : 要操作的文件描述符
    8.     - level : 级别 - SOL_SOCKET (端口复用的级别)
    9.     - optname : 选项的名称
    10.       - SO_REUSEADDR
    11.       - SO_REUSEPORT
    12.     - optval : 端口复用的值(整形)
    13.       - 1 : 可以复用
    14.       - 0 : 不可以复用
    15.     - optlen : optval参数的大小
    16. 端口复用,设置的时机是在服务器绑定端口之前。
    17. setsockopt();
    18. bind();
    1. 常看网络相关信息的命令
    2. netstat
    3. 参数:
    4. -a 所有的socket
    5. -p 显示正在使用socket的程序的名称
    6. -n 直接使用IP地址,而不通过域名服务器

     

  • 相关阅读:
    Vue笔记-vue中使用JS创建的函数
    OTN的7层结构
    可灵王炸更新,图生视频、视频续写,最长可达3分钟!Runway 不香了 ...
    关于java中的static关键字
    HTML学生个人网站作业设计成品 HTML+CSS肖战明星人物介绍网页 web结课作业的源码
    爬虫学习日记第七篇(爬取github搜索仓库接口,其实不算爬虫)
    C# - 能否让 SortedSet.RemoveWhere 内传入的委托异步执行
    滴滴时空供需系统的设计和演进
    智能驾驶ADAS算法设计及Prescan仿真(3): 自适应巡航ACC跟车目标选择策略设计与simulink仿真
    状态机动态规划之股票问题总结
  • 原文地址:https://blog.csdn.net/ME_Liao_2022/article/details/133683453