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