Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Linux】:传输层协议 UDP

【Linux】:传输层协议 UDP

作者头像
IsLand1314
发布于 2025-02-04 01:49:17
发布于 2025-02-04 01:49:17
57500
代码可运行
举报
文章被收录于专栏:学习之路学习之路
运行总次数:0
代码可运行

一、前言

🔥 之前在这篇文章 初识网络 中说过关于传输层的内容,以及在 Socket编程应用层UDP 也做过关于 UDP 的练习,如下:

  • 传输层: 负责两台主机之间的数据传输。 如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机,负责数据能够从发送端传输接收端

二、再谈端口号

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

  • 在 TCP/IP 协议中, 用 “源 IP”、“源端口号”、“目的 IP”、“目的端口号”、“协议号” 这样一个五元组来标识一个通信(可以通过 netstat -n 查看)
🐇 端口号范围划分
  • 0 - 1023: 知名端口号、HTTP、FTP、SSH 等这些广为使用的应用层协议, 他们的端口号都是固定的.
  • 1024 - 65535:操作系统动态分配的端口号、客户端程序的端口号,就是由操作系统从这个范围分配的.
🐇 认识知名端口号(Well-Know Port Number)

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat /etc/services
  • 注意:我们自己写一个程序使用端口号时, 要避开这些知名端口号.
🐇 端口号和 bind 关系

① 一个进程可以 bind 多个端口号

  • 一个进程可以通过多次调用 bind() 函数绑定多个端口号(前提是这些端口号未被占用)。
  • 每个绑定的端口号可以用于不同的通信需求。例如,一个服务器进程可以同时监听多个端口,分别处理不同类型的请求。

② 一个端口号不可以被多个进程 bind

  • 端口号用于唯一标识一个通信端点。如果多个进程绑定同一个端口号,操作系统无法确定将数据包交给哪个进程。
  • 当尝试绑定一个已被占用的端口号时,bind() 函数会返回错误(如 EADDRINUSE)。

但是值得注意的是:在特定情况下是可以的

  1. 使用 SO_REUSEADDR 选项:
    • 通过设置套接字选项 SO_REUSEADDR,多个进程可以绑定到同一个端口号。
    • 适用场景:
      • 快速重启服务器时,避免等待 TIME_WAIT 状态结束。
      • 多进程服务器模型中,多个子进程共享同一个监听端口。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int optval = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
  1. 多播或广播:
    • 多个进程可以绑定到同一个端口号,用于接收多播或广播数据包。
    • 适用场景:
      • 多播组通信(如视频流分发)。
      • 广播消息(如 DHCP 发现)。
  2. 不同协议:
    • 不同协议的套接字可以绑定到同一个端口号。例如,TCP 和 UDP 可以同时使用同一个端口号。
  3. 不同 IP 地址:
    • 如果主机有多个 IP 地址,不同进程可以绑定到同一个端口号,但使用不同的 IP 地址

三、UDP 协议

1. UDP 协议端格式
  • 16 位 UDP 长度:表示整个数据报 (UDP 首部+UDP 数据) 的最大长度
  • 如果校验和出错, 就会直接丢弃;

现在我们有两个问题,UDP 是 如何做到解包和分用的,按照上面的逻辑

  • 解包:UDP 直接读取报文前 8 个字节(16 位源端口号)来进行解包
  • 分用: UDP 根据16位端口号去 OS 中查找进程与这16位端口号关联的

从这就可以知道我们在 Socket编程应用层UDP 文章这 UDP的端口号只有两字节,因为 OS 在协议中规定端口号是 16 位的,因此我们当时 ip 地址是 4 字节,而 端口号却是 2 字节,这就是 协议源代码

  • 这里 UDP 携带16 位 UDP 长度,之前在网络版本计算器和 http 的相关文章 都采用到了 类似方案,这种自己描述自己的特性-> 叫作 自描述字段 ,方便把报头固定下来,然后保证对方能够读到完整的报文
2. UDP 特点

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

  • 无连接: 知道对端的 IP 和端口号就直接进行传输, 不需要建立连接;
  • 不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方,UDP 协议层也不会给应用层返回任何错误信息;
    • 注意:这里的不可靠不一定是缺点,而是其特性,相比于 TCP 更可靠需要更多操作,这里 UDP 操作更简单
    • 适用场景:实时应用、广播/多播,就是因为其更简单
  • 面向数据报: 不能够灵活的控制读写数据的次数和数量;
3. 面向数据报

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

  • 用 UDP 传输 100 个字节的数据:
  • 如果发送端调用一次 sendto, 发送 100 个字节, 那么接收端也必须调用对应的一次 recvfrom,接收 100 个字节; 而不能循环调用 10 次 recvfrom,每次接收 10 个字节
4. UDP 缓冲区
  • UDP 没有真正意义上的 发送缓冲区. 调用 sendto 会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作;
  • UDP 具有接收缓冲区. 但是这个接收缓冲区不能保证收到的 UDP 报的顺序和发送 UDP 报的顺序一致; 如果缓冲区满了, 再到达的 UDP 数据就会被丢弃;

UDP 的 socket 既能读, 也能写, 这个概念叫做 全双工

5. UDP 使用注意事项

💡 我们注意到:UDP 协议首部中有一个 16 位的最大长度,也就是说一个 UDP 能传输的数据最大长度是 64K(包含 UDP 首部),然而 64K 在当今的互联网环境下, 是一个非常小的数字。

  • 如果我们需要传输的数据超过 64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装;
6. 基于UDP 的应用层协议
  • NFS: 网络文件系统
  • TFTP: 简单文件传输协议
  • DHCP: 动态主机配置协议
  • BOOTP: 启动协议(用于无盘设备启动)
  • DNS: 域名解析协议

当然, 也包括你自己写 UDP 程序时自定义的应用层协议

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
传输层协议UDP详解
前面已经讲过,HTTP协议是应用层协议,在此之前,我们短暂的认为HTTP是直接通过应用层与外界通信的。但是我们要知道,应用层需要向下将数据传到传输层,再由传输层向下传送。最终才能通过网络传输到接收方。
小灵蛇
2024/10/17
3210
传输层协议UDP详解
传输层:UDP协议
端口号标识的是一个主机上进行通信的不同的应用程序,通过IP+PORT,便能够确认全网唯一一个进程。
二肥是只大懒蓝猫
2023/10/13
4080
传输层:UDP协议
【Linux】深入理解传输层:端口号、UDP协议及其应用场景
端口号(Port)标识了一个主机上进行通信的不同的应用程序。
用户11316056
2024/11/26
5260
【Linux】深入理解传输层:端口号、UDP协议及其应用场景
【在Linux世界中追寻伟大的One Piece】传输层协议UDP
传输层是计算机网络OSI模型中的第四层,它负责在网络中的两个节点之间提供端到端的数据传输服务。传输层的主要任务包括分段与重组、端口标识、连接控制(面向连接的TCP和无连接的UDP)、流量控制和差错检测与处理等,以确保数据的可靠、有序和高效传输。
枫叶丹
2024/09/10
1650
【在Linux世界中追寻伟大的One Piece】传输层协议UDP
【Linux】传输层协议:UDP和TCP
1. 在网络通信中,通信的本质实际就是两台主机上的进程在网络环境中进行通信,也就是数据的传输,而我们总说TCP/IP协议栈,这两个协议分别解决了两个重要的问题,即一台主机如何在网络环境中标定自己的唯一性,一台主机中的某个进程如何在主机内部标定自己的唯一性,实际就是通过网络层协议IP地址和传输层协议端口号port来解决这两个问题的。
举杯邀明月
2023/10/17
1.4K0
【Linux】传输层协议:UDP和TCP
初识Linux · 传输层协议UDP
前文我们介绍了UDP的代码使用,流程也是非常简单的,创建了socket,然后填充对应的信息,最后bind,双方就可以进行通信了。通过代码的编写我们发现UDP是简单的,那么我们进入到源码方面学习UDP也是较为简单的。
_lazy
2025/05/08
1530
初识Linux · 传输层协议UDP
【Linux网络】网络基础:传输层UDP/TCP协议(一)
前言:传输层协议,特别是用户数据报协议(UDP)和传输控制协议(TCP),是网络通信中最为基础也最为重要的部分。它们不仅决定了数据的传输方式,还影响着数据的可靠性、顺序性和实时性。对于想要深入了解互联网运行机制、掌握网络通信技术的朋友们来说,学习UDP/TCP协议无疑是必经之路。
Eternity._
2024/12/13
1890
【Linux网络】网络基础:传输层UDP/TCP协议(一)
传输层协议——UDP
ssh服务器, 使用22端口 ftp服务器, 使用21端口 telnet服务器,使用23端口 http服务器, 使用80端口 https服务器, 使用443端口
lovevivi
2023/11/27
2890
传输层协议——UDP
【Linux网络编程】传输协议UDP
TCP/IP 协议中,使用 五元组 (5-tuple) 来唯一标识一条网络通信。这个五元组包含以下五个信息元素:
南桥
2024/12/14
4880
【Linux网络编程】传输协议UDP
【计网】从零开始理解UDP协议 --- 理解端口号和UDP结构
之前我们讲过服务器上的端口号和服务器的进程是绑定的!客户端的进程与客户端的端口号也是绑定的!再通过IP地址,就可以快速找到网络中需要进行通信的进程!
叫我龙翔
2024/10/16
6490
【计网】从零开始理解UDP协议 --- 理解端口号和UDP结构
网络原理(三)——一文了解传输层UDP/TCP协议
在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过netstat -n查看);
海盗船长
2020/08/27
1K0
【Linux】: 传输层协议 TCP
🔥 之前在这篇文章 传输层协议 UDP 中已经说过关于传输层的部分内容,现在我们来了解一下传输层 TCP 的内容吧
IsLand1314
2025/02/20
4680
【Linux】: 传输层协议 TCP
【Linux网络编程】传输层协议TCP:ACK机制 | 超时重传机制 | 三次握手四次挥手 | 流量控制 | 滑动窗口 | 拥塞控制 | 面向字节流 | 粘包问题
宏观上,在发送方的缓冲区中只是数据部分,经过传输层后添加报头。接收方在接收到报文时,需要将报头和数据分离。
南桥
2024/12/28
7050
【Linux网络编程】传输层协议TCP:ACK机制 | 超时重传机制 | 三次握手四次挥手 | 流量控制 | 滑动窗口 | 拥塞控制 | 面向字节流 | 粘包问题
Linux| |对于UDP的学习
0--1023:http,ssh,ftp,telnet等一些协议端口号都是固定的,对于操作系统来说是不能对其进行分配的
码农编程进阶笔记
2021/07/20
3.2K0
【网络】传输层协议UDP/TCP&&网络层IP&&数据链路层MAC&&NAT详解
在 TCP/IP 协议中,用 "源 IP","源端口号","目的 IP","目的端口号","协议号" 这样一个五元组来标识一个通信(可以通过 netstat -n 查看)
用户10925563
2024/12/15
4810
【网络】传输层协议UDP/TCP&&网络层IP&&数据链路层MAC&&NAT详解
传输层:TCP协议
TCP全称为 "传输控制协议(Transmission Control Protocol")。人如其名, 要对数据的传输进行一个详细的控制。
二肥是只大懒蓝猫
2023/10/13
5980
传输层:TCP协议
传输层协议TCP与UDP
主机是用IP地址来标识的,而要标识主机中的进程,就需要使用端口号。TCP/IP协议族中,端口号占16 bit,用0~65535之间的整数标识。TCP和UDP是两个独立的软件模块,因此各自的端口号也相互独立。·端口号只具有本地意义,不同计算机的相同端口号是没有联系的。
十二惊惶
2024/02/28
7060
传输层协议TCP与UDP
Node js 开发入门 —UDP 编程,小白也能轻松学会
UDP 协议(无连接传输协议)是运行在运输层之上,能够为调用它的应用程序提供一种无需建立连接就可以直接发送数据包的网络传输协议;它主要有以下两个特点:
CRMEB商城源码
2022/08/22
1.6K0
【Linux网络#2】: Socket 编程
但是人是怎么看到聊天信息的呢?怎么执行下载任务呢?怎么浏览网页信息呢?通过启动的 qq,迅雷,浏览器。 而启动的 qq,迅雷,浏览器都是进程。换句话说,进程是人在系统中的代表,只要把数据给进程,人就相当于就拿到了数据。
IsLand1314
2025/06/02
1050
【Linux网络#2】: Socket 编程
【Linux网络】————socket和udp协议
答案:当然不是这样的,事实上是应用层在通信 解析:网络协议中的下三层,主要是解决的是将数据安全可靠的送到远端机器,用户使用应用层软件实现数据的发送和接收。而在使用软件的时候,必须要先启动这个软件,例如我们现在要使用微信,运行之后这个就是进程。所以网络在进行通信的时候就是进程间通信!!!只不过是进程之间遵守了网络协议栈,用的是网络协议的系统调用接口罢了,但是其本质还是进程间通信!!!手段是两台主机通信。而目的和本质是进程之间的通信,是凌驾于应用层上的进程间通信。通过网络协议栈来读取网络资源(共享内存资源)来让两台主机读取/存放信息。可以用读者/写者问题来理解这个问题,我们的网络资源就对应着缓冲区这个概念,读者写者在这个缓冲区(网络资源)中读取和存放资源。
用户11036582
2024/12/18
3690
【Linux网络】————socket和udp协议
推荐阅读
相关推荐
传输层协议UDP详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验