UDP:用户数据报协议
udp是一种简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报
2.43.15.pngUDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是不保证它们能到达目的地。
UDP首部:
2.45.40.png端口号表示发送进程和接收进程。UDP长度字段表示UDP首部和UDP数据的字节长度。IP数据报的长度是指整个数据报长度。所以UDP数据报长度=IP数据报长度-IP首部长度
UDP检验和只覆盖UDP首部和UDP数据,IP首部的检验和也只覆盖IP的首部。UDP的检验和是可选的,而TCP的检验和是必须的。
UDP数据报和TCP数据报都包含一个12字节的伪首部,目的是为了计算检验和。伪首部包含的IP首部一些字段,是为了让UDP两次检查数据是否已经到达目的地。
2.53.47.png
IP分片
物理网络层一般要限制每次发送数据帧的最大长度。当IP层收到一份要发送的IP数据报时,要判断向本地哪个接口发送数据,查询并获取该接口的MTU。如果需要分片,分片这个过程可以发生在发送端主机上,也可以发生在中间路由器上。
当把一份IP数据报进行分片后,只有到达了目的地才能进行重新组装。重新组装的过程由目的端的IP层来完成。已经分片后的数据报也可能再进行分片。
在IP首部中。
- 每份IP数据报的标识字段都包含唯一的值。标识字段中包含的唯一的值在数据报分片时被复制到每个片中。
- 标示字段中的一个比特位表示“更多的片”,除了最后一片外,其他片都将该位标为1。
- 片偏移字段是该片偏移原始数据报处的位置。
- 分片后,每片的IP首部总长度要改为该片的长度。
- 标示字段由一个比特位是“不分片”位,设置改位后将不会进行分片,但若长度大于MTU,那就只有将数据报丢弃,然后发送一个ICMP差错报文给发送端。
当数据报的这些片到达目的端后可能会失序,但在IP首部中有足够的信息让接受端正确的组装这些片。
缺点:即使只丢失了其中一片数据也要对整个数据报进行重传。
ICMP不可达差错(需要分片)
当路由器收到一份需要分片的数据报,而在IP首部又设置了不分片的标志比特。
可用于判断到达目的端的路途中最小MTU是多少。
3.20.47.png
如果路由器没有提供这种新的ICMP差错报文格式,那么下一站MTU会被设为0
最大UDP数据报长度
理论上,UDP数据报中用户数据的最大长度为IP数据报最大长度减去IP首部和UDP首部=65507字节。
但是大多数实现所提供的长度比这个最大值小:
- 应用程序可能会受到其程序接口的限制。
- TCP/IP内核实现的限制。
IP能发送或接收特定长度的数据报并不意味着接收应用程序可以读到该长度的数据。UDP编程接口允许程序指定每次返回的最大字节数。如果接收到的数据报长度大于应用程序所能处理的长度,那么处理结果取决于编程接口的实现。
ICMP源站抑制差错
当一个系统接收数据报的速度比其处理速度快时,可能产生这个差错(一个系统没有缓存并丢弃了数据,也不一定要求发送源站抑制报文)
格式:
3.42.33.png
UDP服务器的设计
对于服务器,它启动后处于休眠状态,等待客户端请求的到来。
-
来自客户的UDP数据报的IP首部中包含了发送端和目的端的IP地址,UDP首部包含了发送端和目的端的UDP端口号。服务器通过IP地址和端口号就可以知道是谁发送了消息,这就允许一个交互UDP服务器对多个客户进行处理。
-
UDP输入队列。单个服务器进程对单个UDP端口上的所有客户请求进行处理。程序所使用的每个UDP端口都与一个有限大小的输入队列相联系。当排队的数据报太多造成溢出,会发生UDP模块丢弃数据报。
-
限制远端IP地址。大多数系统运行对远端地址进行限制。