赞
踩
声明:本博客参考自《TCP/IP详解卷一:协议》
UDP是一个简单的面向数据报的运输层协议。进程的每个输出操作都会产生一个UDP数据报,并组装成一份待发送的IP数据报。
UDP把应用程序传给IP层的数据报发送出去,但是并不保证数据报一定到达,是一种不可靠的传输协议。正是因为它不做任何的检测,所以它有着很快的传输速率,适合对实时性要求比较高的通信环境。
①端口号用来区分发送进程(源端口)和接收进程(目的端口)。注意TCP端口和UDP端口是相互独立的,同一个端口号可以用于TCP和UDP。但是,如果TCP和UDP同时提供某种知名服务,它们的端口一般是相同的。
②UDP长度字段指的是UDP首部和UDP数据的字节长度。该字段的最小值为8字节(0字节UDP数据报)。IP数据报长度指的是数据报全长,因此UDP数据报长度是全长减去IP首部的长度。
③UDP检验和覆盖UDP首部和UDP数据。UDP的数据报的长度可以为奇数字节,但是计算检验和的时候是16bit字相加。这种时候一般会在最后填充0字节。UDP数据报和TCP数据报都会在计算检验和的时候增加伪首部,其目的是让UDP两次检查数据是否正确到达目的地。下图是计算检验和时,各个字段的内容。
如果发送端没有计算检验和而接收端检测到检验和有差错,那么UDP数据报被悄悄丢弃,不产生任何差错报文。
物理网络一般要限制每次发送数据帧的最大长度。任何时候IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其MTU,并确定是否需要分片。当一份数据报分片之后,只有到达目的地之后才进行重组,重组的操作是由IP层来进行处理的。已经分片过的数据报可能会再分片,这要根据路径上的MTU来决定。
对于发送端发送的每一份IP数据报来说,其标识字段都包含唯一值。该值在数据报分片时被复制到每一片中。对照着下面IP首部的报文格式,我们来说明一下。
3位标志字段其中一个比特来表示"更多的片"。除最后一片外,其它每个组成数据报的片都把该比特置1。片偏移字段指的是该片偏移原始数据报开始处的位置。3位标志字段中的“不分片”位,表示如果将该比特置1,IP将不对数据分片。需要分片的时候,会将该数据报丢弃并发送一个ICMP差错报文("需要分片但设置了不分片比特差错")给发送端。
使用UDP发送1473字节的用户数据,IP层分片的格式如下:
①在分片时,除最后一片外,其他每一片的数据部分(除IP首部外)必须是8字节的整数倍。
②分片的每一片都有IP首部,但只有第一片有传输层首部。
③MTU的最大长度:IP首部(20)+UDP首部(8)+用户数据(1472)=1500
当路由器接收到一份需要分片的数据报,而在IP首部又设置了不分片(DF)的标志比特,就会产生一份需要分片但又设置不分片标志比特的ICMP不可达差错报文。这种类型的报文可以被用来发现到达目的端的路途中最小MTU是多少。下图是这种ICMP不可达差错报文的格式:
如果路由器不提供通告MTU的选项或者进行了特殊设置,则下一站网络MTU会被设置成0。
Traceroute程序可以记录IP数据报从一台主机到另一台主机所经过的路由。ping程序的记录路由选项(RR)有着诸多的限制,而Traceroute程序只需要目的端运行一个UDP模块即可。
Traceroute程序使用ICMP报文和IP首部的TTL字段。每个处理数据报的路由器都需要把TTL的值减1,当路由器收到一份IP数据报,如果其TTL字段是0或1,则路由器不转发报文并向发送端发送一份ICMP“超时信息”。Traceroute程序的关键在于包含这份ICMP信息的IP报文的发送端是该路由器的IP地址。
Traceroute程序的操作过程如下面的描述所示:
①它发送一份TTL字段为1的UDP数据报给目的主机。处理这份数据报的第一个路由器将TTL的值减1,丢弃该报文并发回一份超时ICMP报文,这样就得到该路径中的第一个路由器的地址。
②它发送一份TTL字段为2的UDP数据报给目的主机,同理可以得到第二个路由器的地址。依此类推,可得的第n个路由器地址。
③由于Traceroute程序发送的UDP数据报,它选择一个不可能的值作为UDP端口,当数据到达目的主机时,将使目的主机的UDP模块产生一份"端口不可达"错误的ICMP报文。发送端就可以以此判断数据报到达目的主机。
Traceroute程序发送的UDP数据报一共40个字节:IP首部(20)+UDP首部(8)+用户数据(12)。其中用户数据包含每发一个数据报就加一的序列号,送出TTL的副本以及发送数据的时间。
ICMP"超时"报文的格式如下:
这种由TTL产生的报文,代码字段为0。主机在组装分片的时候也有可能发生超时,这时发送的超时报文代码字段为1。
关于Traceroute的几点说明:
①不能保证现在的路由也是将来所有采用的路由,甚至两份连续的IP数据报都可能采用不同的路由。
②不能保证ICMP报文的路由与Traceroute程序发送的UDP数据报采用同一路由,这表明Traceroute计算的往返时间可能不准。
③返回ICMP报文中的发送端IP地址是UDP数据报到达的路由器接口的IP地址。注意与IP记录路由选项区分开来。
通常IP路由是动态的,每个路由器自主判断数据报的转发路由器,应用程序不应该进行控制。但是源站路由的选项打破了这个限制。源站路由(source routing)是由发送者指定路由,它可以采用如下的两种形式:
①严格源站路由。发送端指明IP数据报所必须采用的确切路径。如果某一个路由器发现源站路由所指定的下一个路由器不在其直接连接的网络上,那么它就返回一个"源站路由失败"的ICMP差错报文。
②宽松源站路由。发送端指明一个数据报经过的IP地址清单,但是数据报在清单上指明任意两个地址之间可以通过其他路由器。
IP首部中源站路由选项的通用格式如下:
这个格式与记录路由选项的格式基本相同。不同之处在于,对于源站路由选项,在发送IP之前必须填充IP地址清单;而记录路由选项,需要为IP地址清单分配一些空间,并让路由器填充该清单的各项。
对于宽松源站路由来说code字段为0x83,而严格源站是0x89。
在上图中,主机上的应用程序发送一份数据报到D,指定源站路由为R1,R2和R3。#b表示指针字段,对应源站路由选项通用格式的ptr。
说明:
①发送主机从应用程序接收源站路由清单,将最终目的地址D换成R1,将源站路由表向前移动,将D放入源站路由表最后。
③每经过一个路由器都将现在的目的地址放入路由表最后,将路由表第一个地址放入下一站地址中。
当应用程序接收到由发送端指定的路由数据时,在发送应答时,应该读出接收到的路由值,并提供反向路由。
traceroute如何设置:
宽松源站路由:traceroute -g IP或域名 最多可以指定8个
严格源站路由:traceroute -G IP或域名 最多可以指定8个
可以通过traceroute来确定路径MTU,要做的是发送分组,并设置“不分片”标志比特。发送的第一个分组的长度正好与出口MTU相等,每次收到ICMP“不能分片”差错时就减小分组的长度。如果路由器发送的ICMP差错报文包含MTU,那么就用该MTU值来发送,否则就用下一个最小的MTU值来发送。
理论上IP数据报的最大长度是65535字节,这是由IP首部16比特总长度字节所限制的。去除20字节的IP首部和8字节的UDP首部。UDP数据报中用户数据的最长长度为65507字节。但是大多数实现所提供的长度比这个最大值小。
第一:应用程序可能会受到程序接口的限制。
第二:TCP/IP的内核实现。可能存在一些实现特性,使IP数据报的长度小于65535字节。
UDP编程接口允许应用程序指定每次返回的最大字节数,如果接收到的数据报长度大于应用程序所能处理的长度,数据会被截断。而TCP提供的是字节流,数据没有边界,所以不会发生数据截断的情况。
当一个系统(路由器或主机)接收数据的速度比其处理数据的速度快的时候,可能会发生这个差错,但是不一定会发生。即使系统已经开始丢弃数据。
下图是源站抑制报文的格式:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。