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

相关推荐
云姜.5 分钟前
网络协议----OSI七层网络协议 和 TCP/IP四层(五层)网络协议
网络·网络协议
!chen16 分钟前
LabVIEW TCP Server端工具TCP通信
网络·tcp/ip·labview
枷锁—sha1 小时前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
郝学胜-神的一滴1 小时前
深入解析C/S模型下的TCP通信流程:从握手到挥手的技术之旅
linux·服务器·c语言·网络·网络协议·tcp/ip
池央1 小时前
CANN 算子诊断与故障定位:oam-tools 在异构计算错误解析中的作用
网络
“αβ”1 小时前
数据链路层协议 -- 以太网协议与ARP协议
服务器·网络·网络协议·以太网·数据链路层·arp·mac地址
释怀不想释怀1 小时前
Linux网络基础(ip,域名)
linux·网络·tcp/ip
开开心心就好1 小时前
AI人声伴奏分离工具,离线提取伴奏K歌用
java·linux·开发语言·网络·人工智能·电脑·blender
子榆.1 小时前
CANN 性能分析与调优实战:使用 msprof 定位瓶颈,榨干硬件每一分算力
大数据·网络·人工智能
驱动探索者2 小时前
U盘发展史
网络·cpu·u盘