UDP协议详解

本文详细介绍了UDP协议,包括其报文格式,分为报文头和数据区,报文头含源端口号等信息;阐述了UDP无连接、不可靠等特点,以及其缓冲区情况;还提及UDP是全双工通信协议,传输数据超64K需手动分包;最后列举了基于UDP的常见应用层协议及netstat工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UDP协议

1. 如下:UDP协议的报文格式

UDP协议分为UDP 报文头和 UDP 数据区两部分:UDP报文头为8字节(分别为源端口号、目的端口号、UDP数据长度、UDP数据校验和)

  • 源端口:这个字段占据 UDP 报文头的前 16 位,是发送数据报的应用程序所使用的 UDP 端口。接收端的应用程序利用这个字段的值作为发送响应的目的地址。这个字段是可选的,所以发送端的应用程序不一定会把自己的端口号写入该字段中。如果不写入端口号,则把这个字段设置为 0。这样,接收端的应用程序就不能发送响应了。
  • 目的端口:接收端计算机上 UDP 软件使用的端口,占据 16 位。
  • 长度:该字段占据 16 位,表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度。因为 UDP 报文头长度是 8 个字节,所以这个值最小为 8。
  • 校验值:该字段占据 16 位,可以检验数据在传输过程中是否被损坏。
  • 如果校验和出错,就会直接丢弃(UDP校验首部和数据部分)

UDP可用端口号范围为0-65535, 但是0-1024一般被系统使用,所以程序中一般使用端口号范围为1024-65535

UDP协议的特点:

  • 无连接:只知道对端的IP和端口号就可以发送,不需要实现建立连接。
  • 不可靠:没有确认机制, 没有重传机制。如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息。
  • 面向数据报: 应用层交给UDP多长的报文, UDP原样发送既不会拆分,也不会合并。如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个 字节,而不能循环调用10次recvfrom, 每次接收10个字节。所以UDP不能够灵活的控制读写数据的次数和数量。

UDP的缓冲区:UDP存在接收缓冲区,但不存在发送缓冲区。

  • UDP没有发送缓冲区,在调用发送数据函数时会直接将数据交给内核,由内核将数据传给网络层协议进行后续的传输动作。为什么UDP不需要发送缓冲区? 因为UDP不保证可靠性,它没有重传机制,当报文丢失时,UDP不需要重新发送,而TCP不同,他必须具备发送缓冲区,当报文丢失时,TCP必须保证重新发送,用户不会管,所以必须要具备发送缓冲区。
  • UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报文的顺序和发送UDP报的顺序一致,如果缓冲区满了再到达的UDP数据报就会被丢弃。
  • UDP套接口有发送缓冲区大小(SO_SNDBUF修改),不过它仅仅是写到套接口的UDP数据报的大小上限。如果一个应用程序写一个大于套接口发送缓冲区大小的数据报,内核将返回EMSGSIZE错误。既然UDP不可靠,它不必保存应用程序的数据拷贝,因此无需真正的发送缓冲区(应用进程的数据在沿协议栈往下传递,以某种形式拷贝到内核缓冲区,然而数据链路层在送出数据之后将丢弃该拷贝)。

  • 对于TCP而言,发送数据时,内核先将数据拷贝至套接缓存,如果满了,则阻塞,直至空闲,这就是发送缓存TCP与UDP的区别

  • 如果某个UDP应用进程发送大数据,那么它比TCP应用程序更容易分片。从UDP套接口write成功返回仅仅表示用户写入的数据报或者所有片段已经加入到数据链路层的输出队列。如果该队列没有足够的空间存放该数据包或者它的某个片段,内核通常返回给应用进程一个ENOBUFS错误。

UDP是一种全双工通信协议。 UDP协议首部中有一个16位的大长度. 也就是说一个UDP能传输的报文长度是64K(包含UDP首部)。如果我们需要传输的数据超过64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装。

常见的基于UDP的应用层协议:

NFS:网络文件系统
TFTP:简单文件传输协议
DHCP:动态主机配置协议
BOOTP:启动协议(用于无盘设备启动)
DNS:域名解析协议

 

netstat工具: 查看网络连接状态,协议类型,本地IP与端口,外部IP与端口, 连接状态等

### UDP协议工作机制详解 用户数据报协议(User Datagram Protocol, UDP)是一种无连接的传输层协议,属于OSI七层模型中的第四层。与TCP相比,UDP的设计目标是提供一种轻量级、低延迟的通信方式,适用于对速度要求较高而对可靠性要求较低的应用场景。 #### 1. 基本特性 UDP的主要特点是其无连接性和不可靠性。这意味着发送方无需等待接收方的确认即可直接发送数据包[^3]。这种设计使得UDP在某些特定应用中表现出更高的效率和更低的开销。然而,由于缺乏重传机制和错误校验能力,UDP无法保证数据包按序到达或完全送达。 #### 2. 数据结构 一个典型的UDP数据报由首部字段和数据部分组成。其中,首部固定长度为8字节,包含源端口号、目的端口号、长度以及检验和四个字段。以下是具体描述: - **源端口(Source Port)**: 占用两个八位组(即16比特),用来标识发送进程的身份; - **目的端口(Destination Port)**: 同样占用两个八位组,表示接收进程的身份; - **总长度(Total Length)**: 记录整个数据报的大小,包括头部和负载两部分内容; - **校验和(Checksum)**: 可选字段,用于检测IP头以外的数据是否有误码发生;如果未启用,则该值应设为全0。 ```c struct udphdr { uint16_t source; /* Source port */ uint16_t dest; /* Destination port */ uint16_t len; /* Datagram length (header + data) */ uint16_t check; /* Checksum of header and data */ }; ``` #### 3. 应用场景 尽管UDP不具备像TCP那样强大的保障措施,但它仍然广泛应用于多种领域,比如实时音视频通话(VoIP)、在线游戏、域名解析服务DNS查询响应等场合。这些情况下往往更看重及时反馈而非绝对准确性。 #### 4. 缺点分析 当然,任何事物都有利弊两面,对于采用UDP协议来说也不例外。主要缺点如下: - 容易丢失分组或者重复收到相同的信息片段; - 接收次序混乱可能导致重组困难甚至失败; - 对于大规模文件下载之类的任务而言并不适合因为缺少必要的流量控制手段来防止拥塞现象的发生。 综上所述,虽然UDP存在诸多局限之处,但由于其实现简单快捷的特点使其成为众多现代互联网应用程序不可或缺的一部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值