Internet Protocol: Connectionless Datagram Delivery
网际协议:无连接数据报交付
1. This chapter explains the fundamental principle of connectionless delivery and discusses how it is provided by the Internet Protocol(IP), which is one of the two major protocols used in internetworking (TCP being the other). We will study the format of IP datagrams and see how they
form the basis for all internet communication.
2. Conceptually, a TCP/IP internet provides three sets of services:
1) At the lowest level, a connectionless delivery service provides a foundation on which everything rests.
2) At the next level, a reliable transport service provides a higher level platform on which applications depend.
3) At the top level, is Application services.
Internet software is designed around three conceptual networking services arranged in a hierarchy; must of its success has resulted because this architecture is surprisingly robust and adaptable.
3. The most fundamental internet service consists of a packet delivery system. Technically, the service is defined as an unreliable, best-effort, connectionless packet delivery system, analogous to the service provided by network hardware that operates on a best-effort delivery paradigm.
1) The service is called unreliable because delivery is not guaranteed. the packet may be lost, duplicated, delayed, or delivered out of order, but the service will not detect such conditions, nor will it inform the sender or receiver.
2) The service is called connectionless because each packet is treated independently from all others.
3) The service is said to best-effort delivery because the internet software makes an earnest attempt to deliver packets.
The protocol that defines the unreliable, connectionless delivery mechanism is called the Internet Protocol(网际协议).
4. IP协议的目的
1)IP定义了在整个TCP/IP互联网中使用的数据传送基本单元。规定了数据在互联网上传递时的确切格式;
2)IP软件完成转发(forwarding)的功能,选择分组发送的路径;
3)IP包含一组体现不可靠分组交付思路的规则,这些规则刻画了主机和路由器应当如何处理分组,何时及如何产生差错报文,以及在什么情况下可以丢弃分组。
5. IP数据报(IP包)的格式
由于数据报是在软件中进行处理的,所以他的格式和内容都不受任何硬件限制。
第一个32位(第一行):
1)前4位为“版本(VERS)”字段;
2)4位“头部长度”字段(header lengh fied,简称HLEN),注意它的单位是32位字(4字节);
3)8位的“服务类型(SERVICE TYPE)”字段,简称TOS(Type Of Service);
4)16位“总长度(TOTAL LENGTH)”字段,给出整个数据报的长度(字节数);
第二个32位(第二行)分片相关的字段:
5)16位标识IDENTIFICATION (重组标识)
6)3位FLAG (最低位为“更多分片”位,第2位为“不分片”位)
7)15位FRAGMENT OFFSET (该片的偏移)
第三个32位(第三行):
8)TIME TO LIVE
9)PROTOCOL (指明IP数据报中数据区携带的报文是使用哪个高层协议创建的)
10)HEADER CHECKSUM
第四、五个32位:
11)SOURCE IP ADDRESS (源IP地址)
12)DESTINATION IP ADDRESS (目的IP地址)
第六个32位:
13)IP OPTIONS (IF ANY一般用于网络测试或调试,比如路由追踪,时间戳)
14)PADDING
之后为“数据”字段(总长度不能超过65535个字节)。
6. 详细说明IP数据报的各个字段的含义:
从头文件/usr/include/netinet/ip.h中我们可以看到IP头的结构体:
- struct iphdr
- {
-
#if __BYTE_ORDER == __LITTLE_ENDIAN
-
unsigned int ihl:4;
-
unsigned int version:4;
-
#elif __BYTE_ORDER == __BIG_ENDIAN
-
unsigned int version:4; /* version */
-
unsigned int ihl:4; /* header length */
-
#else
-
# error "Please fix "
-
#endif
-
u_int8_t tos; /* type of service */
-
u_int16_t tot_len; /* total length */
-
u_int16_t id; /* identification */
-
u_int16_t frag_off; /* fragment offset field */
-
u_int8_t ttl; /* time to live */
-
u_int8_t protocol; /* protocol */
-
u_int16_t check; /* header checksum */
-
u_int32_t saddr; /* source address */
-
u_int32_t daddr; /* dest address */
-
/*The options start here. */
- };
1)版本字段 version:4 为4位,包含了创建数据报所用的IP协议的版本信息,用来确认发送方、接收方
和它们之间的所有路由器就数据报格式达成一致。目前有IPv4和IPv6两种版本。
2)头部长度字段 ihl:4 为4位, 它给出了用32位字来度量的数据报头部的长度,一般情况下,
没有可选项时ihl = 5;有可选项时 ihl >= 6 (也就是5 * 4 = 20字节 或者ihl * 4 个字节)。
3)服务类型字段 tos 长度为8位,它用来指定特殊的报文处理方式。
tos的8位,最后两位没有使用。对tos各位含义的定义以前的和现在的发生了变化,但是是兼容的。
以前:用 tos 的前3位来表示该数据报的“优先级”precedence,值从0(normal precedence)到
7(network control),允许发送者暗示数据报的重要性。虽然,有一些路由器会忽略“优先级”,但是
它是一个很重要的概念,因为它提供了一种机制:允许网络控制信息优先于普通数据来传输。
比如,许多路由器会利用“优先级”等于6或者7: for routing traffic to make it possible for the routers
to exchange routing information even when networks are congested(拥挤的,堵塞的).
接下来的3位表示 transport request 分别为:D、T、R位 specify the type of transport desired for
the datagram.
D:表示 low delay;T:表示 high throughput;R:表示 high reliability.
transport request is just a hint to routing algorithms, not as a demand.
现在:
在1990年代后期,IETF重新定义了tos字段的含义,以提供一组区分服务(Differentiated Service,简称DS)
tos 的前6位组成码点(codepoint)字段,有时缩写为DSCP,后2为保留未用。
一个码点值被映射到一个底层服务定义,这通常是通过一个指针数组实现的。
为了保持与最初定义的向后兼容,标准把码点的前3位(也就是以前用于优先级的3位)和后3为区别对待。
当后3位全为0时: XXX000 码点的值含义是最初的定义“优先级”(X代表0或1)。
64个码点值分成了3组:
Pool Codepoint Assigned By
1 xxxxx0 Standards organization
2 xxxx11 Local or experimental
3 xxxx01 本地使用或用于实验
一半的码点值(即Pool 1中的32个值,从2~64之间的偶数)必须由IETF来分配解释。
Pool 2 和Pool 3用于实验或本地使用。这种划分方式是为了让值XXX000对应的8个码点处于同一个Pool中。
以利于 tos 的兼容。
总之:我们把服务类型tos当成是给转发算法的提示,帮助转发算法本机本地策略和对路径上可用硬件的
了解,在抵达一个终点的不同路径中进行选择。一个互联网不能保证提供任何一种特定类型的服务。
4)总长度字段 tot_len 长度为16位,它的指整个IP数据报的长度,以8bit字节为单位,其中包括IP报头。
我们只需要用IP总长度减去IP报头长度就能知道了报文实际数据的大小。16位长度的二进制数用十进制
表示最大可以为65535,所以IP报文的最大长度是65535。
5)标识字段 id 、标志字段和片偏移量 用于分片控制。其中标志和片偏移量 用同一个变量frag_off来表示。
标识字段 id 含有一个唯一识别该数据报的整数,发送IP数据报的计算机必须为每一个数据报的id字段
生成一个唯一的值。在路由器对数据报分片时,会吧数据报首部中的大部分字段都复制到每个数据报片的
首部中,这样目的主机就可以知道每一个到达的数据报片属于哪个数据报,可以将分片重组成数据报。
6,7)标志字段和片偏移量 flag_off 其中flag_off的前3位为“标志flag”字段,后5位为“片偏移量off"字段。
“标志flag”占有flag_off的前3位,第一位被保留,第二位是不分片位(DF),当DF被设置被设置为1时,
表示路由器不能对报文进行分片处理。第三位为更多分片位(MF),表示后面还有分片,当路由器对
数据报进行分片时,除了最后一个分片的MF位设置为0外,其他所有分片的MF位均设置1,以便接收者
直到收到MF位为0的分片为止。
“分片偏移off”占flag_off的后13位,作用是为分片的重排:一旦目的主机收到更多分片位关闭(值为“0”)
的数据报片,就知道这个数据报片携带的是原始数据报的尾部数据。目的主机利用片偏移量和总长度字段,
可以计算出原始数据报的总长度。通过查看已到达的全部数据报片的片偏移量和总长度字段,接收方就
可以知道现有的数据报片是否包括重装原始数据报所需的全部数据报片。
8)生存时间字段 ttl 长度为8位,也就是跳数的大小。
9)协议 protocol 字段长度位8位,类似与网络帧中的类型字段,指明数据报中的数据区携带的报文是使用哪个高层协议创建的,实质上协议字段指明了数据区的格式。
10)头部校验和字段 check 长度16位,保证头部字段值的完整性。
11)源地址saddr 字段,保存源IP地址。
12)目的地址 daddr 字段,保存目的IP地址。
13)可选项字段和填充字段
IP可选字段的长度变化取决于选择了哪个选项;在不够32位时,用填充字段补齐到32位。
所以IP数据报的头部长度 ihl:4 要么等于5要么等于6.
可选字段 are included primarily for network testing or debuggin.一般用于网络测试或者调试。
IP可选项字段至少有1个字节长,这第一个字节称为“选项码”(option code),其它可选项的长度是
可变的,选项码后面可能跟有该选项对应的1个字节组长度和一串数据字节。
第1个字节的“选项码”的组成如下:
第1位为“COPY flag",复制标志控制路由器在分片的过程中如何处理,当复制标志置为“1”时,
说明该选项应复制到所有数据片中,否则只把该选项复制到第一个数据片中;
后面的2位,为“OPTION CLASS”选项类字段,表示哪一个选项类别;
再后面的5位,为“OPTION NUMBER”选项号字段,表示该选项类别的哪一项;
“选项码”组成:
0位 1 2位 3 .... ....7位
COPY FLAG OPTION CLASS OPTION NUMBER
“选项类” 及其意义:
OPTION CLASS Meaning
0 Datagram or network control
1 Reserved for future use
2 Debugging and measurement
3 Reserved for furure use
总的“可选项”组成为:
选项码字段 长度Length字段 数据DATA字段
1字节 可变 可变
常用的可选项如下:
Loose Srouce Routing ――它给出了一连串路由器接口的IP地址序列。报文必须沿IP地址序列传送,但是允许在相继的两个的之间跳过多个路由器。
Sttict Source Routing――它给出了一系列路由器接口的IP地址的序列,不同于loose Source Routing,报文必须按照序列转发,否则就会出错。
Record Route――给离开路由器的报文记录出口地址,以便保留报文经过的所有的路由器的记录。
Timestamp―― 除了每个路由器还会记录一个时间戳之外,时间戳现象十分类似于记录路由选项。
13.1)记录路由(record route)选项
路由和时间戳选项是最受关注的选项,因为它们提供了一种办法来检测或控制互联网的路由器如何转发
数据报。记录路由选项允许源主机创建一个IP地址的空表,以备处理数据报的各个路由器将其IP地址添加
到这个表中。其格式如下:
0 8 16 24 31
OPTION CODE LENGTH POINTER PADDING
FIRST IP ADDRESS
SECOND IP ADDRESS
... ...
OPTION CODE “选项码”字段包括“选项类”和选项号“(对于记录路由,选项类为0,选项号为7).
长度(LENGTH)字段指明选项在IP数据报中出现时的总长度。
指针(POINTER)字段指明下一个用于存放地址的空位在选项中的偏移量。
FIRST IP ADDRESS 开始的字段用于记录路由器地址。为了把自己的地址添加到表中,机器首先比较
指针字段和长度字段;如果指针比长度大,则表已满,机器不插入自己的表项,而是直接转发该数据报;
如果表不满,机器就在指针指明的位置插入它自己的4字节IP地址,并把指针值加4.
13.2)源路由选项(source route)
源路由选项是另一个收到关注的概念。源路由为发送方指明一条经过互联网的路径提供了一种方法。
IP支持两种形式的源路由选择:一种是严格的源路由选择(strict source routing),
另一种是不严格的源路由选择(loose source routing);其格式如下:
0 8 16 24 31
OPTION CODE LENGTH POINTER PADDING
IP ADDRESS OF FIRST HOP
IP ADDRESS OF SECOND HOP
... ...
13.3)时间戳选项(timestamp)
时间戳选项包含一个初始化为空的表,从源站到目的站的路径上每一个路由器个在表中填入一项,
在这一点上时间戳选项与记录路由选项的工作方式类似。其格式如下:
0 8 16 24 31
OPTION CODE LENGTH POINTER OFLOW FLAGS
FIRST IP ADDRESS
FIRST TIMESTAMP
... ...
不同之处是:4位溢出(OFLOW)字段含有一个整数计数器,它负责统计因为选项空间太小而无法
提供时间戳的路由器个数
4位的标志字段中的值用于控制选项的确切格式,并告诉路由器应该如何提供时间戳:
Flags Value Meaning
0 Recond timestamps only; omit IP address.
1 Precede each timestamp by an IP address.
3 IP addresses are specified by sender; a router only records a timestamp if the next
IP address in the list matches the router's IP address.