从epoll事件的视角探讨TCP:三次握手、四次挥手、应用层与传输层之间的联系

目录

一、应用层与TCP之间的联系

二、 当通信双方中的一方如客户端主动断开连接时,仅是在客户端的视角下连接已经断开,在服务端的眼中,连接依然存在,为什么?——触发EPOLLRDHUP事件:对端关闭连接或停止写操作

 三、EPOLLIN:可读事件 和 EPOLLOUT:可写事件 的触发时机,什么时候设置读事件关心?什么时候设置写事件关心?

四、EPOLLPRI:优先处理数据事件 —— 当TCP报文携带的是紧急数据时触发(URG = 1, 紧急指针有效)


 

我们来回顾使用epoll的流程:

1、首先,创建监听套接字,将其设置为读事件关心并挂载到epoll的红黑树中。监听套接字读取事件就绪的条件是:TCP全连接队列不为空,在LT模式下,只要全连接队列中有数据就满足读时间就绪;在ET模式下,只有当全连接队列中有新连接到来时,才会触发一次读时间就绪。

2、当触发监听套接字读时间就绪后,使用epoll_wait从epoll模型的就绪队列中将就绪事件及其对应的套接字提取出来,根据套接字类型的不同和就绪事件的不同进而执行不同的回调函数。对于listen套接字而言,当读事件就绪后,它需要调用accept从TCP全连接队列中获取新连接的文件描述符。并将其挂载到epoll中,设置读事件关心。

3、当该连接接收到请求数据后,进行业务处理——根据请求构建响应数据放入该连接的用户级缓冲区中,并设置该连接的文件描述符为写事件关心,等待写事件的就绪。当epoll_wait获取到该连接的写事件就绪后再去执行写事件对应的回调函数。当写入完成后,需要关闭该连接的对写事件的关心。

4、当客户端主动关闭连接时,服务端需要先将连接接收缓冲区中的请求数据处理完毕,并且将数据处理的结果返回给客户端(这样做是出于逻辑的完善,具体情况看要看具体是怎样设计的)。当服务端发现客户端已经主动断开连接后,服务端也要断开连接,并清除文件描述符和移除epoll中对该文件描述符的关心,以及其他相关的资源。

在应用层中,当调用close函数关闭套接字文件描述符时视为发起断开连接。

一、应用层与TCP之间的联系

d7ec6d8ba28d40639225583d2a6c7073.png


接下来开始我们真正的问题讨论: 

二、 当通信双方中的一方如客户端主动断开连接时,仅是在客户端的视角下连接已经断开,在服务端的眼中,连接依然存在,为什么?——触发EPOLLRDHUP事件:对端关闭连接或停止写操作

套接字通信是全双工的,这意味着服务端和客户端之间可以同时进行通信,而要使得两者之间通信所传输的数据互不干扰,这就要求要为通信提供两个缓冲区,一个用来存储接收的数据,一个用于存储需要发送的数据。TCP为每个连接提供了两个独立的缓冲区:接收缓冲区和发送缓冲区。而客户端与服务端之间建立连接的实质就是通信双方是否能正常进行通信——即1、客户端是否能向服务端发送信息;2、服务端能否接收到客户端所发送的信息并且能否能否向客户端发送信息;3、客户端能否接收到服务端发送的信息。

4574c40f33e243eeac87f3af5b557398.png

以上过程实质上就是三次握手的验证过程,进行三次握手的目的就是验证通信双方是否具备通信的能力,即双方是否能够正常接收数据和发送数据。可见,客户端与服务端之间连接的建立实质上就是两者发送缓冲区与接收缓冲区之间的联系。

ab23c21afeb74e4d894e0b577503b4ea.png

当客户端主动调用close关闭连接时,实际上仅仅是客户端的发送缓冲区到服务端的接收缓冲区这条路线被切断了。对服务端而言,服务端的发送缓冲区到客户端的接收缓冲区之间的联系依旧存在。

8e1dc926724643f4925ca18fa474304c.png

所以,当客户端主动关闭连接时,我们需要及时调用read等函数将服务端接收缓冲区中的剩余数据读取至应用层并进行处理。数据处理完成后,如果有需要,可以继续发送给客户端。在数据清理完成后,服务端需要清理与该连接相关的资源。

250d802493454ce690fb244b21f3144c.png


 三、EPOLLIN:可读事件 和 EPOLLOUT:可写事件 的触发时机,什么时候设置读事件关心?什么时候设置写事件关心?

epoll所要做的就是等待资源就绪。

对于一条连接而言,在连接成功建立之初,我们就应对其设置读事件关心。——因为通信中的一方始终需要接收另一方发送的信息,继而要去对信息进行处理。这就需要我们调用read/recv等读取函数去读取接收缓冲区中的内容。但,缓冲区中如果没有数据,我们调用读取函数就会阻塞(BLOCK模式,连接关闭时返回0)或者读取失败(NONBLOCK模式,错误码为EAGAIN 或 EWOULDBLOCK,表示资源暂时不可用,连接关闭时返回0)。

那么读就绪的条件就是:在LT模式下,接收缓冲区中有数据即为读就绪。在ET模式下,接收缓冲区中接收到新数据即为读就绪。

类似的,写事件的就绪:在LT模式下,发送缓冲区中有空间即为写就绪。在ET模式下,发送缓冲区中有新空间即为写就绪。

但是,我们并不能在连接成功建立之初对其设置写事件关心!连接建立之初,发送缓冲区中一定是有空间的,因为此时我们并未将数据处理的结果写入到发送缓冲区中。如果此时设置了写事件关心,那么写事件是常就绪的,然而我们大多数的事件可能是在进行读取数据与业务处理,并不一定需要发送数据。同时,不必要的写事件常就绪还会造成epoll模型中红黑树和就绪队列资源的占用和不必要的资源浪费。

所以,我们要在需要写数据的时候将设置关心写事件——即当应用层处理完读取上来的请求数据并生成响应数据需要发送给另一方时,我们再将该连接描述符的写事件设置为关心。必要的,在数据发送完毕后,及时关闭对该连接的写事件关心。


四、EPOLLPRI:优先处理数据事件 —— 当TCP报文携带的是紧急数据时触发(URG = 1, 紧急指针有效)

8f27bc6477544904834e1026d48b532f.png

 当TCP报头中的保留位字段中的URG字段设置为1时,发送应用进程就告诉发送方的TCP有紧急数据要传送——该报文数据中包含紧急数据,于是发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。这时URG需要搭配首部中的紧急指针字段配合使用。

当接收方的接收缓冲区根据TCP报头识别到该段报文的数据包含紧急数据时,会通知与其相关的系统调用,epoll会返回EPOLLPRI事件。说明有紧急数据到来,需要优先处理。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/954137.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

dockerfile实现lnmp

dockerfile实现lnmp 自定义镜像实现整个架构 (基础镜像centos7) nginx cd /opt mkdir nginx mysql php vim Dockerfile docker network create --subnet172.111.0.0/16 mynetwork #创建自定义网段 docker run -itd --name nginx -p 80:80 --cpu-quota 20000 -m 512m -v /op…

unity下载newtonsoft-json

Package Manager,输入com.unity.nuget.newtonsoft-json 右键Assets-Reinport All

python学opencv|读取图像(三十一)缩放图像的三种方法

【1】引言 前序学习进程中,我们至少掌握了两种方法,可以实现对图像实现缩放。 第一种方法是调用cv2.resize()函数实现,相关学习链接为: python学opencv|读取图像(三)放大和缩小图像_python opencv 读取图…

PyCharm 引用其他路径下的文件报错 ModuleNotFound 或报红

PyCharm 中引用其他路径下的文件提示 ModuleNotFound,将被引用目录添加到系统路径: # # 获取当前目录 dir_path os.path.dirname(os.path.realpath(__file__)) # # 获取上级目录 parent_dir_path os.path.abspath(os.path.join(dir_path, os.pardir))…

ClickHouse-CPU、内存参数设置

常见配置 1. CPU资源 1、clickhouse服务端的配置在config.xml文件中 config.xml文件是服务端的配置,在config.xml文件中指向users.xml文件,相关的配置信息实际是在users.xml文件中的。大部分的配置信息在users.xml文件中,如果在users.xml文…

自动连接校园网wifi脚本实践(自动网页认证)

目录 起因执行步骤分析校园网登录逻辑如何判断当前是否处于未登录状态? 书写代码打包设置开机自动启动 起因 我们一般通过远程控制的方式访问实验室电脑,但是最近实验室老是断电,但重启后也不会自动连接校园网账户认证,远程工具&…

iOS 解决两个tableView.嵌套滚动手势冲突

我们有这样一个场景,就是页面上有一个大的tableView, 每一个cell都是和屏幕一样高的,然后cell中还有一个可以 tableView,比如直播间的情形,这个时候如果我们拖动 cell里面的tableView滚动的话,如果滚动到内…

机组存储系统

局部性 理论 程序执行,会不均匀访问主存,有些被频繁访问,有些很少被访问 时间局部性 被用到指令,不久可能又被用到 产生原因是大量循环操作 空间局部性 某个数据和指令被使用,附近数据也可能使用 主要原因是顺序存…

LeetCode热题100-二叉树的中序遍历【JavaScript讲解】

题目: 二叉树: 二叉树的遍历是指按照某种特定的顺序访问二叉树中的每个节点,使得每个节点被访问且仅被访问一次。二叉树的遍历主要分为三种:先序遍历(前序遍历)、中序遍历和后序遍历。 ‌先序遍历&#x…

【Linux】正则表达式

正则表达式是一种可供Linux工具过滤文本的自定义模板,Linux工具(如sed、gawk)会在读取数据时使用正则表达式对数据进行模式匹配。 正则表达式使用元字符来描述数据流中的一个或多个字符。它是由正则表达式引擎实现的。正则表达式引擎是一种底…

计算机视觉算法实战——步态识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​​​​​​​​​​​​​​​​ 1. 步态识别简介✨✨ 步态识别(Gait Recognition)是计算机视觉领域中的一个…

【RTSP】使用webrtc播放rtsp视频流

一、简介 rtsp流一般是监控、摄像机的实时视频流,现在的主流浏览器是不支持播放rtsp流文件的,所以需要借助其他方案来播放实时视频,下面介绍下我采用的webrtc方案,实测可行。 二、webrtc-streamer是什么? webrtc-streamer是一个使用简单机制通过 WebRTC 流式传输视频捕获…

从0开始学习搭网站第二天

前言:今天比较惭愧,中午打铲吃了一把,看着也到钻二了,干脆顺手把这个赛季的大师上了,于是乎一直到网上才开始工作,同样,今天的学习内容大多来自mdn社区mdn 目录 怎么把文件上传到web服务器采用S…

【Pico串流预览】使用“PICO Unity Live Preview Plugin”和PDC工具进行实时预览

使用“PICO Unity Live Preview Plugin”和PDC工具进行实时预览 支持内容 支持预览的内容 虚拟场景手势追踪 支持操作系统 仅支持Windows 下载插件 PICO Unity Live Preview Plugin 当前版本:v1.0.4 更新时间: 2024-12-05 大小: 3.27MB …

poi处理多选框进行勾选操作下载word以及多word文件压缩

一、场景 将数据导出word后且实现动态勾选复选框操作 eg: word模板 导出后效果&#xff08;根据数据动态勾选复选框&#xff09; 二、解决方案及涉及技术 ① 使用poi提供的库进行处理&#xff08;poi官方文档&#xff09; ② 涉及依赖 <!-- excel工具 --><depen…

深入浅出负载均衡:理解其原理并选择最适合你的实现方式

负载均衡是一种在多个计算资源&#xff08;如服务器、CPU核心、网络链接等&#xff09;之间分配工作负载的技术&#xff0c;旨在优化资源利用率、提高系统吞吐量和降低响应时间。负载均衡的实现方式多种多样&#xff0c;以下是几种常见的实现方式&#xff1a; 1. 硬件负载均衡&…

基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用-以ENSO预测为例讲解

1. 背景与目标 ENSO&#xff08;El Nio-Southern Oscillation&#xff09;是全球气候系统中最显著的年际变率现象之一&#xff0c;对全球气候、农业、渔业等有着深远的影响。准确预测ENSO事件的发生和发展对于减灾防灾具有重要意义。近年来&#xff0c;深度学习技术在气象领域…

MySQL表格练习(单表查询,多表查询)

一,单表查询 素材&#xff1a; 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NUL…

postgresql分区表相关问题处理

1.使用pg_cron按日创建分区表&#xff0c;会出现所在数据库对应用户权限不足的问题。 原因是pg_cron运行在postgres数据库中&#xff0c;是用superuser进行执行的&#xff0c;对应的分区表的owner为postgres&#xff0c;所以需要单独授权对表的所有操作权限。不知道直接改变ow…

【数据结构】基础知识

目录 1.1 什么是数据结构 1.2数据 1.3 逻辑结构 1.4 存储结构 1.4.1 顺序存储 1.4.2 链式存储 1.4.3 索引存储 1.4.4 散列存储 1.5 操作 1.1 什么是数据结构 数据的逻辑结构以及存储操作 数据结构没有那么复杂&#xff0c;它就教会你一件事&#xff1a;如何更有效的…