4.23 TCP状态转换 4.24半关闭、端口复用

4.23 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。

4.24半关闭、端口复用

  • 半关闭

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

使用 close 中止一个连接,但它只是减少描述符的引用计数,并不直接关闭连接,只有当描述符的引用计数为 0 时才关闭连接。shutdown 不考虑描述符的引用计数,直接关闭描述符。也可选择中止一个方向的连接,只中止读或只中止写。
注意:

  1. 如果有多个进程共享一个套接字,close 每被调用一次,计数减 1 ,直到计数为 0 时,也就是所用进程都调用了 close,套接字将被释放。
  2. 在多进程中如果一个进程调用了 shutdown(sfd, SHUT_RDWR) 后,其它的进程将无法进行通信。但如果一个进程 close(sfd) 将不会影响到其它进程。

端口复用

端口复用最常见的用途是:

  • 防止服务器重启时之前绑定的端口还未释放
  • 程序突然退出而系统没有释放端口
#include <sys/types.h>
#include <sys/socket.h>
//设置套接字属性(不仅仅能设置端口复用)
int setsockopt(int sockfd,int level,int optname,const void* optval,socklen_t optlen);
-sockfd:打开的套接字的文件描述符
-level:级别 SOL_SOCKET(端口复用的级别)
-optname:
	-SO_REUSEPORT	允许重用端口复用
	-SO_REUSEADDR
-optval:端口复用的值(整形)
	-1:可以复用
	-0:不可以复用
-optlen:optval参数的大小

端口复用,设置的时机是在服务器端口绑定端口之前

常看网络相关信息的命令
netstat
参数

  • a 所有的socket
  • p 显示正在使用socket的程序名称
  • n 直接使用IP地址,而不通过域名服务器
netstat -anp|grep 9999
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值