close关闭 tcp套接字和 shutdown关闭 tcp套接字的区别

close关闭 tcp套接字和 shutdown关闭 tcp套接字的区别

close是 关闭文件描述符=>从进程的文件描述符表中移除该描述符=>引用计数减1=>若引用计数为0则释放该文件描述符对应的内核资源(如socket控制块等)【对于TCP套接字来说此时 才会去发送FIN】

shutdown 是TCP协议层关闭连接的行为 ,其本身不会关闭文件描述符=>相当于其引用文件描述符的底层内核对象去关闭TCP链接,但是不会影响文件描述符和其引用的内核对象本身=>所以一般应用在shutdown后往往还会进行close操作

shutdown 可以在TCP协议层进行TCP连接的半关闭操作=>可以选择关闭读,关闭写=>半关闭后还可以继续用相应的套接字进行只读,或者只写操作

close 关闭TCP套接字的行为:

1.如果该套接字描述符的引用计数大于1,close行为只是将本进程的该描述符从文件描述符表中移除,引用计数减1,内核资源不会被释放,TCP连接保持有效=>其他进程仍然可以使用该套接字描述符继续收发数据

2.如果该套接字描述符的引用计数等于1,close行为会释放该文件描述符对应的内核资源=>对于TCP套接字来说此时会发送FIN【先会等待发送缓冲区的数据发送完毕,再进行FIN的发送】,同时该进程的文件描述符表中移除该描述符

对于情况2 :若此时对端在本端closefd 后 继续发送数据,会有二种情况:

----------------本端close fd------(1)------对端收到fin/发送Ack------(2)------本端受到Ack-----(半关闭状态)-(2)------【实际上这里只存在第二个2的情况,因为tcp是有顺序的,对端收到fin/发送Ack 后发送的数据(第一个2位置),对于本端必然是在收到ACK后收到(第二个2位置)】

本端close fd 后 收到对端响应的ack,才进入半关闭状态,从TCP协议上此时本地应该仍然能接受对端发送的数据,但实际上,对端在此时发送数据只分为2种情况

1位置.对端在收到Fin前发送数据:这个阶段发送的数据仍然能被本端接收并相应ACK,但是因为本端应用的套接字描述符已经关闭了,所以这部分数据无人读取最终被丢弃【此时半关闭状态还未确认建立】

2位置.对端在收到Fin后发送数据:本端收到这个数据时,半关闭状态已经建立,从TCP协议上将即便半关闭状态建立了确实还能接受数据,但是因为socket文件描述符对应的内核对象已经被释放,TCP内核依然会触发RST的发送

对端在收到RST后,会立即强制终止TCP连接,并丢弃所有状态和缓冲数据

相关推荐
g3voip3 小时前
防爆电话如何接入SIP调度系统?工业通信系统架构解析
服务器·tcp/ip·系统架构·信息与通信·ip
hoaxxcj3 小时前
零能力 Agent 骗过评测实测:朴素 harness 被骗 75%,加固后仍漏掉「抄答案」
网络·安全·大模型·工程化·ai实战
猫咪宝妖4 小时前
【信息安全工程师】网络与信息安全理论
网络·安全·web安全
Fnetlink17 小时前
FNET 云网安 260819
网络·人工智能·安全·网络安全
lsh曙光7 小时前
playbook剧本(2)--Ansible变量
linux·运维·网络
发光小北8 小时前
IO‑Link 从站转接模块如何应用?
网络
我爱cope9 小时前
【计算机网络 | 数据链路层7:VLAN:一台交换机如何划分多个逻辑局域网?】
网络·学习·计算机网络
数据知道9 小时前
网络安全实战:服务指纹识别——Banner、协议探测、版本漏洞关联
网络·安全·web安全·网络安全
无锡耐特森9 小时前
ModbusTCP转Profinet网关:恒压供水系统互联互通解决方案
网络
旗开得胜马到成功9 小时前
SK海力士SSD售后翻车:企业备份介质裸奔风险与中科热备技术选型拆解
运维·服务器·网络