UDP是一个简单的面向数据报的运输层协议,进程的每个输出操作正好产生一个UDP数据报,并组成一份待发送的IP数据报。UDP把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。即UDP不提供可靠性。
UDP报头如下所示:
端口号表示发送进程和接收进程的端口号,TCP与UDP的端口号是相互独立的。
UDP长度指的是UDP首部和UDP数据的字节长度。该字段的最小值为8字节,UDP数据报的长度是整个IP数据报的长度减去IP首部的长度。
TCP和UDP段都包含一个12字节长度的伪首部,它是为了计算检验和而设置的。包含IP首部的一些字段,其目的是让UDP两次检查数据是否已经正确到达目的地。如图所示:
若发送端没有计算检验和而接收端检验到的有差错,那么UDP数据报就会被丢弃,不产生任何差错报文。
物理网络层一般要限制每次发送数据帧的最大长度。任何时候IP层接收到一份要发送的数据报时,它先要判断向本地哪个接口发送数据报,并查询该接口获得MTU,IP把MTU与数据报长度做比较,如果需要则进行分片,除最后一个分片外,其余IP报头中的DF位设置为0。
IP数据报到达目的地之后,才会进行重新组装,重新组装由IP层来完成,其目的是使分片和重新组装过程对运输层是透明的。
IP首部有一个byte称作”不分片(DF)”,如果将这一比特置为1,IP将不对数据报进行分片,相反会把数据报丢弃并发送一个ICMP差错报文。当IP数据报被分片之后,每一片都成为一个分组,具有自己的IP首部,并在选路时与其他分组独立。所以数据报到达目的端的时候可能会失序。不过在IP首部中有足够的信息让接收端能正确组装这些数据报片。
发生ICMP不可达差错的另一种情况是,当路由器收到一份需要分片的数据报,而在IP首部又设置了不分片(DF)。
理论上,IP数据报的最大长度是65535个字节,即IP首部16byte长度字段所限制,去掉20字节的IP首部和8字节的UDP首部,UDP数据报的理论最大长度为65507个字节。不过在传输过程中仍会遇到两个限制因素:
- 应用程序可能会受到其程序接口的限制
- TCP/IP的内核实现
ICMP源站抑制差错:当一个系统接收数据报的速度比其他处理速度快时,就可能产生这个差错。报文格式如下:
UDP首部的定义如下所示: