【Linux笔记】网络部分——传输层协议UDP
39.传输层协议UDP
文章目录
- 39.传输层协议UDP
- 回顾端口号
- UDP协议的特点
- UDP协议端格式
- UDP协议头结构体实现
- UDP协议的全双工特性及缓冲区问题
- UDP协议的运用
- 总结
从学习网络开始,大部分时间都在编写代码,包括重写TCP套接字、多进程、多线程池、自定义协议、远程命令执行、聊天功能、自定义HTTP协议、序列化和反序列化等。目前上层与原理相关的理论已经讲完,接下来要解决两个问题:网络底层原理和服务器的设计。
回顾端口号
在网络基础部分,我们了解到端⼝号(Port)标识了⼀个主机上进⾏通信的不同的应⽤程序,UDP服务有客户端和服务端,都需要绑定端口号。服务器上部署了各种不同的服务,每个服务绑定特定端口号,如HTTP 80端口、SSH 22端口等。从网络收到报文时,需要根据端口号决定交给哪个应用程序。UDP报头包含端口号,用于数据转发。。
-
在TCP/IP协议中, ⽤ “源IP”, “源端⼝号”, “⽬的IP”, “⽬的端⼝号”, “协议号” 这样⼀个五元组来标识⼀个通信(可以通过netstat -n查看);
-
端口号0-1023是知名端口号,如HTTP 80、HTTPS 443、SSH 22,必须与特定服务绑定。1024-65535是操作系统动态分配的端口号,由客户端随机分配
-
一个进程可以绑定多个端口号,但一个端口号不能被多个进程绑定。类似于管道,一个进程可以打开多个管道,但一个管道只有一个读端和一个写端。
UDP协议的特点
UDP协议位于网络传输层,负责将数据从发送端转发到接收端,不考虑连接问题。
UDP客户端直接向服务端发送消息,不需要考虑粘包和字节流问题,操作系统知道报文长度。
UDP协议端格式
UDP协议的格式包括16位源端口号、16位目的端口号、16位UDP长度和16位校验和总共8个字节,剩余部分是数据即有效载荷。
- 应用层端口号是两字节因为UDP协议中端口号是16位的。
- 16位UDP长度是整个UDP报文的长度,数据大小需要再减去报头的8个字节
- UDP不保证可靠性但保证数据合法性,使用16位校验和验证报文,失败则丢弃。

UDP报头中的自描述字段可以描述有效载荷长度,确保读取完整报文。
在网络基础我们提到,一份数据在网络中转发最重要的两个问题就是:协议是如何解包的?协议是如何分用的?
- UDP解包过程是读取前八个字节作为报头,剩余部分作为有效载荷。UDP报文解包和分用相对简单,因为报头长度固定。UDP通过固定报头长度和16位UDP长度字段保证报文完整性,可以准确读取完整报文。接收方可以连续读取多个UDP报文,根据报头中的长度字段准确分离报文
- 分用过程是根据16位目的端口号查找关联进程并转发报文。
与TCP不同,UDP在创建套接字后可以直接进行收发操作,不需要像TCP那样需要先建立连接。UDP是面向数据报的协议,这意味着每个报文都是独立的,不需要像TCP那样需要应用层处理报文的完整性。UDP的不可靠性体现在没有确认机制、重传机制,数据包丢失时不会报告给上层或对方。
UDP协议头结构体实现
UDP协议本质上是C语言的结构体。UDP协议头包含16位无符号源端口、目的端口、长度和校验和字段。这些字段在C语言中表示为u16无符号16位整数。UDP协议头结构体在代码中被称为udp_hdr。结构体中的字段对应UDP协议格式中的各个部分:源端口、目的端口、长度和校验和。这种结构体实现方式与操作系统内核使用C语言编写协议的特点一致。
下图为Linux 2.6.18内核中有关udp字段的源码:

UDP协议的全双工特性及缓冲区问题
UDP协议具有全双工特性,可以在接收消息的同时发送消息。UDP协议的文件描述符可以被一个线程读取,另一个线程写入。UDP协议具有接收缓冲区,用于暂时缓存收到的数据,但接收缓冲区不能保证报文的顺序与发送顺序一致。UDP协议不保证报文的按序到达,这与TCP协议不同。UDP协议的接收缓冲区在写满后会丢弃新收到的报文。UDP协议没有真正意义上的发送缓冲区,因为它不保证可靠性,应用层将报文交给UDP后,操作系统会直接将其交给下一层进行发送。UDP协议不需要像TCP协议那样进行流量控制、拥塞控制、丢包重传等可靠性保证措施。UDP协议的接收缓冲区由sk buff构成的链表队列管理,这种结构在操作系统内部用于管理报文。UDP协议的全双工特性不受发送缓冲区缺失的影响。
UDP协议的运用
UDP协议在直播和视频领域应用较多,因为UDP协议简单,报文分发容易。直播应用客户端在底层可以选择UDP协议或TCP协议。UDP协议在传输过程中可能会出现偶尔性的丢失,导致画面抖动、局部不清晰、马赛克或色块等问题,但这些是可以接受的。UDP协议不会对报文进行拆分或合并,发送端发送多少次,接收端就会接收多少次。发送和接收的次数一致,前提是没有丢包。UDP协议面向数据报,而TCP协议面向字节流。UDP协议在传输100个字节数据时,发送端调用一次性能处发送100个字节,服务器端也会调用一次recvfrom接收100个字节。如果接收端需要分十次读取,每次读取十个字节,就需要调用十次recvfrom。UDP协议的传输特点是发送和接收的次数一致,而TCP协议则可能发送一次,接收多次,或者发送多次,接收一次。UDP协议的这种特性使其在直播和视频领域具有优势,尽管存在丢包的可能性,但在这些场景下是可以接受的。
总结
UDP协议的简单特性和在特定场景下的应用已经进行了详细说明,包括其在直播和视频领域的优势、全双工特性、缓冲区问题以及报文长度限制等。这些内容为后续讨论TCP协议奠定了基础。UDP协议虽然在某些场景下表现优异,但在需要高可靠性的场景下,TCP协议更为适合。接下来将重点讨论TCP协议的特性和应用。
