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连接,并丢弃所有状态和缓冲数据

相关推荐
网络研究院3 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
treesforest3 天前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
2601_961845153 天前
粉笔行测题库|系统班|刷题
网络·百度·微信·微信公众平台·facebook·新浪微博
程序员mine3 天前
HTTPS-TLS加密与证书完全指南(中)
网络协议·https·ssl
程序猿阿伟3 天前
《Chrome离线扩展安装的底层逻辑与场景落地指南》
服务器·网络·chrome
之歆3 天前
现代 HTTP 客户端深度解析:Fetch 与 Axios
chrome·网络协议·http
InHand云飞小白3 天前
无人值守站点网络困境?工业级路由器IR315破解连接难题
网络·物联网·4g·工业路由器·4g路由器·iiot·蜂窝路由器
森G3 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt