(参考文献)TCP/IP详解,卷1:协议
UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。UDp数据报封装成IP数据报格式如下图:
UDP首部
UDP首部的各个字段如下图:
端口号表示发送进程和接收进程。由于IP层已经把数据报分配给TCP或者UDP(根据IP首部中协议字段值),因此TCP端口号有TCP查看,UDP端口号由UDP查看。TCP端口号与UDP端口号时是相对独立的。
UDP长度字段指的是UDP首部和UDP数据的字节长度。该字段的最小值为8字节(即没有数据时的情况)。
UDP和TCP在首部中都有覆盖他们首部和数据的校验和。UDP校验和是可选的,而TCP校验和是必须的。
IP分片
物理网络层一般要限制每次发送数据帧的最大长度。任何时候IP层收到一份要发送的IP数据报时,他要判断向本地哪个接口发送数据(选路),并查询该接口获取MTU。IP把MPU和数据报进行比较较,如果需要。则进行分片。分片可以发生在原始发送端上,也可以发送在中间路由器上。
把一数据报进行分片后,只有到达目的地才进行重新组装(这里的重新组装与其他网络协议不同,他们要求下一站就进行重新组装,而不是在最终目的地)。重新组装由目的地的IP层来完成。已经分过片的数据报有可能再次进行分片。IP首部中包含的数据位分片和重组提供了足够的信息。
如上图,对于发送端发送的每份IP数据报来说,其标识字段都包含一个唯一值。该值在数据报分片时被复制到每个片中。标志字段用一个比特位来表示“更多的片”。除了最后一片外,其他每个组成数据报的片都要把该比特置一。片偏移字段指的是该片偏移原始数据报开始处的位置。另外,该数据报被分片后,每个片的总长度值要为该片的长度值。
最后,标志字段中有一个比特称作“不分片”位。如果将这一比特置1,IP将不对数据报进行分片。相反把数据报丢弃并发送一个ICMP差错报文(需要进行分片但设置了不分片比特)给起始端。
当IP数据报被分片后,每一片都成为一个分组,具有自己的IP首部,并在选择路由时和其他分组独立。这样,当数据报到达目的端时有可能失序,但是在IP首部中有足够的信息让接收端能正确组装这些数据片。
IP数据报与分组
IP数据报是指IP层端到端的传输单元(在分组之前和重新组装之后)。分组是指在IP层和链路层之间传送的数据单元,一个分组可以是一个IP数据报,也可以是IP数据报的一个分片。
广播和多播
IP 地址分三种:单播地址、广播地址和多播地址。
广播和多播仅应用于UDP,它们对需将报文同时传往多个接收者的应用来说十分重要。TCP是一个面向连接的协议,它意味着分别运行于两主机内的两进程间存在一连接。
考虑包含多个主机的共享信道网络,如以太网。每个以太网帧包含源主机和目的主机的以太网地址(48bit)。通常每个以太网帧仅发往单个目的主机,目的地址指往单个接收接口,因而称为单播。
然而,有时候一个主机要向网络上的所有主机发送帧,这就是广播。通过ARP和RARP可以看到这一过程。多播处于单播和广播之间,帧只发送属于多播组的多个主机。
要了解广播和多播,需要了解主机对由信道传送过来帧的过滤过程。
首先,网卡查看由信道传送过来的帧,确定是否接受该帧,若接收后就把他传往设备驱动程序。通常网卡仅接收那些目的地址为网卡物理地址或广播地址的帧。另外,多数接口被设置为混杂模式,这种模式能够接收每个帧的一个复制。
目前,大多数的网卡经过配置都能接收目的地址为多播地址或某些子网多播地址的帧。对于以太网,当地址中最高啊字节的最低位设置为1时表示改地址是一个多播地址,用十六进制可表示为01:00:00:00:00:00(以太网广播地址ff:ff:ff:ff:ff:ff可以看做是以太网多播地址的特例)。
如果网卡收到一个帧,这个帧将被传送给设备驱动程序(如果帧检验和错,网卡就会丢弃该帧)。设备驱动程序将进行另外的帧过滤。首先,帧类型中必须指定要使用的协议(IP、ARP等等),其次,进行多播过滤来检查该主机是否属于多播地址说明的多播组。
设备驱动程序随后将数据帧传送给上一层,比如,当帧类型指定为IP数据报时,就传往IP层。IP根据IP地址中的源地址和目的地址进行更多的过滤监测。如果正常,就把数据报再传送给上一层(TCP或UDP层)。
每次UDP收到有IP传送过来的数据报,就根据目的端口号,有时还根据源端口号进行数据报过滤。如果当前没有进程使用目的端口号,就丢弃该数据报,并产生一个ICMP不可到达 报文(TCP根据端口号做相似的处理)。如果UDP数据报出现检验和错,数据报将被丢弃。
多播之于广播出现的原因
使用广播的问题在于,它增加了对广播数据不感兴趣主机的处理负荷。拿一个使用UDP广播应用作为例子。如果网络内有50个主机,但仅有20个参与该应用,每次这20个主机中的一个发送UDP广播数据时,其余30个主机不得不处理这些广播数据报。一直到UDP层收到的广播数据报才会被丢弃。这30个主机丢弃该数据报的原因是因为这些主机没有使用该目的端口。
多播的出现减少了对应用不感兴趣主机的处理负荷。使用多播,主机可以加入一个或者多个多播组,这样网卡就仅接收主机所在多播组的那些数据帧。
广播
广播地址主要有4种:受限的广播、指向网络的广播、指向子网的广播、指向所有子网的广播。
受限的广播
受限的广播地址是255.255.255.255。该地址用于主机配置过程中IP数据报的目的地址,此时,主机可能还不知道它所在网络的网络掩码甚至连他的IP地址也不知道。
在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅出现在本地网络中。
指向网络的广播
指向网络的广播地址是主机号全为1的地址。A类网络广播地址为netid.255.255.255,其中netid为A类网络的网络号。
一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择。
指向子网的广播
指向子网的广播地址为主机号全为1且有特定子网号的地址。作为子网直接广播地址的IP地址需要了解子网的掩码。例如,如果路由器收到发往128.1.2.255的数据报,当B类网络128.1的子网掩码为255.255.255.0时,该地址就是指向子网的广播地址;但如果该子网的掩码为255.255.254时,该地址就不是指向子网的广播地址。
指向所有子网的广播
指向所有子网的广播也需要了解目的网络的子网掩码,以便于指向网络的广播地址区分开。指向所有子网的广播地址的子网号及主机号全为1例如如果目的地址子网掩码为255.255.255.0,那么IP地址128.1.255.255是一个指向所有子网的广播地址。然而,如果网络没有划分子网,这就是一个指向网络的广播。
多播
IP多播提供两类服务:
1. 向多个目的地址传送数据。有许多向多个接收者传递信息的应用:例如交互式会议系统或向多个接收者分发邮件或新闻。如果不采用多播,目前这些应用都采用TCP来完成(向每个目的地址传送一个单独的数据复制)。然而,即使使用多播,某些应用任然采用TCP来保证他的可靠性。
2. 客户对服务器的请求。例如,无盘工作站需要确定启动引导服务器,目前这项服务是通过广播来提供的,但是如果采用多播,则可以降低不提供这项服务主机的负担。
多播组地址
不像其他IP地址(A、B、C类地址),分配的28bit均用作多播组号,而不再表示其他。
多播组地址包括为1110的最高4bit和多播组号。它表示的地址范围从224.0.0.0到239.255.255.255 。
能够接收发往一个特定多播组地址数据的主机集合称为主机组。一个主机组可跨越多个网络。主机组中成员可随时加入或离开主机组。主机组中对主机的数量没有限制,同时不属于某一主机组的主机可以向该组发送信息。
一些多播组地址被IANA确定为知名地址。他们也被当做永久主机组,这和TCP和UDP中的熟知端口相似。例如:224.0.0.1代表“该子网内的所有系统组”,224.0.0.2代表“该子网内的所有路由器组”。多播组地址224.0.1.1用作网络时间协议NTP
。