https://eklitzke.org/how-tcp-sockets-work tcp 连接的可读可写有两种方式通知内核:轮询和中断 内核收到可读事件可写事件后分配连接队列(backlog),listen的时候设置;或者拒绝连接。 应用程序读写数据有两种方式:阻塞和非阻塞;阻塞方式是read/write系统调用后,一直等待,连接队列的接受/发送缓冲可读/写的时候,读/写数据,处理完了返回。非阻塞方式read/write系统调用后立即返回。连接队列的接受/发送缓冲可读/写的时候处罚读写事件,事件处理器(libevent)分发给处理函数处理。
不要用操作磁盘文件的经验去看待网络IO 相比于传统的网络IO来说,一个普通的文件描述符的操作可以分为两部分。以read为例,我们利用read函数从socket中同步阻塞的读取数据,整个流程如下所示: 调用read后,该调用会转入内核调用 内核会等待该socket的可读事件,直到远程向socket发送了数据。可读事件成立(这里还需要满足TCP的低水位条件,但是不做太详细的讨论) 数据包到达内核,接着内核将数据拷贝到用户进程中,也就是read函数指定的buffer参数中。至此,read调用结束。 可以看到除了转入内核调用,与传统的磁盘IO不同的是,网络IO的读写大致可以分为两个阶段: