1. 转发和路由选择
网络层需要有两种功能:
- 转发。当一个分组到达路由器的一条输入链路时,路由器必须将该分组移到适当的输出链路。
- 路由选择。当分组从发送方流向接收方时,网络层必须决定这些分组所采用的路由或路径。计算这些路径的算法被称为路由选择算法(routing algorithm)。
每台路由器都有一张转发表(forwarding table)。路由器通过检查到达分组首部字段的值来转发分组,然后使用该值在该路由器的转发表中国索引查询。存储在转发表项中的该首部的值指出了该分组将被转发的路由器的输出链路接口。分组首部中的该值可能是该分组的目的地址或该分组所属连接的指示,这取决于网络层协议。
2. 路由器结构
- 输入端口:它要执行将一条输入的物理链路端接到路由器的物理层功能。它也要执行需要与位于入链路远端的数据链路层功能交互的数据链路层功能。还要完成查找与转发功能,以便转发到路由器交换结构部分的分组能出现在适当的输出端口。控制分组从输入端口转发到选路处理器。在路由器中,多个端口经常被集中到路由器中的一块线路卡(line card)上。
- 交换结构:交换结构将路由器的输入端口连接到它的输出端口。交换结构完全包容在路由器中。
- 输出端口:输出端口存储经过交换结构转发给它的分组,并将这些分组传输到输出链路。因此,输出端口执行与输入端口顺序相反的数据链路层和物理层功能。当一条链路时是双向(承载两个方向的流量)链路时,与链路相连的输出端口通常与输入端口在同一线路卡上成对出现。
- 路由选择处理器:路由选择处理器执行路由选择协议,维护路由选择表以及连接的链路状态信息,并执行网络管理功能。
3. 数据报网络
在数据报网络中,每当一个端系统要发送分组,它就为该分组加上目的端系统的地址,然后将分组推进网络中。
当分组从源到目的地传输,它通过一系列路由器传递。这些路由器中的每台都使用分组的目的地址来转发该分组。特别是,每台路由器有一个将目的地址映射到链路接口的转发表;当分组到达路由器时,路由器使用该分组的目的地址在转发表中查找适当的输出链路接口。然后路由器有意将该分组向该输出链路接口转发。
路由器的输入端口和输出端口处都能够形成分组队列,当无内存可用于存储到达的分组时将会出现丢包(packet loss)。
4. 数据报格式
- 版本号:这 4 比特规定了数据报的 IP 协议版本。通过查看版本号,路由器可确定如何解释 IP 数据报的剩余部分。不同的 IP 版本使用不同的数据报格式。目前使用的 IP 版本为 IPv4。
- 首部长度:因为一个 IPv4 数据报可包含一些可选项(包含在 IPv4 数据报首部中),故需要用这 4 比特来确定 IP 数据报中的数据部分实际从哪里开始。大多数 IP 数据报不包含可选项,所以一般的 IP 数据报都有 20 字节的首部。
- 服务类型:服务类型(TOS)比特用来使不同类型的 IP 数据报能相互区别开来。
- 数据报长度:这是 IP 数据报的总长度,(首部加上数据),以字节计。因为该字段长为 16 比特,所以 IP 数据报的理论最大长度为 65535 字节。然而,数据报很少有超过 1500 字节的。
- 标识、标志、片偏移:该三个字节与所谓 IP 分片有关,(IPv6不允许在路由器上分片)
- TTL:TTL 字段用来确保数据报不会永远在网络中循环。每当数据报经过一台路由器时,该字段的值减1。若 TTL 字段减为 0,则该数据报必须丢弃。
- 协议:该字段仅在一个 IP 数据报到达其最终目的时才会用到。该字段值指明了 IP 数据报的数据分部应交给哪个运输层协议。 值为 6 表明数据部分要交给 TCP,而值为 17 表明数据要交给 UDP。
- 首部检验和:首部检验和用于帮助路由器检测收到的 IP 数据报中的比特错误。首部检验和是这样计算的:将首部中的每两个字节当作一个数,用反码运算对这些数求和。该和的反码(被称为因特网检验和)存放在检验和字段中。路由器要对每个收到的 IP 数据报计算其首部检验和,并根据数据报首部中携带的检验和与计算得到的检验和是否一致,来检查是否出错。路由器一般会丢弃检测出错误的数据报。注意到在每台路由器上必须重新计算检验和并存放到原处,因为 TTL 字段以及可能的选项字段会改变。注意到在 IP 层只对 IP 首部计算了检验和,而 TCP/UDP 检验和是对整个 TCP/UDP 报文段进行的。其次,TCP/UDP 与 IP 不一定都必须属于同一个协议栈。
- 源和目的 IP 地址:当源主机产生一个数据报时,它在源 IP 字段中插入它的 IP 地址,在目的 IP 地址字段中插入其最终目的地的地址。通常源主机通过 DNS 查找来决定目的地址。
- 选项:选项字段允许IP首部被扩展。首部选项意味着很少使用,因此决定对每个数据报首部不包括选项字段中的信息,这样能够节约开销。
- 数据(有效载荷):在大多数情况下,IP 数据报中的数据字段包含要交付给目的地的运输层报文段(TCP 或 UDP)。然而,该数据字段也可承载其他类型的数据,如 ICMP 报文。
5. IP 数据报分片
一个链路层帧能承载的最大数据量叫做最大传输单元(Maximum Transmission Unit,MTU)。因为每个 IP 数据报封装在链路层帧中从一台路由器传输到下一台路由器,故链路层协议的 MTU 严格地限制着 IP 数据报的长度。对 IP 数据报长度具有严格限制并不是主要问题。问题在于在发送方与目的地路径上的每段链路可能使用不同的链路层协议,且每种协议可能具有不同的 MTU。
当一台目的主机从相同源收到一系列数据报时,它需要确定这些数据报中的某些是否是一些原来较大的数据报分片。如果某些数据报是片的话,则它必须进一步确定何时收到了最后一片,并且如何将这些接收到的片拼接到一起以形成初始的数据报。为了让目的主机执行这些重新组装任务,IPv4 的设计者将标识、标志和片位移字段放在 IP 数据报首部中。当生成一个数据报时,发送主机在为该数据报设置源和目的地址的同时再贴上标识号。发送主机通常将为它发送给的每个数据报的标识号加 1。当某路由器需要对一个数据报分片时,形成的每个数据报(即片)具有初始数据报的源地址、目的地址与标识号。当目的地从同一发送主机收到一系列数据报时,它能够检查数据报的标识号以确定哪些数据报实际上是同一较大数据报的片。由于 IP 是一种不可靠的服务,一个或多个片可能永远到达不了目的地。因为这种原因,为了让目的主机绝对地相信它已收到了初始数据报的最后一个片,最后一个片的标志比特被设为 0,而所以其他片的标志比特被设为 1。另外,为了让目的主机确定是否丢失了一个片(且能按正确的顺序重新组装片),使用偏移字段指定该片应该放在初始 IP 数据报的哪个位置。
除了最后一片的所有初始有效载荷数据的数量应当是 8 字节的倍数,并且偏移值应当被规定以 8 字节块为单位。
6. IPv4编址
因特网的地址分配策略被称为无类别域间路由选择(Classless Interdomain Routing, CIDR)。CIDR 将子网寻址的概念一般化了。因为对于子网寻址,32 比特的 IP 地址被划分为两部分,并且也具有点分十进制数形式 a.b.c.d/x,其中 x 指示了地址的第一部分中的比特数。形式为 a.b.c.d/x 的地址的 x 最高比特构成了 IP 地址的网络部分,并且经常被称为该地址的前缀。
在 CIDR 被采用之前,IP 地址的网络部分被限制为长度为8、16 或 24 比特,这是一种称为分类编址的编址方案,这是因为具有 8、16、24 比特子网地址的子网分别被称为 A、B 和 C 类网络。
当一台主机发出一个目的地址为 255.255.255.255 的数据报时,该报文会交付给同一个网络中的所有主机。
7. DHCP
动态主机配置协议(Dynamic Host Configuration)DHCP 允许主机自动获取(被分配)一个 IP 地址。网络管理员能够配置 DHCP,以使某给定主机每次与网络连接时能够得到一个相同的 IP 地址,或者某主机将被分配一个临时的 IP 地址,该地址在每次与网络连接时也许是不同的。除了主机 IP 地址分配外,DHCP 还允许一台主机得知其他信息,例如它的子网掩码、它的第一跳路由器地址(常称为默认网关)与它的本地 DNS 服务器的地址。
DHCP 协议是一个 4 个步骤的过程:
- DHCP 服务器发现。一台新到的主机的首要任务是发现一个要与其交互的 DHCP 服务器。这可通过一个 DHCP 发现报文来完成,客户在 UDP 分组中向端口 67 发送该发现报文。DHCP 客户生成包含 DHCP 发现报文的 IP 数据报,其中使用广播目的地址 255.255.255.255 并且使用“本主机”源地址0.0.0.0。DHCP客户将该数据报传递给链路层,链路层然后将该帧广播到所有与该子网连接的子网。
- DHCP 服务器提供。DHCP 服务器收到一个 DHCP 发现报文时,用一个 DHCP 提供报文对客户做出响应,仍然使用 IP 广播地址 255.255.255。每台服务器提供的报文包含有收到的发现报文的事务 ID、向客户推荐的 IP 地址、网络掩码以及 IP 地址租用期,即 IP 地址有效的时间量。
- DHCP 请求。新到达的客户从一个或多个服务器提供中选择一个,并向选中的服务器提供一个 DHCP 请求报文进行响应,回显配置参数。
- DHCP ACK。服务器用 DHCP ACK 报文对 DHCP 请求报文进行响应,证实所要求的参数。
仅最后两步是必要的。
8. NAT
NAT 能使路由器对于外界来说甚至不像一台路由器。NAT 路由器对外界的行为反过来就如同一个具有单一 IP 地址的单一设备。技巧就是使用在 NAT 路由器上的一张 NAT 转换表,并且在表项中包含了端口号及其 IP 地址。
假设一个用户坐在家庭网络主机 10.0.0.1 旁,请求 IP 地址为128.119.40.186 的某台 Web 服务器(端口 80)上的一个 Web 页面。主机 10.0.0.1 为其指派了(任意)源端口号 3345 并将该数据包发送到 LAN 中。NAT 路由器收到该数据报,为该数据包生成一个新的源端口号 5001,将源 IP 替代为其广域网一侧接口的 IP 地址 138.76.29.7,且将源端口 3345 更换为新端口 5001。当生成一个新的源端口号时,NAT 路由器可选择任意一个当前未在 NAT 转换表中的源端口号。(注意到因为端口号字段为 16 比特长,NAT 协议可支持超过 60000 个并行使用路由器广域网一侧 IP 地址的连接!)路由器中的 NAT 也在它的 NAT 转换表中增加一表项。Web 服务器并不知道刚到达的包含 HTTP 请求的数据报已被 NAT 路由器进行了改装,它会发回一个响应报文,其目的地址是 NAT 路由器的 IP 地址,其目的端口是 5001。当该报文到达 NAT 路由器时,路由器使用目的 IP 地址与目的端口号从 NAT 转换表中检索出家庭浏览器使用的适当 IP 地址(10.0.0.1)和目的端口号(3345)。于是,路由器改写该数据报的目的 IP 地址与目的端口号,并向家庭网络转发该数据报。
9. ICMP
ICMP 由 [RFC 792] 定义,被主机和路由器用来彼此沟通网络层的信息。ICMP 最电影的用途是差错报告。例如,当运行一个 Telnet、FTP 或 HTTP 会话时,“目的网络不可达”之类的错误报文就是在 ICMP 中产生的。在某个位置,IP 路由器不能找到一条路径,以通往 Telnet、FTP 或 HTTP 应用所指定的主机。该路由器就会向源主机创建和发出一个类型为 3 的 ICMP 报文以指示该错误。
ICMP 通常被认为是 IP 的一部分,但从体系结构上讲它是位于 IP 之上的,因为 ICMP 报文是承载在 IP 分组中的。
ping 程序发送一个 ICMP 类型 8 编码 0 的报文到指定主机。看到该回显(echo)请求,目的主机发回一个类型 0 编码 0 的 ICMP 回显回答。
为了判断源和目的地之间所有路由器的名字和地址,源主机中的 Traceroute 向目的主机发送一系列普通的 IP 数据报。这些数据报携带了具有一个不可达 UDP 端口号的 UDP 报文段。第一个数据报的 TTL 为 1,第二个的 TTL 为 2,以此类推。该源主机也为每个数据报启动定时器。当第 n 个数据报到达第 n 台路由器时,第 n 台路由器观察到这个数据报的 TTL 正好过期。根据 IP 协议规则,路由器丢弃该数据报并发送一个 ICMP 告警报文给源主机(类型 11 编码 0)。该告警报文包含了路由器的名字与它的 IP 地址。当该 ICMP 报文返回源主机时,源主机从定时器得到往返时延,从 ICMP 报文中得到第 n 台路由器的名字与 IP 地址。这些数据报之一将最终沿着这条路到达目的主机。因为该数据报包含了一个具有不可达端口号的 UDP 报文段,该目的主机将向源主机发送一个端口不可达的 ICMP 报文。当源主机收到这个特别的 ICMP 报文时,知道它不需要再发送另外的探测分组。(标准的 Traceroute 程序实际上使用相同的 TTL 发送 3 个一组的分组;因此 Traceroute 输出对每个 TTL 提供了 3 个结果。)