《TCP/IP详解卷2:实现》笔记--TCP的输入

当收到的数据报的协议字段指明这是一个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。报文段被丢弃,且不发送任何响应。

10.不改变通告窗口大小。

11.如果选定了插口调试选项,则保存连接状态及IP和TCP首部。

12.如果监听插口收到了报文段,则创建新的插口。

13.计算窗口缩放因子。

14.复位空闲时间和保活定时器。

15.如果不处于监听状态,处理TCP选项。

2.首部预测

首部预测算法通过处理两种常见现象,简化单向数据传输的实现。

1.如果TCP发送数据,连接上等待接收的下一个报文段是对已发送数据的ACK。

2.如果TCP接收数据,连接上等待的下一个报文段时顺序到达的数据报文段。

3.TCP输入:缓慢的执行路径

下面介绍首部预测失败时的处理代码,tcp_input中较慢的一条执行路径。

1.丢弃IP和TCP首部,包括TCP选项。

2.计算接收窗口。

因为函数后面的代码必须确定通告窗口中能放入多少数据,所以现在必须计算通告窗口的大小。落在通告窗口之外的接收

数据被丢弃;落在窗口左侧的数据是已接收并确认过的数据,落在窗口右侧的数据时暂时不允许对端发送的数据。

4.完成被动打开或主动打开

如果连接状态等于LISTEN或者SYN_SENT,则执行本节的处理。连接处于这两个状态时,等待接收的报文段为SYN,任何

其他报文将被丢弃。

4.1.完成被动打开

连接状态等于LISTEN时,执行以下处理:

1.丢弃RST、ACK或非SYN。

2.如果是广播报文段或多播报文段,则丢弃它。

3.为客户端的IP地址和端口号分配mbuf。

4.设定PCB中的本地地址。

5.填充PCB中的对端地址。

6.分配并初始化IP和TCP首部模板。

7.处理所有的TCP选项。

8.初始化ISS。

9.初始化控制块中的序号变量。

10.确认SYN并更新状态。

4.2.完成主动打开

1.验证收到的ACK

2.处理并丢弃RST报文段。

3.判断收到的SYN标志是否置位。

4.处理ACK。

5.关闭连接建立定时器。

6.初始化接收序号。

7.连接建立。

8.查看窗口大小选项。

9.向应用进程提交队列中的数据。

10.更新RTT估计器值。

11.处理同时打开。

12.丢弃落在接收窗口外的数据。

13.强制更新窗口变量。

5.PAWS:防止序号回绕

接下来处理可能出现的序号回绕。

1.基本PAWS测试

PAWS算法基于这样的假定:

对于高速连接,32bit时间戳值回绕的速度远小于32bit序号回绕的速度。即使是最高的失踪计数器更新频率(每毫秒加1),

时间戳的符号位也要24天才会回绕一次。而在千兆网络中,序号可能17秒就回绕一次。因此,如果报文段时间戳小于从同

一个连接接收的最近一次的时间戳,说明是个重复报文段,应该被丢弃(还需进行后续的时间戳过期测试)。尽管因为

序号已过时,tcp_input也可将其丢弃,但PAWS算法能够有效地处理序号回绕速率很高的高速网。

注意,PAWS算法是对称的:它不仅丢弃重复的数据报文段,也丢弃重复的ACK。PAWS处理所有收到的报文段。

2.检查过期的时间戳。

3.丢弃重复报文段

6.裁剪报文段使数据在窗口内

本节讨论如何调整收到的报文段,确保它只携带能够放入接收窗口内的数据:

丢弃接收报文段起始处的重复数据。

从报文段尾部起,丢弃超出接收窗口的数据。

从而剩下可放入接收窗口的新数据,用于判断报文段起始处是否存在重复数据。

1.查看报文段前部是否存在重复数据。

2.丢弃重复SYN.

3.判断报文段数据是否完全重复。

4.判断重复FIN。

5.生成重复ACK。

6.处理同时打开或半连接。

7.收到部分重复报文段时,更新统计值。

8.删除重复数据,更新紧急指针。

9.计算落在通告窗口右侧的字节数。

10.如果连接处于TIME_WAIT状态,查看有无新的连接请求。

11.判断是否为窗口探测报文段。

12.丢弃完全落在窗口以外的其他报文段。

13.处理携带部分有效数据的报文段。

7.自连接和同时打开

应用进程创建一个插口,并通过下列系统调用建立自连接:socket,bind半丁到一个本地端口,之后connect试图与同一

本地地址和同一端口号建立连接,如果connect成功,则插口已建立了与自己的连接:向这个插口写入的所有数据,都可以

在同一插口上读出。这有点类似于全双工的管道,但只有一个,而非两个标识符。尽管很少有应用进程会这样做,但实际

上它是一种特殊的同时打开,两者的状态变迁图相同。

8.记录时间戳

下面给出了tcp_input的处理收到的时间戳选项。

如果收到的报文段中带有时间戳,时间戳值保存在变量中。

9.RST处理

下面给出处理RST标志的switch语句,取决于当前的连接状态。

1.SYN_RCVD状态下,插口差错代码设定为ECONNREFUSED,关闭插口。

2.如果在ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2或CLOSE_WAIT状态收到RST,则返回差错代码ECOORESET。

3.如果状态为CLOSING、LAST_ACK或TIME_WAIT,由于应用进程已关闭插口,无需返回差错代码。

4.如果SYN标志依旧置位,说明出现了差错,连接被丢弃,返回代码ECONNRESET。

5.如果ACK标志未置位,报文被丢弃。

时间: 2024-11-03 22:22:15

《TCP/IP详解卷2:实现》笔记--TCP的输入的相关文章

《TCP/IP详解 卷一》读书笔记-----TCP数据流

1.Delayed Acknowledgements:TCP通常不会在收到数据之后立即返回一个ACK,而是会有一个延时,希望能ACK报文段中带上一些数据,通常这个延时为200ms 2.Nagle Algorithm:在TCP连接中,只能有一个小的报文段未被确认.即TCP在发送了一个小的报文段之后,会将之后的小数据都收集起来,直到之前的小报文段得到确认,才将收集到的小数据打包成一个报文段发出.这样做的减少了网络中小报文段的数量,减轻了网络的阻塞,提高了传输的效率 3.当一个包到达以后,它首先被设备

TCP/IP详解 卷1 第二十章 TCP的成块数据流

先补充一个知识: 1.停止等待协议:是tcp保证传输可靠的重要途径,"停止等待"就是指发送完一个分组就停止发送,等待对方确认之后,才能继续发送下一个分组 停止等待协议的优点是简单,缺点就是信道的利用率太低,一次只发送一个消息,信道大部分时间都是空闲的. 2:超时重传有一下三种情况: 1)  分组丢失:发送方发出来了,接收方没有收到 2)  确认丢失:接收方收到了,也发送了确认分组,但是确认分组丢失了 3)  确认延时:确认分组没有丢失,由于传输太慢,发送方在规定时间内没有收到接收方发的

《TCP/IP详解卷1:协议》第14章 DNS:域名系统---读书笔记

<TCP/IP详解卷1:协议>第14章 DNS:域名系统---读书笔记 1.引言 5.指针查询 DNS中一直难于理解的部分就是指针查询方式,即给定一个IP地址,返回与该地址对应的域名. 当一个组织加入Internet,并获得DNS域名空间的授权,如noao.edu,则它们也获得了对应IP地址的in-addr.arpa域名空间的授权.在noao.edu这个例子中,它的网络号是140.252的B类网络.在DNS树中结点in-addr.arpa的下一级必须是该IP地址的第一字节(例中为140),再下

《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(2)-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 <TCP/IP详解卷1:协

《TCP/IP详解卷1:协议》第5章 RARP:逆地址解析协议-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 1.引言 具有本地磁盘的系统引导

《TCP/IP详解卷1:协议》第3章 IP:网际协议(1)-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 1.引言 IP是TCP/IP协议族中最核心的协议.所有的TCP.UDP.ICMP及IGMP数据都以IP数据报格式传输.IP提供不可靠.无连接的数据报传送服务. (1)不可靠 它不能保证IP数据报能成功地到达目的地.IP仅提供最好的传输服务.如果发生某种错误,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端.

《TCP/IP详解卷2:实现》笔记--IP的分片和重装

IP首部内有三个字段实现分片和重装:标识字段(ip_id).标志字段(ip_off的3个高位比特)和偏移字段(ip_off的13个低位 比特).标志字段由3个1bit标志组成.比特0是保留的必须为0,:比特1是"不分片"(DF)标志:比特2是"更多分片"(MF)标志. Net/3中,标志和偏移字段结合起来,由ip_off访问,如下图所示: ip_off的其他13bit指出在原始数据报内分片的位置,以8字节为单位计算.因此,除最后一个分片外,其他的分片都希望是一个 8

《TCP/IP详解卷2:实现》笔记--域和协议

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Net/3组把协议关联到一个域,并且用一个协议族常量来标识每个域.Net/3还通过所有的编址方法将协议分组.在一个域中</span> 的每个协议使用同类地址,并且每种地址只被一个域使用.作为结果,一个域能通过它的协议族或地址族常量唯一标识. 下图是是我们讨论的协议和常量. 1

《TCP/IP详解卷2:实现》笔记--IP编址

1.接口和地址 在本文中讨论的所有接口和地址结构的一个例子配置如下图所示: 上图中显示了我们三个接口例子:以太网接口,SLIP接口和环回接口.它们都有一个链路层地址作为地址列表中的第一个结点. 显示的以太网接口有两个IP地址,SLIP接口有一个IP地址,并且环回接口有一个IP地址和一个OSI地址. 所有的IP地址都被链接到in_ifaddr列表中,并且所有链路层地址能从ifnet_addrs数组访问. 后面的部分讨论上图的数据结构以及用来查看和修改这些结构的IP专用ioctl命令. 2.sock

《TCP/IP详解卷2:实现》笔记--接口层

提示:该实验所在的平台是在RedHat 6下 该实验成功的前提有三个: (1):windows能ping通linux系统 (2):关闭linux的防火墙 :执行指令 /etc/init.d/iptables  stop (3):让SeLinux关闭  :执行指令:  setenforce permissive 补充: SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统.SELinux 是一个