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

文章目录

  • 前言
  • Udp协议段格式
  • 1. 几乎所有协议首要解决的两个问题:
  • a) 如何分离(封装)
  • b) 如何进行向上交付
  • 2. 理解报文本身
  • 3. 对Udp报文字段的解释
  • 4. Udp的特点
  • 如何理解 面向数据报:
  • 5. IO类接口的本质:sento、recvfrom
  • UDP的缓冲区
  • 6. UDP全双工 vs 半双工
  • 7. UDP的使用注意事项
  • 8. 基于UDP的应用层协议
  • 前言

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

  • UDP(User Datagram Protocol)是一种无连接的传输协议,它位于OSI模型的传输层,用于在计算机网络上发送数据。
  • 在之前所写的进程间通信套接字编程 的代码都是在应用层的,接下来的Udp、Tcp协议在传输层


    Udp协议段格式

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

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

    a) 如何分离(封装)


    如图所示,通过固定长度的报头,将报头有效载荷分离。


    b) 如何进行向上交付

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

    1. 为什么在应用层编写代码写端口号时,使用 uint16_t:根据Udp协议,端口号是16位的。
    2. UDP是如何正确提取报文的:
    3. 同样的,因为Udp协议段是 固定长度的报头 + 16位Udp长度
    4. 由上可以知道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全双工

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

    5. 在UDP半双工通信中,通信双方只能在同一时间内进行发送或接收操作,不能同时进行。
    6. 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)是一种用于在网络上共享文件系统的协议。

    作者:卜及中

    物联沃分享整理
    物联沃-IOTWORD物联网 » 深入理解UDP协议:从报文格式到应用本质【网络基础1】

    发表回复