给TCP/IP协议栈与数据包进行封装的步骤(4)

除了私有IP地址之外,还有几种特殊的IP地址。127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1。loopback是系统中一种特殊的网络设备,如果发送数据包的目的地址是环回地址,或者与本机其它网络设备的IP地址相同,则数据包不会发送到网络介质上,而是通过环回设备再发回给上层协议和应用程序,主要用于测试。如下图所示(该图出自[TCPIP])。

36.10. loopback设备

给TCP/IP协议栈与数据包进行封装的步骤

还有一些不能用作主机IP地址的特殊地址:

目的地址为255.255.255.255,表示本网络内部广播,路由器不转发这样的广播数据包。

主机号全为0的地址只表示网络而不能表示某个主机,如192.168.10.0(假设子网掩码为255.255.255.0)。

目的地址的主机号为全1,表示广播至某个网络的所有主机,例如目的地址192.168.10.255表示广播至192.168.10.0网络(假设子网掩码为255.255.255.0)。

下面介绍路由的过程,首先正式定义几个名词:

路由(名词)

路由(动词)

路由节点

接口

路由表

路由条目

缺省路由条目

数据包从源地址到目的地址所经过的路径,由一系列路由节点组成。

某个路由节点为数据报选择投递方向的选路过程。

一个具有路由能力的主机或路由器,它维护一张路由表,通过查询路由表来决定向哪个接口发送数据包。

路由节点与某个网络相连的网卡接口。

由很多路由条目组成,每个条目都指明去往某个网络的数据包应该经由哪个接口发送,其中最后一条是缺省路由条目。

路由表中的一行,每个条目主要由目的网络地址、子网掩码、下一跳地址、发送接口四部分组成,如果要发送的数据包的目的网络地址匹配路由表中的某一行,就按规定的接口发送到下一跳地址。

路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。

假设某主机上的网络接口配置和路由表如下:

$ ifconfig

eth0 Link encap:Ethernet HWaddr 00:0C:29:C2:8D:7E

inet addr:192.168.10.223 Bcast:192.168.10.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:10 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:100

RX bytes:0 (0.0 b) TX bytes:420 (420.0 b)

Interrupt:10 Base address:0x10a0

eth1 Link encap:Ethernet HWaddr 00:0C:29:C2:8D:88

inet addr:192.168.56.136 Bcast:192.168.56.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:603 errors:0 dropped:0 overruns:0 frame:0

TX packets:110 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:100

RX bytes:55551 (54.2 Kb) TX bytes:7601 (7.4 Kb)

Interrupt:9 Base address:0x10c0

lo Link encap:Local Loopback

inet addr:127.0.0.1 Mask:255.0.0.0

UP LOOPBACK RUNNING MTU:16436 Metric:1

RX packets:37 errors:0 dropped:0 overruns:0 frame:0

TX packets:37 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:3020 (2.9 Kb) TX bytes:3020 (2.9 Kb)

$ route

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

192.168.10.0 * 255.255.255.0 U 0 0 0 eth0

192.168.56.0 * 255.255.255.0 U 0 0 0 eth1

127.0.0.0 * 255.0.0.0 U 0 0 0 lo

default 192.168.10.1 0.0.0.0 UG 0 0 0 eth0

这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到192.168.56.0/24网络。路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Flags中的U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发,因此下一跳地址处记为*号。

如果要发送的数据包的目的地址是192.168.56.3,跟第一行的子网掩码做与运算得到192.168.56.0,与第一行的目的网络地址不符,再跟第二行的子网掩码做与运算得到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去,由于192.168.56.0/24正是与eth1接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发。

如果要发送的数据包的目的地址是202.10.1.2,跟前三行路由表条目都不匹配,那么就要按缺省路由条目,从eth0接口发出去,首先发往192.168.10.1路由器,再让路由器根据它的路由表决定下一跳地址。

6. UDP段格式

下图是UDP的段格式(该图出自[TCPIP])。

36.11. UDP段格式

给TCP/IP协议栈与数据包进行封装的步骤

下面分析一帧基于UDP的TFTP协议郑

以太网首部

0000: 00 05 5d 67 d0 b1 00 05 5d 61 58 a8 08 00

IP首部

0000: 45 00

0010: 00 53 93 25 00 00 80 11 25 ec c0 a8 00 37 c0 a8

0020: 00 01

UDP首部

0020: 05 d4 00 45 00 3f ac 40

TFTP协议

0020: 00 01 ‘c”:”\”q’

0030: ‘w”e”r”q”.”q”w”e’00

‘n”e”t”a’’s”c”i’

0040: ‘i’00 ‘b”l”k’’s”i”z”e’00 ‘5”1”2′00 ‘t”i’

0050: ‘m”e”o”u”t’00 ‘1”0′00 ‘t’’s”i”z”e’00 ‘0′

0060: 00

以太网首部:源MAC地址是00:05:5d:61:58:a8,目的MAC地址是00:05:5d:67:d0:b1,上层协议类型0×0800表示IP。

IP首部:每一个字节0×45包含4位版本号和4位首部长度,版本号为4,即IPv4,首部长度为5,说明IP首部不带有选项字段。服务类型为0,没有使用服务。16位总长度字段(包括IP首部和IP层payload的长度)为0×0053,即83字节,加上以太网首部14字节可知整个帧长度是97字节。IP报标识是0×9325,标志字段和片偏移字段设置为0×0000,就是DF=0允许分片,MF=0此数据报没有更多分片,没有分片偏移。TTL是0×80,也就是128。上层协议0×11表示UDP协议。IP首部校验和为0×25ec,源主机IP是c0 a8 00 37(192.168.0.55),目的主机IP是c0 a8 00 01(192.168.0.1)。

UDP首部:源端口号0×05d4(1492)是客户端的端口号,目的端口号0×0045(69)是TFTP服务的well-known端口号。UDP报长度为0×003f,即63字节,包括UDP首部和UDP层payload的长度。UDP首部和UDP层payload的校验和为0xac40。