用户数据报协议 UDP # UDP [TOC] ## 概述 UDP:用户数据报协议。UDP只在IP层之上做了很少的功能,即**复用**、**分用**和**查错检测**的功能。 ## 特点 1. 无连接:发送数据前**不需要建立连接**(也就不需要断开连接) 2. 尽最大努力交付:**不保证可靠性**,主机不需要维护复杂的**连接状态表** 3. 面向报文:从应用层收到数据后,只向数据中**添加首部** 4. 没有拥塞控制:网络出现拥塞时也不会降低源主机的**发送速率** 5. 通信方式丰富:支持**一对一**、**一对多**、**多对一**、**多对多** 6. 首部开销少:首部只占用8个字节(TCP占用20个字节) ## 存在的问题 1. UDP没有拥塞控制,当很多源主机同时发送高速率的数据(如实时视频流),网络就有可能出现拥塞,导致所有接收方都无法收到数据 2. 由于UDP不能保证可靠性,所以需要应用程序额外做一些容错处理(如重发丢失数据) ## 首部 ![UDP协议-图2](https://github.com/colinlet/PHP-Interview-QA/raw/master/docs/01.%E7%BD%91%E7%BB%9C/assets/network-udp-02.png) UDP用户数据报有两个字段:数据字段和首部字段,首部字段共有八个字节,四个字段,每个字段占两个字节。四个字段分别为: 1. 源端口:发送方的端口号,当需要接收方回信时必填,否则全为0 2. 目标端口:接收方的端口号,用于交付报文,必须传递 3. 长度:数据的长度,最小值为8(仅有首部) 4. 检验和:用于校验UDP用户数据报是否完整,传输过程中是否出错,出错就丢弃 ### 伪首部 用于计算检验和字段的临时数据占12个字节,伪首部既不向下传也不向上传。 ## 端口分用 ![UDP协议-图3](https://github.com/colinlet/PHP-Interview-QA/raw/master/docs/01.%E7%BD%91%E7%BB%9C/assets/network-udp-03.png) 当传输层接收到IP层传递的数据后,会根据首部的目标端口,将数据传递给该端口对应的应用程序。如果端口出错(对应的应用不存在等)将由网络控制报文协议 ICMP 向发送方传递“端口不可达”的错误报文。 2020-05-10 none 展开评论