📌 相关专栏
-
【C++ 专栏】
📌 相关文章推荐
很高兴你点开这篇文章✨
这里会持续更新我喜欢的内容,关注我,一起慢慢变好呀
👍 点赞 ⭐ 收藏 💬 评论
文章目录
- 前言
- 一、传输层
- 二、端口号
-
- [1. 对端口号的理解](#1. 对端口号的理解)
- [2. 端口号的划分](#2. 端口号的划分)
- [3. 认识知名端口号](#3. 认识知名端口号)
- [4. netstat](#4. netstat)
- 三、UDP协议
-
- [1. UDP协议端的格式](#1. UDP协议端的格式)
- 2.UDP的特点
- [3. 面向数据报](#3. 面向数据报)
- [4. UDP的缓冲区](#4. UDP的缓冲区)
- [5. 基于UDP的应用层协议](#5. 基于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多个端口号?
可以的!
实现方式:
创建多个 Socket:最直接的方式。一个进程内可以创建多个独立的 Socket 描述符,分别调用 bind() 绑定到不同端口(如 80 和 443),各自进入监听或收发数据使用 SO_REUSEADDR 选项:允许同一个进程(或多个进程)共用同一个端口,通常用于监听端口的快速重启或端口复用场景。端口范围绑定:通过配置或特定接口,让一个 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: 域名解析协议
🐶 🐾 ✨ 🐾 🐶

谢谢你看到这里呀
如果喜欢这篇内容,点个关注,下次更新不迷路✨
👍 点赞 ⭐ 收藏 💬 评论






