UDP:用户数据报协议
进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联系。
由于IP层已经把IP数据报分配给TCP或UDP(根据I P首部中协议字段值),因此TCP端口号由TCP来查看,而UDP端口号由UDP来查看。TCP端口号与UDP端口号是相互独立的。尽管相互独立,如果TCP和UDP同时提供某种知名服务,两个协议通常选择相同的端口号。这纯粹是为了使用方便,而不是协议本身的要求。
UDP长度字段指的是UDP首部和UDP数据的字节长度。该字段的最小值为8字节(发送一份0字节的UDP数据报是OK)。
UDP检验和覆盖UDP首部和UDP数据(TCP同,但是TCP检验和是必须的,UDP检验和是可选的)。IP首部的检验和它只覆盖IP的首部并不覆盖IP数据报中的任何数据。
伪首部包含IP首部一些字段。其目的是让UDP两次检查数据是否已经正确到达目的地(根据目的IP检验是否是发送给本机的数据,根据协议号把数据交付上层——TCP或UDP)。
UDP数据报长度在传输过程中会计算两次,如果检验和的计算结果为0,则存入的值为全1(65535),这在二进制反码计算中是等效的。如果传送的检验和为0,说明发送端没有计算检验和。
IP分片
分片发生在物理层,任何时候IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其MTU。IP把MTU与数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。
数据到目的端重新组装由IP层来完成。发送端发送每份IP数据报时,其标识字段包含唯一值,该数值在分片时被复制到每一个片中。
- 标识字段(MF)——更多片:除了最后一片外都被设置为1
- 标识字段(DF)——不分片:置1IP将不对数据报分片,对数据报丢弃发送ICMP差错
- 片偏移是该片距原始数据报开始处位置
- 分片后每个数据报都有自己的IP首部,选择路由时与其他数据报独立
- 丢失一个分片将重传整个IP数据报(不清楚分片位置,不清楚如何被分片)
- 分片后,除了最后一片,其他每片的数据部分必须是8的整数倍
- 任何运输层只出现在第一片数据报中
最大UDP数据报长度
理论上IP数据报的最大长度是65535字节,这是由IP首部16比特总长度字段所限制的。去除20字节的IP首部和8个字节的UDP首部, UDP数据报中用户数据的最长长度为65507字节。
限制因素:
- 应用程序可能会受到其程序接口的限制。UDP socket,这个长度与应用程序可以读写的最大UDP数据报的长度直接相关。现在的大部分系统都默认提供了可读写大于8192字节的UDP数据报。
- TCP/IP的内核实现
数据报截断
由于IP能够发送或接收特定长度的数据报并不意味着接收应用程序可以读取该长度的数据,UDP编程接口允许应用程序指定每次返回的最大字节数。
如果接收到的数据报大于应用程序能够处理的长度则取决于系统实现:1.丢弃该部分数据报;2.下次进行读取,不通知从单个的UDP数据报中进行多次读取操作。
UDP服务器的设计
客户端IP及端口号
IP首部包含源端和目的端IP地址, UDP首部包含了源端和目的端的UDP端口号。
目的IP地址
要求操作系统从接收到的UDP数据报中将目的I P地址交给应用程序。
UDP输入队列
程序所使用的每个UDP端口都与一个有限大小的输入队列相联系。这意味着来自不同客户的差不多同时到达的请求将由UDP自动排队。接收到的UDP数据报以其接收顺序交给应用程序(在应用程序要求交送下一个数据报时)。
- 应用程序并不知道其输入队列何时溢出。只是由U D P对超出数据报进行丢弃处理。
- 没有发回任何信息告诉客户其数据报被丢弃
- UDP输出队列是FIFO,ARP输入却是LIFO
限制本地IP地址
- 数UDP服务器在创建UDP端点时都使其本地IP地址具有通配符的特点。这就表明进入的UDP数据报如果其目的地为服务器端口,那么在任何本地接口均可接收到它。
- 当服务器创建端点时,它可以把其中一个主机本地IP地址包括广播地址指定为端点的本地IP地址。只有当目的IP地址与指定的地址相匹配时,进入的UDP数据报才能被送到这个端点。
- 有可能在相同的端口上启动不同的服务器,每个服务器具有不同的本地IP地址。但是,一般必须告诉系统应用程序重用相同的端口号没有问题。
- 如果存在一个含星号的IP地址,那么就隐含了一种优先级关系。如果为端点指定了特定IP地址,那么在匹配目的地址时始终优先匹配该IP地址。只有在匹配不成功时才使用含星号的端点。
每个端口有多个接收者
当UDP数据报到达的目的IP地址为广播地址或多播地址,而且在目的IP地址和端口号处有多个端点时,就向每个端点传送一份数据报的复制(端点的本地IP地址可以含有星号,它可匹配任何目的IP地址)。但是,如果UDP数据报到达的是一个单播地址,那么只向其中一个端点传送一份数据报的复制。选择哪个端点传送数据取决于各个不同的系统实现。
?