udp协议(user datagram protocol)
1. UDP协议简介
UDP(User Datagram Protocol),是基于IP协议的一种位于传输层的面向无连接的非可靠传输协议。udp协议虽然不可靠(unreliable)但是传输速度快,因此,通常被用于流媒体应用(因为对差错率要求低,但对传输速度要求高),udp还用于DNS和SNMP。
1.1 为什么需要udp协议? -----速度快
- 通信延迟低(无需建立连接)
- 实现简单,无需维护连接状态
- 头部开销少(8个字节)
- 没有拥塞控制,应用可以更好地控制发送时间和速率
1.2 udp报文格式
1.2.1 udp报文长度(length)
length字段记录了udp报文首部+数据的字节长度。该字段最小值为8字节,即数据部分为空。
1.2.2 udp校验和(checksum)
校验的内容包括伪首部,首部,数据三部分,校验和在发送端和接收端分别需要计算一次。
- 发送端
- 把伪首部添加到udp数据报上,构成一个包含完整端点信息的数据报
- 将首部校验和字段的16个bit全部置为0
- 将整个数据报以16-bit按二进制反码算数求和。如果总的字节数不是偶数,则添加一个全0字节作为填充来辅助求和。
- 接收端
1.
有两种情况会导致数据报被丢弃,一是发送端没有对数据报计算校验和,也就是checksum字段为全0,而接收端又对该字段值做了验证。二是接收端校验失败,数据报在传输过程中存在差错。
udp的校验和(checksum)字段是可选的。在局域网中,由于数据报不需要通过路由器,产生差错的概率较小,此时不使用这个字段是可以接受的,因为可以大大提高传输速率(比较适用于流媒体文件的传输)。但如果数据报通过路由器时,数据产生差错的概率会大大增加,这个时候为了保证数据报的可用性,checksum字段就变得比较重要了。
不一定,校验和校验通过只能说明,接收端有很高的自信度认为该数据报不存在差错,但并不是百分之百的,思考这样一种情景:数据报中多个位置产生差错,但是这些个位置的差错结合起来又恰巧使得接收端计算的校验和等于发送端,这个时候,这种差错检测机制就失效了,也就说明,校验机制并不能百分百保证数据一致性。
1.2.3 填充字节(Padding bytes)
- 填充字节只是为了辅助计算校验和,计算完毕后即丢弃,并不会随数据发送给接收端。
3. 关于udp协议的一些常见问题
不能确定,发送端只负责发送,至于接收端有没有成功接收到,发送端是不负责的。反之,当接收端成功接收到消息时,也不会反馈给发送端。
议,发送端是如何确定数据报有没有被接收端接收的?
不能确定,发送端只负责发送,至于接收端有没有成功接收到,发送端是不负责的。反之,当接收端成功接收到消息时,也不会反馈给发送端。
- 在应用层增加可靠性机制
- 应用特定错误恢复机制