一、UDP协议
UDP 是一个简单的面向数据报的运输层协议,进程的每个输出操作都产生一个UDP数据报,并组装成一份待发送的IP数据报。UDP不提供可靠性。 UDP封装格式:
1、UDP首部:
16位源端口号 |
16位目的端口号 |
16位UDP长度 |
16位UDP检验和 |
数据(如果有) |
端口号表示发送和接收的进程。 UDP长度字段指的是UDP首部和UDP数据的字节长度,该字段的最小值是8,表示没有数据。该长度不包括IP首部长度。 UDP检验和包括UDP首部和UDP数据的检验和。由于UDP数据报的长度可以为奇数字节数,因此计算时在最后增加填充字节0,这只是为了检验和的计算。
2、 UDP检验和
UDP和TCP首部都包含一个12字节的伪首部,包含了IP首部和自身的一些字段,主要是为了计算检验和而设置的。伪首部是不占实际空间的。伪首部包含IP首部的一些字段,目的是让UDP两次检查数据是否已经到达目的地,以及IP层是否正确地传输了数据。 UDP伪首部格式如下:
32位源IP地址 |
32位目的IP地址 |
0 |
8位协议(17) |
16位UDP长度 |
16位源端口 |
16位目的端口 |
16位UDP长度 |
16位UDP检验和 |
数据(如果有) |
前12个字节就是UDP伪首部。
注意:UDP数据报的长度在检验和计算过程中出现两次。如果检验和的计算结果为0,则存入的值为全1(65535),如果传送的检验和是0,则说明发送端没有计算检验和。如果有错误,该报就被丢弃,不产生任何差错报文。
3、 IP分片
任何IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据,并查询该接口的MTU。IP把MTU与数据报的长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发送在中间路由器上。IP数据报分片后,只有到达目的主机后才进行重装。 IP首部与分片有关的字段:
- (1)对于每份IP数据报来说,都有一个标识字段,该值在分片时被复制到每个片中。
- (2)标志字段用其中一个bit表示“更多的片”,除最后一片外,其他每个分片都要设置为1。
- (3)片偏移字段指的是该片偏移原始数据报开始处的位置。
- (4)数据报被分片后,每个片的总长度要改为该片的长度值。
- (5)标志字段中有一个bit表示“不分片”,如果该位1,IP将不对数据报进行分片。
IP报即使丢失一片数据报也要重传整个数据报。为什么呢?因为IP层没有超时重传的机制,必须由更高层负责超时重传。
4、ICMP不可达差错(需要分片)
当路由器收到一份需要分片的数据报,而在IP首部又设置了不分片(DF)的标志位。如果需要判断到达目的端的路途中最小MTU是多少,就可以通过这个差错实现。 报文格式如下:
类型3 |
代码4 |
检验和 |
保留,必须为0 |
下一站的MTU |
IP首部+原始IP数据报中数据前8位 |
可以用Traceroute确定路径MTU。要做的是发送分组,并设置“不分片”标志位。发送的第一个分组的长度正好与出口MTU相等,每次收到ICMP“不能分片”差错时,就减少分组的长度。如果路由器发送的ICMP差错报文是上面格式,包含出口的MTU,那么就用该MTU值来发送,否则就用下一个最小的MTU值来发送。MTU值的个数是有限的,因此可以取得路径的MTU。
5、 UDP服务器的设计:
- (1)客户IP地址及端口号:Ip首部包括源端和目的端IP地址,UDP首部包括了远端和目的端的端口号。
- (2)目的IP地址
- (3)UDP输入队列:通常程序所使用的每个UDP端口都与一个有限大小的输入队列相联系。也就是来自不同客户的差不多同时到达的请求将由UDP自动排队,接收到的UDP数据报以其接收顺序交给应用程序。
- (4)限制本地IP地址:大多数UDP服务器在创建UDP端口时都使其本地IP地址具有通配符的特点,表明进入的UDP数据报如果其目的地位服务器端口,那么在任何本地接口均可接收到它。如果该端口设置位某接口的端口号,则只有发送给该接口的UDP数据报能收到。可以在同一个端口上启动多个服务器,如以太网有一个,以太网广播有一个。
- (5)限制远程IP地址:UDP也可以设定只能收到指定IP地址和端口号的UDP数据报。
二、广播
- 1、受限的广播:受限的广播地址是255.255.255.255,该地址用于主机配置过程中IP数据报的地址,此时,主机可能还不知道它所在网络的网络掩码,甚至连它的IP地址也不知道。在任何情况下,路由器都不转发目的地址为受限广播地址的数据报,这样的数据报只出现在本地网络中。
- 2、指向网络的广播:指向网络的广播地址是主机号全为1的地址,A类网络广播地址为netid.255.255.255,其中netid为A类网络的网络号。
- 3、指向子网的广播:指向子网的广播地址是主机号全为1的地址,作为子网直接广播的IP地址需要知道子网的掩码。如果B类网络128.1的子网掩码是255.255.255.0,则地址128.1.2.255就是对应子网的广播地址。
- 4、指向所有子网的广播:指向所有子网的广播也需要知道目的网络的子网掩码。这些广播地址的子网号和主机号全为1。如果目的子网掩码是255.255.255.0,那么IP地址128.1.255.255就是一个指向所有子网的广播地址。
三、多播 IP多播主要向多个目的地发送数据,还可以无盘工作站启动时确定启动引导服务。多博地址是D类地址,格式如下:
1、多播地址包括为1110地最高4位和多播组号: 范围为:224.0.0.0到239.255.255.255。能够接收发往一个特定多播组地址数据地主机集合称为主机组,一个主机组可以跨越多个网络。主机组中成员可随时加入或离开主机组,主机组中对主机地数量没有限制,同时不属于某一主机组地主机可以向该组发送信息。 一些多播组地址为知名地址: 224.0.0.1-该子网内地所有系统组
224.0.0.2-该子网内地所有路由器组
224.0.1.1-网络时间协议NTP
224.0.0.9-RIP2
224.0.1.2-SGI公司的dogfight应用
2、多播地址到以太网地址的转换: IANA拥有一个以太网地址块,即高位24位为00-00-5e,这意味这该地址块所拥有的地址范围从00-00-5e-00-00-00到00-00-5e-ff-ff-ff。IANA将其中的一般分配为多播地址。为了指明一个多播地址,任何以太网地址的首字节必须为01,这意味者与IP多播相对应的以太网地址范围从01-00-5e-00-00-00到01-00-5e-7f-ff-ff。 这种地址分配将使以太网多播地址的23位与IP多播组号相对应起来,通过将多播组号中的低23位映射到以太网地址中的低23位事项。 由于多播组号中的最高5位在映射过程中被忽略,因此每个以太网多播地址对应的多播组是不唯一的,32个不同的多播组号被映射位一个以太网地址。例如,多播地址224.128.64.32(16进制为e0-80-40-20)和224.0.64.32(16进制为e0-00-40-20)都映射为同一以太网地址01-00-5e-00-40-20。 既然地址映射不是唯一的,那么设备驱动层或IP层就必须对数据报进行过滤,因为网卡可能收到主机不想接收的多播数据帧。
四、IGMP:Internet组管理协议
IGMP 让一个物理网络上的所有系统知道主机当前所在的广播组。多播路由器需要这些信息以便知道多播数据报应该向哪些接口转发。IGMP也被当作IP层的一部分,IGMP报文通过IP数据报进行传输,其报文格式如下:
4位版本1 |
4位类型(1-2) |
未用 |
检验和 |
32位组地址(D类IP地址) |
IGMP类型位1说明是由多播路由器发出的查询报文,为2说明是主机发出的报告报文。 检验和的计算和ICMP协议一样。 组地址为D类IP地址,在查询报文中组地址设置为0,在报告报文中组地址为要参加的组地址。
1、加入一个多播组
进程以某种方式在给定的接口上加入某个多播组,进程也能离开先前加入的多播组。一个进程可以在多个接口上加入同一多播组。主机通过组地址和接口来标识一个多播组。主机必须保留一个表,该表中包含所有至少含有一个进程的多播组及多播组中的进程数量。
2、IGMP报告和查询 多播路由器通过IGMP报文来记录与该路由器相连网络中组成员的变化情况,规则如下:
- (1) 当第一个进程加入组时,主机就发送一个IGMP报告。如果主机的多个进程加入同一组,只发送一个IGMP报告。这个报告被发送到进程加入组所在的同一接口上。
- (2) 进程离开一个组时,主机不发送IGMP报告,即使时组中最后一个进程离开。主机知道在确定的组中已不再由组成员后,在随后的IGMP查询中就不再发送报告报文。
- (3) 多播路由器定时发送IGMP查询是否还有任何主机包含有属于多播组的进程。多播路由器必须向每一个接口发送IGMP查询。因为路由器希望主机对它加入的每个多播组均返回一个报告,因此IGMP查询报文中的组地址被设置为0。
- (4) 主机通过发送IGMP报告来响应一个IGMP查询,对每个至少还包含一个进程的组均要发回IGMP报告。
3、实现细节
- (1) 当一个主机首次发送IGMP报告时,并不保证该报告被可靠地接收,下一个报告将在间隔一段时间后发送。
- (2) 当一个主机收到从一个路由器发出地查询后,并不立即响应,而是经过一定的时间间隔后才发出一些响应。
- (3) 一个主机在等待发送报告的过程中,却收到了发自其他主机的相同报告,则该主机的响应就不用发送了。
- (4) 在没有任何多播路由器的单个物理网络中,仅有的IGMP通信量就是在主机加入一个新的多播组时,支持IP多播的主机发送的报告。
4、生存时间字段
IGMP报告和查询的生存时间(TTL)均设置为1,这将使多播数据报仅限于同一子网内传送。更大的TTL值能被多播路由器转发。224.0.0.0-224.0.0.255的特殊地址使打算用于多播范围不超过1跳的应用,不管TTL是多少,多播路由器均不转发目的地址为这些地址中的任何一个地址的数据报。
5、所有主机组
224.0.0.1地址称为所有主机组地址,它涉及在一个物理网络中所有具备多播能力的主机和路由器。当接口初始化后,所有具备多播能力接口上的主机均自动加入这个多播组。这个组的成员无需发送IGMP报告。 |