当收到的数据报的协议字段指明这是一个TCP报文段时,ipintr(通过协议协议转换表中的pr_input函数)会调用tcp_input
进行处理,tcp_inut在软件中断一级执行。
函数非常长,我们将分两张讨论,下图列出了tcp_input中的处理框架。本章将结束对RST报文段处理的讲解,下一章开始
介绍ACK报文段的处理。
头几个步骤是非常典型的:对输入报文段做有效性验证(检验和、长度等),以及寻找连接的PCB。尽管后面还有大量的
代码,但通过“首部预测”,算法却有可能完全跳过后续的逻辑。首部预测算法是基于这样的假定,一般情况下,报文段既
不会丢失,次序也不会错误,因此,对于给定连接,TCP总能猜到下一个接收报文段的内容。如果算法起作用,函数直接
返回,这是tcp_input中最快的一条执行路径。
1.预处理
该部分介绍对收到的TCP报文段进行于预处理。处理的大概流程如下:
1.从第一个mbuf中获取IP和TCP首部。
2.验证TCP的检验和。
3.验证TCP偏移字段。
4.把IP和TCP首部及选项放入第一个mbuf。
5.快速处理时间戳选项。
6.保存输入标志,把字段转换成主机字节序。
7.寻找Internet PCB。
8.如果没有找到PCB,则丢弃报文,并发送RST作为响应。
9.如果TCP控制块存在,但连接状态为closed,说明插口已创建,且得到了本地地址和本地端口号,但还未调用connect或
listen。报文