UDP
UDP 协议简介
UDP 用户数据报协议,是面向无连接的通讯协议,UDP 数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。
UDP 通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。
UDP 与 TCP 位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP 不被应用于那些使用虚电路的面向连接的服务,UDP 主要用于那些面向查询—应答的服务,例如 NFS。相对于 FTP 或 Telnet,这些服务需要交换的信息量较小。
UDP 头部格式
每个 UDP 报文分 UDP 报头和 UDP 数据区两部分。报头由四个 16 位长(2 字节)字段组成,分别说明该报文的源端口、目的端口、报文长度以及校验值。UDP 报头由 4 个域组成,其中每个域各占用 2 个字节,具体如下:
使用场景
使用 UDP 协议包括:TFTP(简单文件传输协议)、SNMP(简单网络管理协议)、DNS(域名解析协议)、NFS、BOOTP。
TCP 与 UDP 的区别:TCP 是面向连接的,可靠的字节流服务;UDP 是面向无连接的,不可靠的数据报服务。
适用一下数据:
- 不需要重发的数据用 UDP 发送更高效
- 控制用的短数据
- 音频和视频数据
UDP 和 TCP 的区别
- TCP 面向连接(如打电话要先拨号建立连接);UDP 是无连接的,即发送数据之前不需要建立连接
- TCP 提供可靠的服务。也就是说,通过 TCP 连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP 尽最大努力交付,即不保证可靠交付
- TCP 面向字节流,实际上是 TCP 把数据看成一连串无结构的字节流;UDP 是面向报文的
- UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 IP 电话,实时视频会议等)
- 每一条 TCP 连接只能是点到点的;UDP 支持一对一,一对多,多对一和多对多的交互通信
- TCP 首部开销 20 字节;UDP 的首部开销小,只有 8 个字节
- TCP 的逻辑通信信道是全双工的可靠信道;UDP 则是不可靠信道
- UDP 是面向报文的,发送方的 UDP 对应用层交下来的报文,不合并,不拆分,只是在其上面加上首部后就交给了下面的网络层,不论应用层交给 UDP 多长的报文,它统统发送,一次发送一个。而对接收方,接到后直接去除首部,交给上面的应用层就完成任务了。因此,它需要应用层控制报文的大小
- TCP 是面向字节流的,它把上面应用层交下来的数据看成无结构的字节流会发送,可以想象成流水形式的,发送方 TCP 会将数据放入“蓄水池”(缓存区),等到可以发送的时候就发送,不能发送就等着 TCP 会根据当前网络的拥塞状态来确定每个报文段的大小。
TCP 的分段机制可以把数据拆小后封装在多个包里,避免了被网络层分片。重传 TCP 包的效率可比重传分片高多了。
TCP 只需要重传丢失的那一个包,而不是所有包,所以效率比重传分片高多了。在传输过程中应用层也不用负责重传事宜,因为 TCP 是可靠的,能确保数据被安全送达。
RFC 对 UDP 应用程序的建议
RFC 5405 就是这么一份文档,它对设计单播 UDP 应用程序给出了很多设计建议,简述如下:
- 应用程序必须容忍各种因特网路径条件;
- 应用程序应该控制传输速度;
- 应用程序应该对所有流量进行拥塞控制;
- 应用程序应该使用与 TCP 相近的带宽;
- 应用程序应该准备基于丢包的重发计数器;
- 应用程序应该不发送大于路径 MTU 的数据报;
- 应用程序应该处理数据报丢失、重复和重排;
- 应用程序应该足够稳定以支持 2 分钟以上的交付延迟;
- 应用程序应该支持 IPv4 UDP 校验和,必须支持 IPv6 校验和;
- 应用程序可以在需要时使用 keep-alive(最小间隔 15 秒)。
参考
https://www.runoob.com/w3cnote/summary-of-network.html
https://interviewguide.cn/notes/03-hunting_job/02-interview/03-05-net.html