什么是UDP?UDP是User Datagram Protocol(用户数据报协议)的缩写,它是一个简单的协议,简单到UDP规范RFC0768只有区区3页 。
UDP是工作在IP层之上的传输层协议,UDP对IP主要有两个扩展:
- 扩展出端口号使得IP数据报可以多路分发到用户进程 。
- 扩展出校验和提供网络传输过程中数据差错的检验 。
IP数据报到达目的主机后,内核层实现的IP模块,会负责接收网卡上的IP数据报,但主机上通常会同时运行多个进程,IP数据报应该交给哪个进程去处理呢?IP搞不定 。
端口号(位于UDP首部)决定数据报交给主机上的哪个进程处理 。所以,UDP为端主机上运行的应用程序提供了端到端服务 。
UDP的特征
- UDP是无连接的,通信之前无须建连便可直接发送数据报,而TCP是面向连接的 。
- UDP不提供差错纠正,但UDP提供差错检测(端到端校验和) 。
- UDP不做重复消除 。
- UDP不做流量控制 。
- UDP不做拥塞控制,没有协议机制防止高速UDP流量对其他网络用户的消极影响 。
- UDP不保证顺序,数据报递交应用的顺序 。
- UDP不可靠,UDP只负责把应用程序传给IP层的数据发送出去,并不能保证数据报到达目的地,可靠传递需要应用程序去实现 。
- UDP支持组播交付 。
- UDP是一种保留消息边界的传输层协议 。
假设主机A给主机B发送2次数据,第一次4字节“abcd”,第二次3字节“xyz”,而主机B接收2次,分别返回“abcd”、“xyz”两个消息,也可以返回“xyz”,“abcd”两个消息(顺序不重要),那么这就是保留消息边界 。
UDP是保留消息边界的传输层协议,利用UDP通信的应用程序每次发送操作会产生一个IP数据报(不考虑分片),这就约束每次发送的数据量不能大于MTU(最大传输单元),接收端每次接收都会返回一个个UDP数据报的完整负载,不会出现返回半个数据报负载的情况 。
【深入理解UDP编程】而TCP是不保留消息边界的流协议,发送端调用发送的次数和每次发送的数据量,跟接收端调用接收的次数和每次接收的数据量,没有任何对应关系,所以使用TCP的应用程序需要去处理消息边界 。
UDP数据报封装格式IPv4协议(Protocol)字段用值17来标识UDP,UDP数据报头部通常是8字节,IPv4头部之后紧接着是UDP头部,然后是UDP数据Payload(如有) 。
文章插图
IPv4 UDP数据报封装格式
IPv4封装包对应的UDP头部由源端口号、目的端口号、长度、校验和组成,每个字段都是2字节 。
1、端口号,纯抽象的标识,它不跟任何物理实体相关 。
端口号用于帮助协议分辨发送和接收进程 。接收端的内核层从网卡接收到IP数据报之后,识别出UDP数据报(IP数据报头部协议字段值=17)之后,会根据UDP头部的目的端口号,映射到对应进程,把UDP数据报交给对应的进程去处理,这个映射关系由系统内核管理维护 。
文章插图
UDP头部和负载
目的端口号是必须的,但源端口号是可选的,如果数据报发送者不需要对方回复的话,则源端口号可被设置为0 。
因为IP层根据IP头部的协议类型字段,将进入的IP数据报,分发到特定的传输协议(TCP或UDP等),到了传输协议层,再根据端口号将协议数据分发到不同进程 。所以,端口号是协议独立的,不同协议的相同端口号并不会引起分发混乱 。
比如,一台机器上的两个网络服务进程使用相同的IP地址和端口号,但一个使用TCP协议,另一个使用UDP协议,这样是没有问题 。
2、长度字段,是以字节为单位的UDP头部和UDP数据的总长度,因为UDP头部长度为8,且空数据的UDP数据报是允许的,这意味着该长度字段值最小为8 。UDP长度值是冗余的,因为可以通过IP数据报的总长度减去IP首部的长度推导出来 。
3、校验和,覆盖了UDP首部、UDP数据和一个伪首部,由初始发送方计算,由最终目的方校验,用于判断数据报在网络传输过程中是否出错,比如某一位从1变成了0 。
推荐阅读
- 深入探讨 MySQL 的 order by 优化
- 第一次有人把公司、企业、个体户说得这么有意思,好理解多了!
- 鉴别普洱茶的老生茶
- spring框架史上最全深入理解
- 让我们抓住春天的尾巴 深入的了解春茶
- 对Java中HashCode方法的深入思考
- java程序运行原理解析
- |职场权术,那些让人不理解的行为,蕴含着怎样的意义?
- 理解Java的三大特性之封装
- 一文让你理解 Lambda 表达式