wap购物网站源码,广告网站设计公司好吗,淮安市哪里可以做网站,广告字体效果图在线制作目录
一、应用层与TCP之间的联系
二、 当通信双方中的一方如客户端主动断开连接时#xff0c;仅是在客户端的视角下连接已经断开#xff0c;在服务端的眼中#xff0c;连接依然存在#xff0c;为什么#xff1f;——触发EPOLLRDHUP事件#xff1a;对端关闭连接或停止写…目录
一、应用层与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之间的联系 接下来开始我们真正的问题讨论
二、 当通信双方中的一方如客户端主动断开连接时仅是在客户端的视角下连接已经断开在服务端的眼中连接依然存在为什么——触发EPOLLRDHUP事件对端关闭连接或停止写操作
套接字通信是全双工的这意味着服务端和客户端之间可以同时进行通信而要使得两者之间通信所传输的数据互不干扰这就要求要为通信提供两个缓冲区一个用来存储接收的数据一个用于存储需要发送的数据。TCP为每个连接提供了两个独立的缓冲区接收缓冲区和发送缓冲区。而客户端与服务端之间建立连接的实质就是通信双方是否能正常进行通信——即1、客户端是否能向服务端发送信息2、服务端能否接收到客户端所发送的信息并且能否能否向客户端发送信息3、客户端能否接收到服务端发送的信息。 以上过程实质上就是三次握手的验证过程进行三次握手的目的就是验证通信双方是否具备通信的能力即双方是否能够正常接收数据和发送数据。可见客户端与服务端之间连接的建立实质上就是两者发送缓冲区与接收缓冲区之间的联系。 当客户端主动调用close关闭连接时实际上仅仅是客户端的发送缓冲区到服务端的接收缓冲区这条路线被切断了。对服务端而言服务端的发送缓冲区到客户端的接收缓冲区之间的联系依旧存在。 所以当客户端主动关闭连接时我们需要及时调用read等函数将服务端接收缓冲区中的剩余数据读取至应用层并进行处理。数据处理完成后如果有需要可以继续发送给客户端。在数据清理完成后服务端需要清理与该连接相关的资源。 三、EPOLLIN可读事件 和 EPOLLOUT可写事件 的触发时机什么时候设置读事件关心什么时候设置写事件关心
epoll所要做的就是等待资源就绪。
对于一条连接而言在连接成功建立之初我们就应对其设置读事件关心。——因为通信中的一方始终需要接收另一方发送的信息继而要去对信息进行处理。这就需要我们调用read/recv等读取函数去读取接收缓冲区中的内容。但缓冲区中如果没有数据我们调用读取函数就会阻塞BLOCK模式连接关闭时返回0或者读取失败NONBLOCK模式错误码为EAGAIN 或 EWOULDBLOCK表示资源暂时不可用连接关闭时返回0)。
那么读就绪的条件就是在LT模式下接收缓冲区中有数据即为读就绪。在ET模式下接收缓冲区中接收到新数据即为读就绪。
类似的写事件的就绪在LT模式下发送缓冲区中有空间即为写就绪。在ET模式下发送缓冲区中有新空间即为写就绪。
但是我们并不能在连接成功建立之初对其设置写事件关心连接建立之初发送缓冲区中一定是有空间的因为此时我们并未将数据处理的结果写入到发送缓冲区中。如果此时设置了写事件关心那么写事件是常就绪的然而我们大多数的事件可能是在进行读取数据与业务处理并不一定需要发送数据。同时不必要的写事件常就绪还会造成epoll模型中红黑树和就绪队列资源的占用和不必要的资源浪费。
所以我们要在需要写数据的时候将设置关心写事件——即当应用层处理完读取上来的请求数据并生成响应数据需要发送给另一方时我们再将该连接描述符的写事件设置为关心。必要的在数据发送完毕后及时关闭对该连接的写事件关心。 四、EPOLLPRI优先处理数据事件 —— 当TCP报文携带的是紧急数据时触发URG 1, 紧急指针有效 当TCP报头中的保留位字段中的URG字段设置为1时发送应用进程就告诉发送方的TCP有紧急数据要传送——该报文数据中包含紧急数据于是发送方TCP就把紧急数据插入到本报文段数据的最前面而在紧急数据后面的数据仍是普通数据。这时URG需要搭配首部中的紧急指针字段配合使用。
当接收方的接收缓冲区根据TCP报头识别到该段报文的数据包含紧急数据时会通知与其相关的系统调用epoll会返回EPOLLPRI事件。说明有紧急数据到来需要优先处理。