【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就继续往前移动即可。


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车车牌识别数据集,支持YOLO,COCO,VOC格式的标注,8493张图片,可识别多种环境下的车牌

汽车车牌识别数据集,支持YOLO,COCO,VOC格式的标注,8493张图片,可识别多种环境下的车牌 数据集分割 训练组82% 6994图片 有效集12% 999图片 测试集6% 500图片 预处理 自动…

流网络复习笔记

所以这里的19是118-019 <s , w> 1/3就是容量是3&#xff0c;流量是1 残留网络就是两个相对箭头上都是剩余对应方向还能同行的流量 所以s->w 3-1 2, w->s 1

Mac m2电脑上安装单机Hadoop(伪集群)

1. 引言 本教程旨在介绍在Mac 电脑上安装Hadoop 2. 前提条件 2.1 安装JDK Mac电脑上安装Hadoop&#xff0c;必须首先安装JDK&#xff0c;并配置环境变量&#xff08;此处不做详细描述&#xff09; 2.2 配置ssh环境 关闭防火墙 在Mac下配置ssh环境&#xff0c;防止后面启…

使用html和JavaScript实现一个简易的物业管理系统

码实现了一个简易的物业管理系统&#xff0c;主要使用了以下技术和功能&#xff1a; 1.主要技术 使用的技术&#xff1a; HTML: 用于构建网页的基本结构。包括表单、表格、按钮等元素。 CSS: 用于美化网页的外观和布局。设置字体、颜色、边距、对齐方式等样式。 JavaScript…

2000-2022年各省产业结构高级化、产业结构合理化指数(两种方法)(含原始数据+计算过程+计算结果)

2000-2022年各省产业结构高级化、产业结构合理化指数&#xff08;两种方法&#xff09;&#xff08;含原始数据计算过程计算结果&#xff09; 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;统计年鉴、各省年鉴、人口和就业年鉴 3、指标&#xff1a;GDP、第一产业增加…

神经网络基础-初识神经网络

人工神经网络&#xff08; Artificial Neural Network&#xff0c; 简写为ANN&#xff09;也简称为神经网络&#xff08;NN&#xff09;&#xff0c;是一种模仿生物神经网络结构和功能的计算模型。人脑可以看做是一个生物神经网络&#xff0c;由众多的神经元连接而成。各个神经…

Mac安装brew的终极方法

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"按回车后&#xff0c;根据提示操作&#xff1a; 输入镜像序号&#xff08;1-5都可以&#xff09;输入Y&#xff0c;回车等待brew安装完成即可。 M系列芯片亲测有效&#x…

vscode借助插件调试OpenFoam的正确的.vscode配置文件

正确的备份文件位置&#xff1a; /home/jie/桌面/理解openfoam/正确的调试爆轰单进程案例/mydebugblastFoam 调试爆轰案例流体 并且工作区和用户区都是openfoam-7版本 问题&#xff1a;F5以debug模式启动后不停在断点 解决方法&#xff1a; 这里备份一下.vsode正确的配置&…

MATLAB2021B APP seriallist 串口通信

文章目录 前言一、项目需要二、使用步骤1.查找串口填写到查找列表2.发送函数3. 接收函数4.检测串口按钮5.选择串口号 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 项目需要&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面…

TIM输入捕获---STM

一、简介 IC输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存在CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器和通用定时器都拥有4个输入捕获通道 可配置为PWMI模…

Linux驱动开发(14):PWM子系统–pwm波形输出实验

PWM子系统用于管理PWM波的输出&#xff0c;与我们之前学习的其他子系统类似,PWM具体实现代码由芯片厂商提供并默认编译进内核&#xff0c; 而我们可以使用内核&#xff08;pwm子系统&#xff09;提供的一些接口函数来实现具体的功能&#xff0c;例如使用PWM波控制显示屏的背光、…

C++在关键嵌入式软件领域逐步取代 Ada 的演进历程

第一章&#xff1a;引言 1.1 Ada 与 C在嵌入式系统中的角色 在嵌入式系统开发领域的漫长演进历程中&#xff0c;Ada 与 C宛如两颗璀璨而又各具特色的星辰&#xff0c;交替影响着该领域的发展轨迹。它们不仅代表了两种不同的编程哲学&#xff0c;也反映了不同时期对软件可靠性…

商业化大前端在性能优化领域的探索与实践

导读&#xff1a;在业务飞速发展的过程中&#xff0c;用户体验是必不可少的一个环节&#xff0c;而页面性能是直接影响用户体验的重要因素。当页面加载时间过长、交互操作不流畅时&#xff0c;意味着业务可能会出现转化率降低、用户流失等业务问题。在过去一年&#xff0c;为了…

基于wifipumpkin3的AP伪造

一、软硬件需求 利用wifipumpkin-3进行AP伪造需要kali系统&#xff0c;还需要一张支持在kali的环境下能够支持AP伪造的无线网卡&#xff0c;如果是针对特定的无线网的话&#xff0c;再来第二张网卡的话更好用来转发流量更好。对于wifipumpkin-3的安装使用可以分为两种方式&…

【解决】k8s使用kubeadm初始化集群失败问题整理

执行提示命令&#xff0c;查看报错信息 journalctl -xeu kubelet1、错误&#xff1a;running with swap on is no 报错 "command failed" err"failed to run Kubelet: running with swap on is no 解决&#xff1a; swap未禁用&#xff0c;需要禁用swap&…

专升本-高数 1

第 0 章&#xff0c;基础知识 一&#xff0c;重要公式 1、完全平方 (ab)a2abb (a-b)a-2abb 2、平方差公式 &#xff08;a-b&#xff09;(ab)a-b 3、立方差公式 a-b(a-b)(aabb) 4、 立方和公式 ab(ab)(a-abb) 二&#xff0c;基本初等函数 1&#xff0c;幂函数 一元二…

桥接模式的理解和实践

桥接模式&#xff08;Bridge Pattern&#xff09;&#xff0c;又称桥梁模式&#xff0c;是一种结构型设计模式。它的核心思想是将抽象部分与实现部分分离&#xff0c;使它们可以独立地进行变化&#xff0c;从而提高系统的灵活性和可扩展性。本文将详细介绍桥接模式的概念、原理…

深入探索:createThread与cancelThread的用法及实例

在多线程编程领域,线程的创建与管理是核心技能之一。本文将详细介绍两个关键函数:createThread(用于创建新线程)和cancelThread(用于取消已存在的线程),并通过具体实例展示它们的用法。需要注意的是,不同的编程语言和线程库可能有不同的API设计,但基本概念是相通的。本…

SpringBoot【十三(完结篇)】集成在线接口文档Swagger2

一、前言&#x1f525; 环境说明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 二、Swagger常用注解 由于Swagger 是通过注解的方式来生成对应的 API&#xff0c;在接口上我们需要加上各种注解来描述这个接口&#xff0c;所以对它常用的注解我们是必…

麒麟信安推出支持信创PC的新一代云桌面方案,助力政务信创高效安全运维

12月11日&#xff0c;在第二届国家新一代自主安全计算系统产业集群融通生态大会上&#xff0c;麒麟信安发布了支持信创PC的新一代云桌面方案&#xff0c;该方案是基于国际TCI架构实现国产PC机云化纳管在国内的首次发布&#xff0c;并与银河麒麟桌面操作系统、长城国产PC整机实现…