计算机网络之传输层协议UDP
个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创计算机网络之传输层协议UDP
**收录于专栏【计算机网络
端口号
端口号(Port)用于标识同一台主机中参与通信的各类应用程序:

在 TCP/IP 协议体系中,通信的唯一性标识由五个要素构成,即源 IP 地址、源端口号、目标 IP 地址、目标端口号以及协议类型,这一组合通常被称为五元组。通过执行 netstat -n 命令,可以查看相关通信信息。


借助源IP地址、目标IP地址、协议编号、源端口及目标端口这五个数值,可以对一次通信进行唯一识别。
端口号范围划分
0 - 1023 : 该区间内包含众多知名端口号,例如HTTP、FTP以及SSH等广泛应用的应用层协议,其对应的端口号均为预先设定且不可更改的固定值。
1024 - 65535 : 此范围内的端口号由操作系统根据需求进行动态分配,客户端程序在运行时所使用的端口号也正是由操作系统从该区间中选取并分配。
知名端口号认知解析
部分服务器在实际应用中被广泛使用,为提升操作便捷性,业界普遍采用一组标准化的端口号来对应这些常用服务:
SSH 服务:默认采用 22 端口进行通信
FTP 服务:通常使用 21 端口作为数据传输通道
Telnet 服务:其标准端口号为 23
HTTP 服务:访问时默认使用 80 端口
HTTPS 服务:加密通信依赖于 443 端口
通过执行相应的指令,用户可以查看到这些知名端口号的具体信息。
cat /etc/services

在编写程序并使用端口号时,我们应当注意规避那些已被广泛认知和使用的知名端口号。
进程与端口号绑定问题分析
1. 一个进程可以绑定多个端口号吗?
一个进程能够关联多个端口号,在常规操作中,进程通常会绑定一个端口以实现通信功能,但也可以借助多种手段使同一进程绑定多个端口,从而处理多样化的服务或协议。具体实现方式如下:
1. 多个监听套接字 : 进程可以通过创建多个套接字的方式,将每个套接字分别绑定至不同的端口号。例如,Web 服务器可将 80 端口用于 HTTP 协议的通信,并将 443 端口用于 HTTPS 协议的连接。此外,不同服务也可通过各自对应的端口进行监听,以接收来自客户端的请求。
2. 多路复用 (select, poll, epoll) : 在单一线程中,一个进程可以采用 I/O 多路复用技术来同时监听多个端口上的事件。例如,通过 select()、poll() 或 epoll() 等机制,进程能够对多个已绑定至不同端口的套接字进行监控,并根据所触发的事件分别处理各个端口上的连接请求。
3. 协议栈与端口的绑定 : 不同类型的协议(如 TCP 和 UDP)可通过各自的独立端口号来完成数据传输任务。同一进程可以分别针对 TCP 和 UDP 协议的不同端口号进行绑定操作。
2. 一个端口号可以被多个进程绑定吗?
【通常情况下,一个端口号无法被多个进程同时绑定,除非满足特定条件。为避免端口冲突,操作系统一般不会允许同一端口被多个进程绑定。
在常规设置下,单个端口仅能由一个进程进行绑定。
通过启用 SO_REUSEADDR 和 SO_REUSEPORT 这两个选项,在某些特定场景下可以实现多个进程对同一端口的绑定,尤其适用于 UDP 协议或具备相应支持的操作系统环境。
UDP 协议
UDP协议端格式解析

16 位 UDP 长度字段用于标识整个数据报文(包括 UDP 首部与数据部分)所能承载的最大长度。
若校验和计算结果存在错误,则数据包将被直接丢弃。
UDP 特点
UDP传输机制的运作方式与寄信过程存在相似之处:
1. 无需建立连接 : 只需知晓目标端的IP地址及端口号,即可直接发起数据传输,无需事先完成连接建立过程;
2. 数据传输不可靠 : 在传输过程中未设置确认反馈机制,亦未配备重传功能。若因网络问题导致数据未能成功送达接收方,UDP协议层不会向应用层反馈任何错误提示;
3. 数据报文导向 : 无法对读取与写入操作的次数及数据量进行灵活控制。
面向数据报
应用层传递给 UDP 的数据报文长度将被完整保留并直接传输,不会发生任何拆分或合并的情况;
当使用 UDP 协议传送 100 字节的数据时:
若发送方通过一次 sendto 调用发送 100 字节的数据,则接收方也必须通过一次 recvfrom 调用接收完整的 100 字节数据,而不能采用循环调用 recvfrom 的方式,每次仅接收 10 字节的数据。
UDP缓冲区机制分析
1. UDP 协议并不存在严格意义上的 数据发送缓存区 , 当执行 sendto 操作时, 数据会直接传递至操作系统内核, 由内核负责将数据包转发至网络协议层以完成后续的传输流程
2. 尽管 UDP 协议具备接收缓存机制, 但该缓存无法确保接收到的 UDP 数据包顺序与原始发送顺序保持一致。当缓存空间达到上限后, 后续抵达的数据包将会被系统直接丢弃
UDP 的 socket 接口支持双向通信功能, 既可执行读取操作也可进行写入操作, 这种特性被称作 "全双工"
UDP 使用注意事项
我们发现,在UDP协议的头部信息中,存在一个16位的字段用于标识最大长度,这意味着单个UDP数据报所能承载的数据总量上限为64K字节(包括UDP头部信息)。然而,在当前互联网的发展背景下,64K这一数值显然已显得过于微小。当需要传输的数据量超过这一限制时,必须在应用层进行人工分包处理,通过多次发送的方式完成数据传输,并在接收端进行相应的数据拼接操作。
基于 UDP 的应用层协议
【
NFS : 网络文件系统
TFTP : 简单文件传输协议
DHCP : 动态主机配置协议
BOOTP : 启动协议 (用于无盘设备启动)
DNS : 域名解析协议
