【Linux】 传输层协议UDP:从端口号到传输机制

📌 相关专栏

很高兴你点开这篇文章✨

这里会持续更新我喜欢的内容,关注我,一起慢慢变好呀

👍 点赞 ⭐ 收藏 💬 评论


文章目录

前言

在计算机网络体系中,传输层是连接应用层与网络层的关键桥梁,而端口号和UDP协议则是传输层最基础的核心概念。很多初学网络编程的同学,常常搞不清端口号的作用、进程与端口的绑定关系,也对UDP协议的特性和适用场景一知半解。

💡 : 本篇学习笔记,从传输层的基础概念讲起,带你理解端口号的划分规则、知名端口号的作用,解答"一个进程能否绑定多个端口"等高频问题,同时讲解netstat工具的常用方法,再深入解析UDP协议的报文格式、特性与缓冲区机制,帮你搭建传输层的完整基础认知,为后续TCP协议和Socket编程打下扎实基础。

🐶 🐾 ✨ 🐾 🐶


一、传输层

负责数据能够从发送端传输到接受端

🐶 🐾 ✨ 🐾 🐶


二、端口号

1. 对端口号的理解

端口号(Port)标识了一个主机上进行通信的不同的应用程序


每个进程都绑着自己的协议,要传输的数据具体是要传给哪个进程是由端口号来决定的

在TCP/IP协议中, 用"源IP", "源端口号", "⽬的IP", "⽬的端口号", "协议号"这样一个五元组来标识一个通信(可以通过netstat -n查看);


2. 端口号的划分

  • 0 - 1023 : 知名端口号, HTTP, FTP, SSH等这些⼴为使用的应用层协议, 他们的端口号都是固定的.
  • 1024 - 65535 : 操作系统动态分配的端口号. 客⼾端程序的端口号, 就是由操作系统从这个范围分配的.

3. 认识知名端口号

有些服务器是⾮常常用的, 为了使用⽅便, ⼈们约定一些常用的服务器, 都是用以下这些固定的端口号:

  • ssh服务器, 使用22端口
  • ftp服务器, 使用21端口
  • telnet服务器, 使用23端口
  • http服务器, 使用80端口
  • https服务器, 使用443

🐾 执行下面的命令, 可以看到知名端口号

bash 复制代码
cat /etc/services

🐾 每行还有四个字段,分别表示: 服务名称 、该服务所用的端口号、协议名称、别名

注意:我们自己写一个程序使用端口号时, 要避开这些知名端口号


QS1:一个进程是否可以bind多个端口号?

可以的!

实现方式:

  1. 创建多个 Socket:最直接的方式。一个进程内可以创建多个独立的 Socket 描述符,分别调用 bind() 绑定到不同端口(如 80 和 443),各自进入监听或收发数据
  2. 使用 SO_REUSEADDR 选项:允许同一个进程(或多个进程)共用同一个端口,通常用于监听端口的快速重启或端口复用场景。
  3. 端口范围绑定:通过配置或特定接口,让一个 Socket 绑定一个端口范围(某些系统或应用层实现),但这不是标准的 bind() 行为。

QS2:一个端口号是否可以被多个进程bind?

1.默认情况下:不允许

操作系统为了保证端口资源分配的确定性,不允许两个不同的进程(无论是否有关联)绑定到同一个IP和端口上,否则第二个进程在bind()时会报错

2. 特殊情况下:允许

设置SO_REUSEPORT选选项:多个进程在同一端口上监听,常用于提升性能


4. netstat

netstat是一个用来显示网络连接、路由表、端口监听等网络状态的重要工具

bash 复制代码
netstat -[选项]			//-后面没有空格

常用选项:

选项 说明
n 拒绝显示别名,能显示数字的全部转化成数字(地址和端口)
l 仅列出有在 Listen (监听) 的服务状态
p 显示进程ID和名称
t (tcp) 仅显示tcp协议的连接
u (udp) 仅显示udp协议的连接
a (all) 显示所有连接和监听端口,默认不显示LISTEN相关

常用组合

命令 用途
netstat -tuln 仅显示TCP/UDP就按听端口(Linux常用)
netstat -anp 显示所有连接+对应进程
netstat -rn 查看路由表
netstat -s 显示各协议统计信息

查看 TCP 相关的网络信息(要root用户)

bash 复制代码
netstat -nltp

说明: 不用root用户,看不到完整的进程信息

字段 含义
Proto 协议类型,这里是 (IPv4)或 (IPv6)
Recv-Q 接收队列:等待被进程读取的TCP数据字节数,正常监听状态下都是0
Send-Q 发送队列:等待发送给客户端的TCP数据字节数,正常监听状态下都是0
Local Address 本机正在监听的地址+端口,格式
Foreign Address 外部连接地址,监听状态下显示为 / ,表示接受任何外部IP的连接
State 连接状态,这里全是 ,表示正在监听等待连接
PID/Program 占用这个端口的进程ID和程序名称

查看 UDP 相关的网络信息(要root用户)

bash 复制代码
netstat -nlup

说明: 不用root用户,看不到完整的进程信息

字段 含义
Proto 协议类型,这里是 (IPv4)或 (IPv6)
Recv-Q 接收队列:等待被进程读取的TCP数据字节数,正常监听状态下都是0
Send-Q 发送队列:等待发送给客户端的TCP数据字节数,正常监听状态下都是0
Local Address 本机正在监听的地址+端口,格式
Foreign Address 外部连接地址,监听状态下显示为 / ,表示接受任何外部IP的连接
State 连接状态,这里全是 ,表示正在监听等待连接
PID/Program 占用这个端口的进程ID和程序名称

🐶 🐾 ✨ 🐾 🐶


三、UDP协议

1. UDP协议端的格式

  • 16 位源端口号:记录数据从哪来。
  • 16 位目的端口号:记录数据要到哪去。
  • 16 位 UDP 报文长度:记录整个数据报 (UDP 首部 + UDP 数据正文) 的长度。
  • 16 位 UDP 检验和:用于保证报文的完整性,如果 UDP 报文的检验和出错,则直接将报文丢弃。

2.UDP的特点

UDP传输的过程类似于寄信.

  • 无连接 : 知道对端的IP和端口号就直接进行传输, 不需要建⽴连接;
  • 不可靠 : 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对⽅, UDP协议层也不会给应用层返回任何错误信息;
  • 面向数据报 : 不能够灵活的控制读写数据的次数和数量;

3. 面向数据报

用层交给UDP多⻓的报文, UDP原样发送, 既不会拆分, 也不会合并:

🐾 示例:

  • 如果发送端调用一次 sendto 发送 100 个字节,接收端也必须调用对应的一次 recvfrom 接收 100 个字节;而不能循环调用 10 次 recvfrom,每次接收 10 个字节。

4. UDP的缓冲区

  • UDP没有真正意义上的 发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作;
  • UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃;
  • 双全工, UDP的socket既能读, 也能写

5. 基于UDP的应用层协议

  • NFS: 网络文件系统
  • TFTP: 简单文件传输协议
  • DHCP: 动态主机配置协议
  • BOOTP: 启动协议(用于无盘设备启动)
  • DNS: 域名解析协议

🐶 🐾 ✨ 🐾 🐶


谢谢你看到这里呀

如果喜欢这篇内容,点个关注,下次更新不迷路✨

👍 点赞 ⭐ 收藏 💬 评论

相关推荐
囚~徒~2 小时前
轻量化的虚拟机
linux·运维·服务器
SteveSenna2 小时前
Ubuntu 20.04 安装 Isaac Sim 4.5 + Isaac Lab
linux·运维·服务器
开开心心就好2 小时前
支持多显示器的Windows高效分屏工具
运维·python·科技·游戏·计算机外设·ocr·powerpoint
lizhihai_993 小时前
股市学习心得-A股服务器/算力服务器龙头
大数据·运维·服务器·人工智能·科技·学习
鼎讯信通3 小时前
守护风电场 “无线神经”:LN-090A 宽频高速手持式频谱分析仪
运维·信息与通信
超级赛博搬砖工3 小时前
静态网页内容与动态网页内容:网页抓取指南
运维·服务器
魔极客3 小时前
利用文心一言解决“1panel下载ollama镜像时间太长引起的不能远程连接ssh故障”
运维·ssh·文心一言
实心儿儿3 小时前
Linux —— 信号量
linux
Dr_eamboat3 小时前
SpringBoot策略模式+工厂模式实战解析
linux·spring boot·策略模式