TCP/IP 详情-卷1¶
简介:
原作名: TCP/IP ILLustrated Volume 1: The Protocols
作者: [美国] W・Richard Stevens
原作: 1993-12-31
译作名: TCP/IP 详解 卷 1:协议
出版年: 2000-4-1
译者: 范建华
W.Richard Stevens,国际知名的 UNIX 和网络专家,备受赞誉的技术作家。他 1951 年 2 月 5 日出生于赞比亚,后随父母回到美国。中学时就读于弗吉尼亚菲什伯恩军事学校,1973 年获得密歇根大学航空和航天工程学士学位。1975 年至 1982 年,他在亚利桑那州图森市的基特峰国家天文台从事计算机编程工作,业余时间喜爱飞行运动,做过兼职飞行教练。这期间他分别在 1978 年和 1982 年获得亚利桑那大学系统工程硕士和博士学位。此后他去康涅狄格州纽黑文的健康系统国际公司任主管计算机服务的副总裁。1990 年他回到图森,从事专业技术写作和咨询工作。写下了多种经典的传世之作,包括《TCP/IP 详解》(三卷)、《UNIX 环境高级编程》和《UNIX 网络编程》(两卷)。Stevens 于 1999 年 9 月 1 日去世,年仅 48 岁。2000 年他被国际权威机构 USENIX 追授 “终身成就奖”。
目录
第1章 概 述¶
不同类型的物理网络:
1. 以太网
2. 令牌环网
3. 点对点的链接
4. FDDI(光纤分布式数据接口)
5. RS-232 串行线路
网关这个术语现在只用来表示应用层网关:一个连接两种不同协议族的进程,它为某个特定的应用程序服务。以前也称IP路由器(IP Router)为网关。
TCP传给IP的数据单元称作 TCP 报文段或简称为 TCP段(TCP segment)。
IP传给网络接口层的数据单元称作 IP数据报(IP datagram)。更准确地说,IP和网络接口层之间传送的数据单元应该是分组(packet)。分组既可以是一个IP数据报,也可以是IP数据报的一个片(fragment)。
通过以太网传输的比特流称作帧(Frame)
API using TCP/IP:
1. sockets: Berkeley sockets
2. TLI: TLI by AT&T, XTI by X/Open
第2章 链 路 层¶
以太网和IEEE802.2/802.3¶
IP数据报的封装-以太网标准:
数字设备公司(DigitalEquipmentCorp.)、
英特尔公司(IntelCorp.)
和Xerox公司在1982年联合公布的一个标准
RFC 894
IP数据报的封装-IEEE(电子电气工程师协会)802标准:
802.2定义共同特性
802.3针对整个CSMA/CD网络
802.4针对令牌总线网络
802.5针对令牌环网络
RFC 1042
SLIP&PPP¶
仅有的两个两个串行接口链路层协议:
SLIP
PPP
SLIP 是 UNIX 主机才选,现在很少用了,客户端必须分配固定 IP 地址。SLIP 的历史早于 PPP, 其协议实现简单,容易部署,特别适用于小型环境网络,但其缺点也是显著的
与SLIP相比,PPP 主要有以下优势:
1. PPP 可以进行 IP 地址的协商,而 SLIP 需要静态指定
2. PPP 的 LCP 控制过程有很多选项的协商,增加了可靠性和管理性,但也带来了复杂性
3. PPP 可以支持多个网络层协议,而 SLIP 只支持 IP
4. PPP 的认证过程支持较强大的 CHAP (如 MD5) 方式,而 SLIP 只适用明文密码
5. PPP 可以进行练路完整性验证
MTU¶
当在同一个网络上的两台主机互相进行通信时,该网络的 MTU 是非常重要的。 但是如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的 MTU 。重要的不是两台主机所在网络的 MTU的值,重要的是两台通信主机路径中的最小 MTU 。它被称作路径MTU。
第3章 IP:网际协议¶
IP首部¶
4个字节的32bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作bigendian字节序。由于TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。
字段详解¶
1. 版本号-4¶
IP 协议版本号,目前使用的是版本 4
2. 首部长度(IHL)-4¶
IP 头部的长度:指的是首部占 32 bit字的数目
由于它是一个 4比特字段,因此最大值是15
也就是说最大IP 首部长度是15*32bit=60字节
普通IP数据报(没有任何选择项)字段的值是 5
3. 服务类型(ToS)-8¶
包括:
3 bit的优先权子字段(现在已被忽略)
4 bit的TOS子字段
分别代表:最小时延、最大吞吐量、最高可靠性和最小费用
4 bit中只能置其中1 bit。如果所有4 bit均为0,那么就意味着是一般服务
1 bit未用位但必须置0
RFC 1340[Reynolds and Postel 1992] 描述了所有的标准应用如何设置这些服务类型
RFC 1349[Almquist 1992]对该RFC进行了修正,更为详细地描述了 TOS的特性
4. 总长度-16¶
表示 IP 消息的总长度,以字节为单位
利用首部长度字段和总长度字段,就可以知道 IP 数据报中数据内容的起始位置和长度
由于该字段长 16比特,所以 IP数据报最长可达 65535字节
备注
尽管可以传送一个长达65535字节的IP数据报,但是大多数的链路层都会对它进行分片。而且,主机也要求不能接收超过576字节的数据报。大量使用UDP的应用(RIP,TFTP,BOOTP,DNS,以及SNMP),它们都限制用户数据报长度为512字节,小于576字节。事实上现在大多数的实现(特别是那些支持网络文件系统NFS的实现)允许超过8192字节的IP数据报。
总长度字段是IP首部中必要的内容,因为一些数据链路(如以太网)需要填充一些数据 以达到最小长度。尽管以太网的最小帧长为46字节(见图2-1),但是IP数据可能会更短。如 果没有总长度字段,那么IP层就不知道46字节中有多少是IP数据报的内容。
5. 标识(ID 号)-16¶
用于识别包的编号,一般为包的序列号。
标识字段唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会加 1
如果一个包被 IP 分片,则所有分片都拥有相同的 ID
RFC791[Postel 1981a]认为标识字段应该由让IP发送数据报的上层来选择。假设有 两个连续的IP数据报,其中一个是由TCP生成的,而另一个是由UDP生成的,那么它们 可能具有相同的标识字段。尽管这也可以照常工作(由重组算法来处理),但是在大多 数从伯克利派生出来的系统中,每发送一个IP数据报,IP层都要把一个内核变量的值加 1,不管交给IP的数据来自哪一层。内核变量的初始值根据系统引导时的时间来设置。
6. 标志(Flag)-3¶
该字段有 3 个比特,其中 2 个比特有效,分别代表是否允许分片,以及当前包是否为分片包
7. 分片偏移量-13¶
表示当前包的内容为整个 IP 消息的第几个字节开始的内容
8. 生存时间(TTL)-8¶
表示包的生存时间
这是为了避免网络出现回环时一个包永远在网络中打转。
每经过一个路由器,这个值就会减 1,减到 0 时这个包就会被丢弃
这个字段规定该数据包在穿过多少个路由之后才会被抛弃
某个ip数据包每穿过一个路由器,该数据包的TTL数值就会减少1,当该数据包的TTL成为零,它就会被自动抛弃
这个字段的最大值也就是255,即:协议包在路由器里面穿行255次就会被抛弃了
根据系统的不同,这个数字也不一样,一般是32或者是64
Tracerouter这个工具就是用这个原理工作的,tranceroute的-m选项要求最大值是255
9. 协议号-8¶
协议号表示协议的类型(以下均为十六进制)
ICMP: 01
IGMP: 02
TCP: 06
UDP: 11
10. 头部校验和-16¶
用于检查错误,现在已不使用
为了计算一份数据报的 IP检验和,首先把检验和字段置为 0。然后,对首部中每个 16 bit进行二进制反码求和(整个首部看成是由一串 16 bit的字组成),结果存在检验和字段中。当收到一份I P数据报后,同样对首部中每个 16 bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全 1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。
11. 发送方 IP 地址-32¶
网络包发送方的 IP 地址
12. 接收方 IP 地址-32¶
网络包接收方的 IP 地址
13. 可选字段-可变长度¶
除了上面的头部字段之外,还可以添加可选字段 用于记录其他控制信息,但可选字段很少使用
安全和处理限制(用于军事领域,详细内容参见RFC1108[Kent1991])
记录路径(让每个路由器都记下它的IP地址,见7.3节)
时间戳(让每个路由器都记下它的IP地址和时间,见7.4节)
宽松的源站选路(为数据报指定一系列必须经过的IP地址,见8.5节)
严格的源站选路(与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址)。
这些选项很少被使用,并非所有的主机和路由器都支持这些选项。选项字段一直都是以32bit作为界限,在必要的时候插入值为0的填充字节。这样就保证IP首部始终是32bit的整数倍(这是首部长度字段所要求的)。
IP路由选择¶
主要 搜索路由表
完成以下操作:
1. 寻找能与目的IP地址完全匹配的表目(网络号和主机号都要匹配)
如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口
(取决于标志字段的值)
2. 寻找能与目的网络号相匹配的表目
如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口
(取决于标志字段的值)。
目的网络上的所有主机都可以通过这个表目来处置。
例如,一个以太网上的所有主机都是通过这种表目进行寻径的。
这种搜索网络的匹配方法必须考虑可能的子网掩码。
3. 寻找标为“默认(default)”的表目。
如果找到,则把报文发送给该表目指定的下一站路由器。
为一个网络指定一个路由器,而不必为每个主机指定一个路由器,这是IP路由选择机制的另一个基本特性。这样做可以极大地缩小路由表的规模,比如Internet上的路由器有只有几千个表目,而不会是超过100万个表目。
其他¶
世界IPv6日(2011年6月8日)