(9) 上:学习与验证 linux 里的 epoll 对象里的 EPOLLIN、 EPOLLHUP 与 EPOLLRDHUP 的不同

(1)经过之前的学习。俺认为结论是这样的,因为三次握手到四次挥手,到 RST 报文,都是 tcp 连接上收到了报文,这都属于读事件 。所以:
EPOLLIN : 包含了读事件, FIN 报文的正常四次挥手、还有 RST 报文的连接突然中断的情形(已经连接上的 tcp 连接,即使被突然关闭, tcp 协议也会让被关闭的套接字再发送最后一条报文,就是 RST 报文)。这个结论的支撑,来自于 wireshark 的抓包观测:

EPOLLRDHUP : 对应 FIN 报文的正常的四次挥手的 tcp 连接关闭。这时候,在现代的 linux 内核里,也同时保留了 EPOLLIN 事件。

EPOLLHUP : 若客户端没有调用 close(套接字),就关闭了, tcp 协议会发送一条 RST 报文给服务器。 服务器上的 epoll 对象会感知到这个事件,且事件类型是 EPOLLHUP 与 EPOLLIN 。一会会编写小例子来验证。弄清这些知识很重要,可以让咱们安心的写出稳定的通信代码。

以上关于 RST 报文的 tcp 协议方面的支撑如下:

++ 进程退出,要关闭自己打开的所有文件,可能触发了 ABORT 请求,该请求启动了 tcp_drop( )函数 :

++ tcp_drop()函数会触发 RST 报文的发送, tcp_close()函数会清除本主机上被关闭套接字具有的所有内存,也就没有此套接字了。

++ 以及:

++ 但是,如下图, close( ) 函数触发的四次挥手 , FIN 报文,对应 DETACH 请求,走的是不一样的代码逻辑:

++ 以及:

(2) 接着先整理一下某心一言里的教导与答案:

++ 以及:

++ 以及:

++以及:

++ 所有的事件,都离不开系统的读函数 read(),再补充一下 read()函数的返回值:


(3) 上面的一言的解答已经很清楚了。谢谢一言。下篇文章里编写小例子测试一下,上 ubantu 系统。

谢谢

相关推荐
GeW6 小时前
新质生产力路线图Linux、数据库、国产化替代一次讲透
linux
aningx8 小时前
cachyos 从 GRUB 切换到 rEFInd
linux
第404号工位9 小时前
40块钱二手瘦客户端,如何跑满家庭物联网中枢?(拒绝Docker爆盘实录)
linux·架构·node.js
骑着蜗牛撵大象32711 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
..Dauntless..11 小时前
【Linux】一切皆文件和缓冲区
linux·运维·服务器
裕晟资质规划11 小时前
三类资质变更报告时限差在哪?军工 15 日、集成印制 10 日
大数据·服务器·网络
QMCY_jason11 小时前
x86 ubuntu2204 无gui 安装 openeuler 2203 aarch64版本
linux·运维·服务器
重生之小比特11 小时前
【Linux系统】12 进程程序替换 自定义Shell 命令行解释器
linux·运维·服务器
轻舟技术A11 小时前
Provider 不属于 Agent 核心:rpi 的分层理由与收益
服务器·网络
あ-12 小时前
CubeSandBox配置CubeMaster CPU 超分
linux·运维·服务器