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

谢谢

相关推荐
gallonyin12 分钟前
免root运行python保活守护进程supervisor
linux·开发语言·python
嵌入式悦翔园1 小时前
嵌入式设备的功能安全和信息安全?
网络·安全·php
Charary1 小时前
字符设备驱动开发与杂项开发
linux·驱动开发
孤寂大仙v2 小时前
【Linux笔记】理解文件系统(上)
linux·运维·笔记
喝养乐多长不高2 小时前
HTTPS加密原理详解
网络·网络协议·http·https·证书·非对称加密·对称加密
钢板兽3 小时前
Java后端高频面经——JVM、Linux、Git、Docker
java·linux·jvm·git·后端·docker·面试
byxdaz3 小时前
NVIDIA显卡驱动、CUDA、cuDNN 和 TensorRT 版本匹配指南
linux·人工智能·深度学习
D-river3 小时前
【Academy】HTTP 请求走私 ------ HTTP request smuggling
网络·网络协议·安全·web安全·http·网络安全
大白的编程日记.4 小时前
【Linux学习笔记】Linux基本指令分析和权限的概念
linux·笔记·学习
努力学习的小廉4 小时前
深入了解Linux —— 调试程序
linux·运维·服务器