第28章 TCP的输入

28.1 引言

TCP输入处理是系统中最长的一部分代码,函数tcp_input约有1100行代码。输入报文段的处理并不复杂,但非常繁琐。许多实现,包括Net/3,都完全遵循RFC 793中定义的输入事件处理步骤,它详细定义了如何根据连接的当前状态,处理不同的输入报文段。

当收到的数据报的协议字段指明这是一个TCP报文段时,ipintr(通过协议转换表中的pr_input函数)会调用tcp_input进行处理。tcp_input在软件中断一级执行。函数非常长,我们将分两章讨论。图28-1列出了tcp_input中的处理框架。

那么,接下来呢?我们将结束对RST报文段处理的讲解,从下一章开始介绍ACK报文段的处理。头几个步骤是非常典型的:对输入报文段做有效性验证(检验和、长度等),以及寻找连接的PCB。尽管后面还有大量代码,但通过“首部预测(header prediction)”(28.4节),算法却有可能完全跳过后续的逻辑。

首部预测算法是基于这样的假定:一般情况下,报文段既不会丢失,次序也不会错误,因此,对于给定连接,TCP总能猜到下一个接收报文段的内容。如果算法起作用,函数直接返回,这是tcp_input中最快的一条执行路径。如果算法不起作用,函数在“dodadata”处结束,测试几个标志,并且若需要对接收报文段作出响应,则调用tcp_output。

你可能会问:“这些技术细节为何如此重要?”正如我们在图28-1中看到的,这些步骤对于确保数据的准确传输至关重要。对技术感兴趣的读者,可以进一步阅读TCP协议_RFC793.pdf,获取更多的技术细节和示例!

图28-1 TCP输入处理步骤小结