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

相关推荐
西柚补习生1 天前
ESP8266远端固定UDP传输
网络·网络协议·udp
云飞云共享云桌面1 天前
昆山精密机械工厂研发部门10个SolidWorks如何共享一台服务器来进行设计办公
运维·服务器·网络·人工智能·电脑
Bruce_Liuxiaowei1 天前
工作组环境内部信息搜集:从基础查询到权限分析
网络·经验分享·网络安全
白帽子黑客杰哥1 天前
在实际渗透测试中,如何系统性地评估一个WAF规则集的有效性?
网络·web安全·kali
林疏safe1 天前
【无标题】
网络
羑悻的小杀马特1 天前
【Linux篇章】穿越网络迷雾:揭开 HTTP 应用层协议的终极奥秘!从请求响应到实战编程,从静态网页到动态交互,一文带你全面吃透并征服 HTTP 协议,打造属于你的 Web 通信利刃!
linux·运维·网络·http·操作系统·网络通信
Facechat1 天前
视频混剪-WebGL滤镜
网络
小码吃趴菜1 天前
TCP编程流程
服务器·网络·tcp/ip
数字护盾(和中)1 天前
破局 “形式化培训”:企业网络安全意识提升的痛点与实操策略
网络