文章目录
- 前言
- 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(绑定)了端口号。
- 为什么在应用层编写代码写端口号时,使用
uint16_t
:根据Udp协议,端口号是16位的。 - 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(用户数据报协议)报文包含以下字段:
-
源端口(Source Port) :16位字段,指定发送端的端口号。
-
目标端口(Destination Port) :16位字段,指定接收端的端口号。
-
长度(Length):16位字段,指定UDP报文的长度,包括UDP首部和数据。
-
校验和(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
在我们使用如sendto
、recvfrom
、read
等函数时,我们可能以为是在网络中进行的数据收发,实际并非如此,本质是:
UDP的缓冲区
因此:
- UDP没有真正意义上的 发送缓冲区 ,调用
sendto
会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作。 - UDP有 接收缓冲区 但该接收缓冲区不能保证收到的UDP数据报的顺序和发送UDP报的顺序一致; 如果缓冲区满, 再到达的UDP数据就会被丢弃。
6. UDP全双工 vs 半双工
UDP协议下进行通信时有两种模式:
-
UDP全双工:
- 在UDP全双工通信中,两个通信实体(通常是两台计算机或两个进程)之间可以 UDP有 同时发送和接收数据 。
- UDP全双工通信的特点是通信双方之间的数据传输是独立的,互不影响。
-
UDP半双工:
- 在UDP半双工通信中,通信双方只能在同一时间内进行发送或接收操作,不能同时进行。
- UDP半双工通信的特点是通信双方之间的数据传输是交替进行的,无法同时进行发送和接收。
7. UDP的使用注意事项
- 我们注意到, UDP协议首部中有一个16位的最大长度. 也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。
- 显然64K在当今的互联网环境下, very small。
- 如果我们需要传输的数据超过64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装。
8. 基于UDP的应用层协议
-
DNS(域名解析协议):DNS使用UDP协议来进行域名解析,将域名映射到IP地址。
-
DHCP(动态主机配置协议):DHCP用于自动配置网络设备的IP地址、子网掩码、网关等信息,并且可以通过UDP进行通信。
-
TFTP(简单文件传输协议):TFTP用于在网络上传输文件,它基于UDP进行通信。
-
SNMP(简单网络管理协议):SNMP用于网络设备之间的管理和监控,它的一些版本使用UDP作为传输协议。
-
NTP(网络时间协议):NTP用于同步计算机的时间,它可以使用UDP来传输时间信息。
-
VoIP(网络电话):许多VoIP应用程序使用UDP来传输音频和视频数据,因为UDP的低延迟和实时性对于语音通信非常重要。
-
NFS(Network File System)是一种用于在网络上共享文件系统的协议。