《TCP/IP详解卷2:实现》笔记--TCP:传输控制协议

传输控制协议,即TCP,是一种面向连接的传输协议,为两端的应用程序提供可靠的端到端数据流传输服务,它完全不同于

无连接的、提供不可靠数据传输服务的UDP协议。

下图描述了各TCP函数与其他内核函数之间的关系,带阴影的椭圆分别表示我们将要讨论的9个主要的TCP函数。

1.TCP的protosw结构

下图列出了TCPprotosw结构的成员变量,它定义了TCP协议与系统内其他协议之间的交互接口。

2.TCP的首部

tcphdr结构定义了tcp首部。下图给出了tcphdr结构的定义和TCP首部。

大多数的RFC文档中,相关书籍(包含卷1)和接下来要讨论的TCP实现代码,都把th_urp称为紧急指针。更准确的名称

应该是紧急数据偏移量。因为这个字段给出的16bit无符号整数值,与th_seg序号字段相加后,得到发送的紧急数据最后

一个八位组的32bit序号。

th_flags成员变量包含6个码元标志比特,通过下图中定义的名称读写。

下图给出的ipovly结构定义了20字节长度的IP首部。通过前面的章节的讨论可知,尽管长度相同(20字节),但这个结构并

不是一个真正的IP首部。

3.TCP的控制块

除了标准的Internet PCB外,TCP还有自己专用的控制块,tcpcb结构,而udp则不需要专用控制块,它的全部控制信息都

已包含在Internet PCB中。

TCP控制块较大,需占用140个字节,下图给出了TCP控制块的定义。

下图给出了t_flags变量的可选值。

4.TCP的状态迁移图

TCP协议根据连接上到达报文的不同类型,采取相应动作,协议规程可抽象为下图所示的有限状态变迁图。图中的各种状态

变迁组成了TCP有限状态机。尽管TCP协议允许从LISTEN状态直接变迁到SYN_SENT状态,但使用socket api编程时这种

变迁不可实现。(调用listen后不可以调用connect)

TCP控制块的成员变量t_state保存一个连接的当前状态。取值如下:

图中还定义了tcp_outflags数组,保存了处于对应连接状态时tcp_output将使用的输出标志。

下图为TCP状态迁移图:

5.TCP的序号

TCP连接上传输的每个数据字节,以及SYN、FIN等控制报文都被赋予一个32bit的序号。TCP首部的序号字段填充了报文段

第一个数据字节的32bit的序号,确认号字段填充了发送方希望接收的下一个序号。确认已正确接收了所有序号小于等于确认

号减1的数据字节。换言之,确认号是ACK发送方等待接收的下一序号。只有当序号首部的ACK标志置位时,确认序号才有效。

除了在主动打开首次发送SYN时或在某些RST报文段中,ACK标志总是被置位的。

1.序号取模运算

TCP必须处理一个问题是序号来自有限的32位取值空间:0~2^32-1,如果某个TCP连接传输的数据量超过2^32字节,序号从

2^32-1回绕到0,将出现重复序号。

即使传输数据量小于2^32字节,仍可能遇到相同的问题,因为连接的初始序号并不一定从0开始。各数据流方向上的初始序号

可以是0~2^32-1之间的任意值。

在tcp.h中,TCP序号定义为unsigned long,下图定了4个用于序号比较的宏。

下面举例说明TCP序号的操作方式,假定序号只有3bit,0~7。下图列出了8个序号和相应的二进制补码。(为求无符号数的

二进制补码,将二进制中的所有0变成1,所有1变成0,再加上1),给出补码形式,是因为a-b = a+(b的补码)

最后三栏分别是0-x,1-x和2-x的运算结果,其中最前面为0表示正数,为1表示负数。上面的1-x的结果表示:1大于0,1,6,7,

小于2,3,4,5.

6.tcp_init函数

系统初始化时,domaininit函数调用tcp的初始化函数tcp_init:

1.设定初始发送序号。

2.tcp internet PCB链表初始化。

3.计算最大协议首部长度。

时间: 2024-08-27 21:10:33

《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 是一个