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

相关推荐
Jony_2 天前
高可用移动网络连接
网络协议
chilix2 天前
Linux 跨网段路由转发配置
网络协议
DianSan_ERP3 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
呉師傅3 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
gihigo19983 天前
基于TCP协议实现视频采集与通信
网络协议·tcp/ip·音视频
2501_946205524 天前
晶圆机器人双臂怎么选型?适配2-12寸晶圆的末端效应器有哪些?
服务器·网络·机器人
linux kernel4 天前
第七部分:高级IO
服务器·网络
数字护盾(和中)4 天前
BAS+ATT&CK:企业主动防御的黄金组合
服务器·网络·数据库
~远在太平洋~4 天前
Debian系统如何删除多余的kernel
linux·网络·debian
龙仔7254 天前
在麒麟V10服务器安全加固,sshd防暴力破解加固,实现“密码错误3次封IP”的需求
服务器·tcp/ip·安全