这一次将总结IP层的分用中的UDP与IGMP。UDP是一个简单的面向数据报的运输层协议,它提供不可靠服务:它把应用程序的数据加上UDP头部之后就传递给IP层发送出去,但是并不能保证它们能到达目的地。应用程序必须关心IP数据报的长度,如果它超过网络的MTU,那么就要对IP数据报进行分片。如果需要,源端到目的端之间的每个网络都要进行分片,并不只是发送端主机连接第一个网络才这样做。IGMP是一种支持主机和路由器进行多播的Internet组管理协议。广播和多播只能应用于UDP,所以我在这里把UDP和IGMP放在一起总结了,书中也是这样的顺序,呵呵。
1. UDP:用户数据报协议
下图是UDP首部的格式:
端口号表示发送进程和接收进程。UDP长度字段指的是UDP首部和UDP数据的字节长度,该值等于IP数据报总部中的IP数据报长度减去TCP首部的长度。UDP检验和(可选)覆盖UDP首部和UDP数据,计算方法跟我们前面提到的IP首部检验和的计算方法一致。如果遇到UDP数据为奇数字节,则填充一字节的0. 计算时,还将在UDP首部前加上UDP伪首部,目的是让UDP两次检查数据是否已经正确到达目的地。下图是伪首部和字节填充的示意图:
我们提到过网络的MTU,也提到过IP数据报首部中的MF和DF位以及13位偏移位,当UDP数据报的长度超过网络的MTU时,必须对其进行分片。如果设置了DF位但是通过某个网络时需要分片,将会产生ICMP“不可达(需要分片)”的差错报文,我在前面的ICMP部分居然写着写着就把它给忘了。新一些的路由器都允许在ICMP首部8个字节的每7~8字节(那里被要求设置成0)中返回自己的MTU。分片需要注意的是:(1)在分片时,除最后一片外,其他每一片中的数据部分(除IP首部外的其余部分)必须是8整数倍(这是为什么呢?后面的习题也有瓿,我目前还不知道。。。);(2)运输层首部只出现在第一片中。UDP比较简陋,所有包丢失、重传问题都必须由上层应用程序来管理。
2. 互联网的地址、广播、多播
互联网地址有5类,格式如下:
有三类地址:单播地址,多播地址和广播地址。主机号为全0代表网络号,主机号为全1代表在该网络的广播。有四种广播地址:
一是受限的广播地址255.255.255.255.该地址用于主机配置过程中IP数据报的目的地址,在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样数据报仅出现在地址网络中。
二是指向网络的广播地址,主机号为全1.如A类广播地址为netid.255.255.255,一个路由器必须转发指向网络的广播。
三是指向子网的广播。指向子网的广播地址为主机号为全1且有特定子网号的地址。作为子网直接广播地址的IP地址需要了解子网的掩码,例如,如果路由器收到发往128.1.2.255的数据报,当B类网络128.1的子网掩码为255.255.255.0时,该地址就是指向子网的广播地址;但如果该子网的掩码为255.255.254.0,该地址就不是指向子网的广播地址。
四是指向所有子网的广播。指向所有子网的广播也需要了解目的网络的子网掩码,以便与指向网络的广播地址区分开来,指向所有子网的广播地址的子网号和主机号全为1.例如,如果目的子网掩码为255.255.255.0,那么IP地址128.1.255.255就是一个指向所有子网的广播地址,然而,如果网络没有划分子网,这就是一个指向网络的广播。
广播给网络中的主机产生了很多负担,广播的数据报要直到UDP层才被确定是否为主机所需要(没有监听的端口)然后才会被丢弃。多播是介于单播与广播之间的一种方式。
能够接收发往一个特定多播组地址数据的主机集合称为主机组。一个主机组可以跨越多个网络,主机组中成员可以随时加入或离开主机组。主机组中对主机的数量没有限制,同时不属于某一主机组的主机可以向该组发送信息。
下图是多播组地址到以太网地址的转换:
之所以是23位映射,听说是发明组播的那个人(当时还是个博士)的导师只肯给他买半个A类地址做实验,所以就只映射了23位。这是我在某次网络课的时候迷迷糊糊听到的,嘿嘿。
3. IGMP协议
多播路由器使用IGMP报文来记录与该路由器相连网络中组成员的变化情况,其报文格式如下:
规则如下:
(1)当第一个进程加入一个组时,主机发送一个IGMP报告,如果有多个进程加入同一个组,只需发送一个报告;
(2)进程离开一个组时,不需要发送任何报告;后期路由器发送IGMP查询时,不再发送报告;
(3)多播路由器定时发送(向每个接口)IGMP查询来了解是否还有任何主机包含有属于多播组的进程,此时IGMP查询报文中的组播地址被设置为0.
(4)主机通过发送IGMP报告来响应一个IGMP查询,对每个至少还包含一个进程的组均要发回IGMP报文。
我记得上网络课时还提到过多种算法来减少网络中的流量,包含剪枝、抑制之类的。总之,一个核心思想是,多播路由器并不关心有多少主机属于一个多播组,它只是想知道给定接口上的多播组是否还有人对这个多播组感兴趣。