(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 系统。

谢谢

相关推荐
AlfredZhao11 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户97183563346617 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪18 小时前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
网络研究院2 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智2 天前
ARP代理--工作原理
运维·网络·arp·arp代理
treesforest2 天前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全
不会C语言的男孩2 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言