Linux -- 传输层协议UDP
传输层
传输层:负责数据能够从发送端传输接收端,通过端口号来表示数据应该发送到哪一个进程。
端口号:端口号是网络通信中用于标识特定进程的数字标识符。它们在传输层协议(如TCP和UDP)中起着关键作用,帮助数据包找到正确的接收进程。
一些常见的服务器端口号包括:
SSH服务器:22端口
FTP服务器:21端口
HTTP服务器:80端口
HTTPS服务器:443端口
所以我们可以知道一个进程可以绑定多个端口号,因为进程可以接受多个来自不同进程发送的数据,但是一个端口只能绑定一个进程,否则端口不知道将数据发送给哪一个进程。
UDP 协议
UDP(User Datagram Protocol,用户数据报协议)是一种简单的、无连接的传输层协议,用于在网络中传输数据。与 TCP 不同,UDP 不提供可靠性、顺序性和流量控制,但它具有低延迟和高效的特点,适合对实时性要求较高的应用。
这里的不可靠性并不代表UDP的实际应用会比TCP差,而是一种特性,正因为不可靠的无连接,造就了UDP协议不需要确认应答,也就能够更高效的传输数据。
UDP 的工作原理
UDP 是一种无连接协议,客户端和服务器之间不需要建立连接即可发送数据。它的核心功能是快速传输数据包,所以UDP是面向数据报的。
UDP协议端格式
UDP的特性
无连接:不需要建立连接,可以直接发送数据。
不可靠性:由于没有确认应答机制,所以不保证数据包的到达和顺序以及完整性
低延迟:由于是无连接和无需确认的,所以传输延迟极低。
高效性:报头头部开销小,适合传输小数据包
⾯向数据报: 不能够灵活的控制读写数据的次数和数量。
面向数据报:应用层交给UDP多长的报文,UDP不会拆分与合并,而是一次性将报文发出。也就是说如果发送端调⽤⼀次sendto, 发送100个字节, 那么接收端也必须调⽤对应的⼀次recvfrom, 接收100个字节; ⽽不能循环调⽤10次recvfrom, 每次接收10个字节。
UDP的缓冲区
与TCP不同,UDP没有发送缓冲区,只有接收缓冲区,调⽤sendto会直接交给内核, 由内核将数据传给⽹络层协议进⾏后续的传输动作。
每个UDP socket都有一个接收缓冲区,用于缓存从网络上接收到的数据报。如果接收缓冲区满了,新到的数据报将被丢弃。由于UDP没有流量控制机制,快速发送的数据报可能会淹没慢速接收方,导致数据报丢失。
UDP数据包的最大长度为65507字节,这是因为UDP报头占8字节,IP报头占20字节,而UDP报文的最大长度为65535字节。然而,为了减少丢包风险,建议将UDP数据包的大小控制在MTU(最大传输单元)以下。如果我们需要传输的数据超过64K, 就需要在应⽤层⼿动的分包, 多次发送, 并在接收端⼿动拼装。
UDP 的应用场景
- 实时应用:如 VoIP(语音通话)、视频会议、在线游戏。
- 广播和多播:如网络广播、流媒体分发。
- 简单查询:如 DNS 查询、DHCP 请求。
- 轻量级协议:如 SNMP(简单网络管理协议)、TFTP(简单文件传输协议)。