【网络基础】深入理解UDP协议:从报文格式到应用本质

前言

首先我们知道,什么是Udp协议

  • UDP(User Datagram Protocol)是一种无连接的传输协议,它位于OSI模型的传输层,用于在计算机网络上发送数据。

在之前所写的进程间通信套接字编程 的代码都是在应用层的,接下来的Udp、Tcp协议在传输层
在这里插入图片描述


Udp协议段格式

下图为UDP的协议段的格式:

在这里插入图片描述

1. 几乎所有协议首要解决的两个问题:

a) 如何分离(封装)

在这里插入图片描述
如图所示,通过固定长度的报头,将报头有效载荷分离。


b) 如何进行向上交付

分离后,将报头的 16位(目的)端口号向上交付 给进程,因为进程bind(绑定)了端口号

  1. 为什么在应用层编写代码写端口号时,使用 uint16_t:根据Udp协议,端口号是16位的。
  2. UDP是如何正确提取报文的:
    • 同样的,因为Udp协议段是 固定长度的报头 + 16位Udp长度
    • 由上可以知道Udp是能正确的接收报文的,即:Udp是面向数据报

2. 理解报文本身

有了之前的Udp协议图,如何具体的理解报文本身,实际上报头本身是一个 结构体,我们可以表示为:

struct udp_htr
{
	uint32_t src_port:16;	
	uint32_t dst_port:16;
	uint32_t udp_len:16;	
	uint32_t udp_check:16;
}
  • (基本上所有的报头都是如上的结构体),该结构体实际上也是C语言学习过程中的 位段

因此,上层应用层向内核层传输数据的过程,可以具象化为:

在这里插入图片描述
而后可以通过(struct udp_hdr*)start->src_port...取得每个内容,实现分离。


3. 对Udp报文字段的解释

UDP(用户数据报协议)报文包含以下字段:

  1. 源端口(Source Port) 16位字段,指定发送端的端口号。

  2. 目标端口(Destination Port) 16位字段,指定接收端的端口号。

  3. 长度(Length)16位字段,指定UDP报文的长度,包括UDP首部和数据。

  4. 校验和(Checksum)16位字段,用于验证UDP报文在传输过程中的完整性。


4. Udp的特点

  • 无连接
    • 通信的双方在发送数据之前不需要建立连接,知道对端的ip和端口号可以直接进行传输。
  • 不可靠
    • UDP不保证数据包的可靠传输。
    • 没有确认、重传机制,如果由于网络故障导致无法发送给对端,Udp协议层不会给应用层返回错误信息。
  • 面向数据报
    • 每个UDP数据包(数据报)都是一个独立的数据单元,不依赖于之前或之后的数据包
    • 不能够灵活的控制读写数据的次数和数量

如何理解 面向数据报:

  • 应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并
  • 比如使用Udp传输100个字节:
    • 如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个 字节; 而不能循环调用10次recvfrom, 每次接收10个字节
    • 所以Udp的传输过程类似送信,不需要提前连接,且发送时需要一整段数据发过去,接收也整段接收。

5. IO类接口的本质:sento、recvfrom

在我们使用如sendtorecvfromread等函数时,我们可能以为是在网络中进行的数据收发,实际并非如此,本质是:

在这里插入图片描述


UDP的缓冲区

因此:

  1. UDP没有真正意义上的 发送缓冲区 ,调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作。
  2. UDP有 接收缓冲区 但该接收缓冲区不能保证收到的UDP数据报的顺序和发送UDP报的顺序一致; 如果缓冲区满, 再到达的UDP数据就会被丢弃。

6. UDP全双工 vs 半双工

UDP协议下进行通信时有两种模式:

  1. UDP全双工

    • 在UDP全双工通信中,两个通信实体(通常是两台计算机或两个进程)之间可以 UDP有 同时发送和接收数据
    • UDP全双工通信的特点是通信双方之间的数据传输是独立的,互不影响。
  2. UDP半双工

    • 在UDP半双工通信中,通信双方只能在同一时间内进行发送或接收操作,不能同时进行。
    • UDP半双工通信的特点是通信双方之间的数据传输是交替进行的,无法同时进行发送和接收。

7. UDP的使用注意事项

  1. 我们注意到, UDP协议首部中有一个16位的最大长度. 也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。
  2. 显然64K在当今的互联网环境下, very small。
  3. 如果我们需要传输的数据超过64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装。

8. 基于UDP的应用层协议

  1. DNS(域名解析协议):DNS使用UDP协议来进行域名解析,将域名映射到IP地址。

  2. DHCP(动态主机配置协议):DHCP用于自动配置网络设备的IP地址、子网掩码、网关等信息,并且可以通过UDP进行通信。

  3. TFTP(简单文件传输协议):TFTP用于在网络上传输文件,它基于UDP进行通信。

  4. SNMP(简单网络管理协议):SNMP用于网络设备之间的管理和监控,它的一些版本使用UDP作为传输协议。

  5. NTP(网络时间协议):NTP用于同步计算机的时间,它可以使用UDP来传输时间信息。

  6. VoIP(网络电话):许多VoIP应用程序使用UDP来传输音频和视频数据,因为UDP的低延迟和实时性对于语音通信非常重要。

  7. NFS(Network File System)是一种用于在网络上共享文件系统的协议。

相关推荐

  1. 深入理解计算机网络基本原理实践应用

    2024-04-28 03:36:03       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-28 03:36:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-28 03:36:03       20 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-28 03:36:03       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-28 03:36:03       20 阅读

热门阅读

  1. Pytorch:Attention理解和代码实现

    2024-04-28 03:36:03       16 阅读
  2. Linux 内核深入理解 - 绪论

    2024-04-28 03:36:03       13 阅读
  3. day04--react中批量传递props

    2024-04-28 03:36:03       17 阅读
  4. 随手记:vue2 filters this指向undefined

    2024-04-28 03:36:03       13 阅读
  5. Qt——代码崩溃 free() invalid pointer

    2024-04-28 03:36:03       15 阅读
  6. Nacos

    Nacos

    2024-04-28 03:36:03      12 阅读
  7. ruoyi-cloud-plus的bom

    2024-04-28 03:36:03       12 阅读
  8. 【软考】面向对象设计

    2024-04-28 03:36:03       12 阅读
  9. 创建PAM配置文件

    2024-04-28 03:36:03       9 阅读
  10. C语言例题27:打印99乘法口诀表

    2024-04-28 03:36:03       11 阅读