【Linux网络编程】传输协议UDP


前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站


在这里插入图片描述

🌈个人主页: 南桥几晴秋
🌈C++专栏: 南桥谈C++
🌈C语言专栏: C语言学习系列
🌈Linux学习专栏: 南桥谈Linux
🌈数据结构学习专栏: 数据结构杂谈
🌈数据库学习专栏: 南桥谈MySQL
🌈Qt学习专栏: 南桥谈Qt
🌈菜鸡代码练习: 练习随想记录
🌈git学习: 南桥谈Git

🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈
本科在读菜鸡一枚,指出问题及时改正


文章目录

  • 再谈端口号
    • 端口号的范围划分
    • 知名端口号
    • 一个进程是否能绑定多个端口号?
    • 一个端口号是否可以被多个进程绑定?
    • 理解端口号和进程的关系
  • UDP协议
    • UDP协议格式
    • UDP特点
    • 面向数据报
    • UDP缓冲区
    • 使用注意事项
    • 基于UDP的应用层协议
    • 进一步理解UDP报头
    • 进一步理解报文

再谈端口号

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

TCP/IP 协议中,使用 五元组 (5-tuple) 来唯一标识一条网络通信。这个五元组包含以下五个信息元素:

  1. 源 IP 地址:发送方设备的 IP 地址,用于标识通信的源。
  2. 源端口号:发送方应用程序的端口号,标识发送方在其设备上的具体应用进程。
  3. 目的 IP 地址:接收方设备的 IP 地址,用于标识通信的目标。
  4. 目的端口号:接收方应用程序的端口号,标识接收方设备上的具体应用进程。
  5. 协议号:用于标识协议类型的字段,通常用于区分不同的传输层协议。例如,TCP 使用协议号 6,UDP 使用协议号 17。

可以通过netstat -nltp查看:
在这里插入图片描述

在这里插入图片描述

端口号的范围划分

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

知名端口号

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

在Linux系统中,可通过vim /etc/services来查看知名端口号:

在这里插入图片描述

一个进程是否能绑定多个端口号?

可以。以TCP为例,可以创建多个listen套接字,用的是不同的端口号。一个服务器可以创建两个端口号,一个进行发送数据,另一个进行发送控制命令。

一个端口号是否可以被多个进程绑定?

原则上不可以。需要保证端口号与服务之间的唯一性。

理解端口号和进程的关系

进程在Linux内核中实际上是一个struct task_struct,这就是描述进程的一个结构体。操作系统内部维护了一张哈希表,哈希表对应的key对应端口号,value对应进程PCB的地址。在进行bind绑定的时候是将进程PCB地址与哈希表的key端口号进程绑定,换言之,所谓的绑定就是将PCB地址和端口号构建在哈希表中。底层收到数据,读取到目的端口号就可以找到对应的进程,就可以将数据交给这个进程。因此一个端口号只能被一个进程绑定,需要保持key值唯一。

UDP协议

UDP协议格式

UDP报头一定是一个结构体

在这里插入图片描述

16 位 UDP 长度, 表示整个数据报(UDP 首部+UDP 数据)的最大长度

UDP特点

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

面向数据报

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

UDP缓冲区

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

UDP不需要可靠性保证,不需要丢包重传,只需要添加报头,UDP的报头很简单只有8个字节,添加报头后直接发送,因此不需要放在发送缓冲区保存起来。

虽然UDP不需要保证可靠性,但是起码需要保证报文不会大面积丢失,因此提供一个接收缓冲区,当上层正在读取UDP报文,操作系统可以继续接收UDP数据,这样也会在一定程度提高效率。接收缓冲区一旦写满了,这样再接收到的数据就会丢失。

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

使用注意事项

UDP 协议首部中有一个 16 位的最大长度. 也就是说一个 UDP 能传输的数据最大长度是 64K(包含 UDP 首部)。如果我们需要传输的数据超过 64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装。

基于UDP的应用层协议

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

进一步理解UDP报头

UDP报头实际上也是一个结构体,它的具体内容如下:

struct udphdr {
    __be16 source;      // 源端口号
    __be16 dest;        // 目标端口号
    __be16 len;         // UDP 数据长度(包括头部和数据部分)
    __be16 check;       // 校验和(UDP 校验和)
};

当我们需要拿到对应成员的数据时,使用二进制格式进行序列化即可,struct udphdr* h指向对应的成员。

进一步理解报文

在接收方或者发送方,通信双方的操作系统内会同时存在很多报文,要么向上交付,要么向下交付,UDP报文会接受很多数据。在进行通信时,需要对报文进行管理,先描述,再组织

描述报文的结构体为struct sk_buff,内部有数据包的头信息、数据、缓冲区等。将应用层数据拷贝到缓冲区实际上是将应用层数据拷贝到缓冲区,此时有了数据。

struct sk_buff {
    struct sk_buff *next;            // 指向下一个 sk_buff(链表结构)
    struct sk_buff *prev;            // 指向上一个 sk_buff(链表结构)

    struct net_device *dev;          // 网络设备(接口),即接收数据包的网卡

    unsigned int len;                // 数据包的长度
    unsigned int data_len;           // 有效数据的长度(不包括协议头)

    unsigned char *data;             // 指向数据区的指针(即数据包的负载部分)
    unsigned char *head;             // 数据包的开始地址(头部)

    unsigned char *tail;             // 数据包的尾部(通常指向空闲区域的结束)
    unsigned char *end;              // 数据包的结束地址(缓冲区末尾)

    unsigned int truesize;           // sk_buff 的实际大小(包括头部、数据区和尾部)

    struct sk_buff *next_free;       // 用于内核的 sk_buff 内存池中的链表

    struct sock *sk;                // 套接字结构体(用于连接和数据传输)
    unsigned int protocol;           // 数据包的协议类型(如 IPv4、IPv6、ARP 等)
    __be16 transport_header;        // 运输层协议头部位置(如 UDP、TCP)
    __be16 network_header;          // 网络层协议头部位置(如 IP)
    __be16 mac_header;              // 链路层协议头部位置(如以太网)

    // 更多字段和标志用于特定功能(例如 QoS、优先级、标记等)
};

然后添加UDP报头:

struct sk_buff bufffer;
(struct udphdr*) buffer->head-=sizeof(struct udphdr);
buffer->head->source=12345;
buffer->head->dest=8888;
buffer->head->len=100;
buffer->head->check=Check();

在这里插入图片描述

后续需要再添加报文时,head就继续往前移动即可。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/935873.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SEC_ASA 第二天作业

拓扑 按照拓扑图配置 NTP,Server端为 Outside路由器,Client端为 ASA,两个设备的 NTP传输使用MD5做校验。(安全 V4 LAB考点) 提示:Outside路由器作为 Server端要配置好正确的时间和时区,ASA防…

HTML5 拖拽 API 深度解析

一、HTML5 拖拽 API 深度解析 1.1 背景与发展 HTML5 的拖拽 API 是为了解决传统拖拽操作复杂而设计的。传统方法依赖鼠标事件和复杂的逻辑计算,而 HTML5 提供了标准化的拖拽事件和数据传递机制,使得开发者能够快速实现从一个元素拖拽到另一个元素的交互…

阿里云-通义灵码:测试与实例展示

目录 一.引子 二.例子 三.优点 四.其他优点 五.总结 一.引子 在软件开发的广袤天地中,阿里云通义灵码宛如一座蕴藏无尽智慧的宝库,等待着开发者们去深入挖掘和探索。当我们跨越了入门的门槛,真正开始使用通义灵码进行代码生成和开发工作…

第P2周:Pytorch实现CIFAR10彩色图片识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 实现CIFAR-10的彩色图片识别实现比P1周更复杂一点的CNN网络 具体实现 (一)环境 语言环境:Python 3.10 编 译 器: …

【数字花园】数字花园(个人网站、博客)搭建经历汇总教程

目录 写在最最前面第一章:netlify免费搭建数字花园相关教程使用的平台步骤信息管理 第二章:本地部署数字花园数字花园网站本地手动部署方案1. 获取网站源码2.2 安装 Node.js 3. 项目部署3.1 安装项目依赖3.2 构建项目3.3 启动http服务器 4. 本地预览5. 在…

Hadoop一课一得

Hadoop作为大数据时代的奠基技术之一,自问世以来就深刻改变了海量数据存储与处理的方式。本文将带您深入了解Hadoop,从其起源、核心架构、关键组件,到典型应用场景,并结合代码示例和图示,帮助您更好地掌握Hadoop的实战…

使用 GD32F470ZGT6,手写 I2C 的实现

我的代码:https://gitee.com/a1422749310/gd32_-official_-code I2C 具体代码位置:https://gitee.com/a1422749310/gd32_-official_-code/blob/master/Hardware/i2c/i2c.c 黑马 - I2C原理 官方 - IIC 协议介绍 个人学习过程中的理解,有错误&…

WPF Prism ViewInjection

ViewInjection介绍 ViewInjection是Prism框架提供的一种机制,用于将视图动态地注入到指定的容器(Region)中。这种注入方式允许你在运行时动态地添加、移除或替换视图,从而实现更灵活的用户界面设计。 ViewInjection示例 GitHub…

软考高级架构 - 11.1- 信息物理系统CPS

信息物理系统CPS 信息物理系统(CPS)是控制系统、嵌入式系统的扩展与延伸。通过集成先进的感知、计算、通信、控制等信息技术和自动控制技,构建了物理空间与信息空间中人、机、物、环境、信息等要素相互映射、适时交互、高效协同的夏杂系统。 CPS的本质是基于…

后端开发工程师需要掌握哪些设计模式?

大家好,我是袁庭新。 作为后端开发者,学习和掌握设计模式是非常有必要的。不仅可以帮助后端开发者更好地设计和实现软件架构,还可以提高代码的质量和可维护性。此外,设计模式也是后端开发面试中常见的考点之一,掌握它…

【Android Studio】学习——数据存储管理

AndroidStudio实验——数据存储管理 文章目录 AndroidStudio实验——数据存储管理[toc]一:实验目标和实验内容:二:数据库的CRUD操作【一】创建(Create)【2】读取(Read)【3】更新(Upd…

科研绘图系列:R语言绘制热图和散点图以及箱线图(pheatmap, scatterplot boxplot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载图1图2图3系统信息参考介绍 R语言绘制热图和散点图以及箱线图(pheatmap, scatterplot & boxplot) 加载R包 library(magrittr) library(dplyr) library(ve…

【Qt】信号、槽

目录 一、信号和槽的基本概念 二、connect函数:关联信号和槽 三、自定义信号和槽 1.自定义槽函数 2.自定义信号函数 例子: 四、带参的信号和槽 例子: 五、Q_OBJECT宏 六、断开信号和槽的连接 例子: 一、信号和槽的基本…

一种构建网络安全知识图谱的实用方法

文章主要工作 论述了构建网络安全知识库的三个步骤,并提出了一个构建网络安全知识库的框架;讨论网络安全知识的推演 1.框架设计 总体知识图谱框架如图1所示,其包括数据源(结构化数据和非结构化数据)、信息抽取及本体构建、网络…

JAVA后端实现全国区县下拉选择--树形结构

设计图如图&#xff1a; 直接上代码 数据库中的格式&#xff1a; JAVA实体类&#xff1a; Data public class SysAreaZoningDO {private Long districtId;private Long parentId;private String districtName;private List<SysAreaZoningDO> children; } MapperSQL语句…

青少年夏令营管理系统的设计与开发(社团管理)(springboot+vue)+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

安卓低功耗蓝牙BLE官方开发例程(JAVA)翻译注释版

官方原文链接 https://developer.android.com/develop/connectivity/bluetooth/ble/ble-overview?hlzh-cn 目录 低功耗蓝牙 基础知识 关键术语和概念 角色和职责 查找 BLE 设备 连接到 GATT 服务器 设置绑定服务 设置 BluetoothAdapter 连接到设备 声明 GATT 回…

Windows 系统中的组策略编辑器如何打开?

组策略是 Windows 操作系统中用于设置计算机和用户配置的重要工具。它允许管理员控制各种系统功能&#xff0c;从桌面背景到安全设置等。对于 Windows 专业版、企业版和教育版用户来说&#xff0c;可以通过组策略编辑器&#xff08;Group Policy Editor&#xff09;来管理这些设…

MySQL删除外键报错check that column/key exists

在我们删除外键的时候&#xff0c;报了check that column/key exists这个错误&#xff0c;这是因为你的外键名字没写对&#xff0c;我们以为我们写的字段名就是我们的外键其实并不是&#xff0c;我们可以通过show create table[ ]来查看外键的名字 所以删除外键的时候应该这样…

python学opencv|读取图像(十)用numpy创建彩色图像

【1】引言 前序文章中&#xff0c;我们已经学会了用numpy规划数据控制像素大小&#xff0c;然后用像素规划矩阵&#xff0c;对矩阵赋值后输出灰度图&#xff0c;相关链接为&#xff1a; python学opencv|读取图像&#xff08;八&#xff09;用numpy创建纯黑灰度图-CSDN博客 p…