1、Linux内核网络之传输层接收消息简析
在传输层发送消息时,TCP 发送出去消息后,会跟踪这些数据包,直到得到对方的确认为止。对于接收方来讲,当收到一个报文段时,其会根据情况把这些数据包添加到接收队列或者 prequeue 队列或者后备队列中。
在TCP传输控制块中存在三个队列:接收队列、prequeue队列和后备队列。
当系统启动tcp_low_latency时,TCP 传输控制块在软中断中接收并处理tcp段,然后将其插入到接收队列中。等待用户进程从接收队列中获取TCP段后复制到用户空间,然后删除并释放该段。
当不启用 tcp_low_latency 时能够提高TCP/IP协议栈的吞吐量以及反应速度(因为启用时在软中断中处理tcp段会导致软中断执行过长),TCP 传输控制块在软中断中将 TCP 段添加到 prequeue 队列中,然后立即处理 prequeue 中的段,若用户正在读取数据,则可以直接复制数据到用户缓冲区中,否则添加到接收队列中,然后从软中断中返回。在多数情况下有机会处理 prequeue 队列中的段,但只有当用户进程在进行 recv 类系统调用返回前,才在软中断中复制数据到用户空间。
当用户进程因操作传输控制块将其锁定时,无论是否启用 tcp_low_latency , 都会将未处理的 TCP 段添加到后备队列中,一旦用户解锁后,就会立即处理后备队列,将 TCP 段处理后添加到接收队列中。
TCP 的接收队列为 sock 结构中的 sk_receive_queue。通常情况下,接收的TCP 段都会在缓存在这里,等待用户进程主动读取。
原作者:Linux码农