【网络编程】传输层——UDP协议

news2024/10/6 12:28:10

文章目录

  • 一、传输层
    • 1. 再谈端口号
    • 2. 端口号范围划分
    • 3. 认识知名端口号
    • 4. 两个问题
    • 5. netstat 与 pidof
  • 二、UDP协议
    • 1. UDP协议格式
    • 2. UDP协议的特点
    • 3. 面向数据报
    • 4. UDP的缓冲区
    • 5. UDP使用注意事项
    • 6. 基于UDP的应用层协议


一、传输层

传输层 负责负责两台计算机之间的端到端的通信,确保数据能够可靠的传送到目标主机,为应用层提供可靠的数据传输服务。我们可以简单的理解为传输层协议是将数据直接发送到了网络当中。


1. 再谈端口号

端口号(Port) 标识了一个主机上进行通信的不同的应用程序。当主机从网络中获取数据时,数据需要自底向上进行交付,而上层存在多个应用程序,那么交付给哪一个应用程序就由端口号来决定。

在这里插入图片描述

因此端口号是传输层的概念,在传输层协议的报头中包含有与端口号相关的字段。

五元组标识一个通信

在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -n 查看)。其中 IP 地址和端口号标识网络中唯一的一个进程,而协议号是一个整数,用于标识传输层使用的协议类型。常见的传输层协议包括 TCP 协议、UDP 协议等。

通过 netstat命令 查看五元组信息

  • -a:显示所有网络连接,包括正在监听的和建立的连接。
  • -n:以数值形式显示网络地址和端口号,而不是域名和服务名。
  • -p:显示与连接相关的进程和程序名。
  • -r:显示当前系统的路由表信息。
  • -s:显示网络统计信息,如 TCP 和 UDP 的错误、丢包等。
  • -t:显示所有 TCP 连接。
  • -u:显示所有 UDP 连接。
  • -l:显示处于监听状态的连接。

在这里插入图片描述
在这里插入图片描述

💕 关于协议号和端口号

  • 协议号是存在于IP报头当中的,其长度是8位,协议号指明了数据报所携带的数据是使用何种协议,以便于让目的主机的IP层知道应该将该数据交付给传输层的哪一个协议进行处理。
  • 端口号是存在于UDP和TCP报头当中的,其长度是16位,端口号的作用是唯一标识一台主机上的某个进程。

2. 端口号范围划分

端口号的长度是16位,因此端口号的范围是 0~65535

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

3. 认识知名端口号

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

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

💕 查看知名端口号

/etc/services # 在该文件中查看网络服务名和它们对应使用的端口号及协议

在这里插入图片描述

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


4. 两个问题

💕一个端口号可以被多个进程绑定吗?

  • 通常情况下,一个端口号只能被一个进程绑定。这是因为端口号用于标识网络上的特定服务,当客户端尝试连接到服务器的某个端口时,操作系统需要知道哪个进程负责处理该连接请求。如果多个进程绑定到同一个端口号,操作系统将无法确定应该将连接请求发送给哪个进程。因此,当一个进程试图绑定到已经被另一个进程占用的端口时,操作系统通常会返回错误。
  • 但是如果采取的通信协议不同,就可以绑定同一个端口号。例如:一个进程可以使用 TCP 协议绑定到端口号 80,而另一个进程可以使用 UDP 协议绑定到端口号 80。这是因为操作系统不仅根据端口号,还根据通信协议来区分不同的服务。因此,当客户端尝试连接到服务器的某个端口时,操作系统会根据客户端使用的通信协议来确定应该将连接请求发送给哪个进程。

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

一个进程可以绑定多个端口号,只不过现在这多个端口号唯一标识的是同一个进程罢了。我们限制的是从端口号到进程的唯一性,而没有要求从进程到端口号也必须满足唯一性,因此一个进程是可以绑定多个端口号的。


5. netstat 与 pidof

netstat 是一个用来查看网络状态的重要工具

  • 语法: netstat [选项]
  • 功能:查看网络状态
  • 常用选项
    • n 拒绝显示别名,能显示数字的全部转化成数字
    • l 仅列出有在 Listen (监听) 的服務状态
    • p 显示建立相关链接的程序名
    • t (tcp)仅显示tcp相关选项
    • u (udp)仅显示udp相关选项
    • a (all)显示所有选项,默认不显示LISTEN相关

在这里插入图片描述


pidof 命令用于查找指定名称进程的进程 ID。

例如,我们随便创建一个进程演示一下:

在这里插入图片描述

pidof命令可以配合kill命令快速杀死一个进程。

在这里插入图片描述


二、UDP协议

1. UDP协议格式

在这里插入图片描述

  • 源端口:这个字段占据 UDP 报文头的前 16 位,通常包含发送数据报的应用程序所使用的 UDP 端口。接收端的应用程序利用这个字段的值作为发送响应的目的地址。
  • 目的端口:接收端计算机上 UDP 软件使用的端口,占据 16位。
  • UDP长度:该字段占据 16 位,表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度。因为 UDP 报文头长度是 8 个字节,所以这个值最小为 8。
  • 校验值:该字段占据 16 位,可以检验数据在传输过程中是否被损坏。如果数据报未被损坏,网络协议栈会将其传递给上层应用程序进行处理。但是如果数据报在传输过程中丢失或损坏,UDP 协议并不会对其进行重传。

我们一般在应用层看到的端口号大部分都是16位的,根本原因就是传输层协议当中的端口号就是16位。


💕 UDP是如何将报头和有效载荷进行分离的?

UDP报头当中包含4个字段,每个字段的长度都是16位,总共8字节。因此UDP采用的实际上是一种定长报头。UDP在读取报文时读取完前8个字节后剩下的就是有效载荷了。

💕 UDP如何决定将有效载荷交付给上层的哪一个协议的?

应用层的每一个网络进程都会绑定一个端口号,服务端进程必须显示绑定一个端口号,UDP就是通过报头当中的目的端口号来找到对应的应用层进程的。

这里我们需要注意的是:操作系统会维护一个端口号到进程的映射表,当网络协议栈确定了数据报应该交给哪个端口号时,它会查询这张映射表,找到对应的进程,然后将有效载荷传递给该进程进行处理。


💕 如何理解报头?

Linux内核是C语言写的,UDP协议又属于内核协议栈,因此UDP协议也是用C语言写的,UDP报头本质上也是一个结构体或者位段类型的。

UDP数据封装

在这里插入图片描述

  • 当应用层将数据交给传输层后,在传输层就会创建一个UDP报头类型的变量,然后填充报头当中的各个字段,此时就得到了一个UDP报头。
  • 此时操作系统再在内核中开辟一块空间将UDP报头和有效载荷拷贝到一起,此时就形成了UDP报文。

UDP数据分用

在这里插入图片描述

  • 当传输层从下层获取到一个报文后,就会读取该报文的前8个字节,提取出对应的目的端口号。
  • 通过目的端口号找到对应的上层应用进程,然后将剩下的有效载荷向上囧付给该应用进程。

2. UDP协议的特点

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

3. 面向数据报

应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并。这就叫做 面向数据报

这意味着它将应用层传递给它的数据作为一个独立的数据报来处理。每个数据报都包含了足够的信息,使得接收端能够将其独立地传递给上层应用程序。

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


4. UDP的缓冲区

sendto、recvfrom、send、recv、write 和 read 等 IO 类接口都是用于在应用程序和操作系统内核之间传输数据的系统调用。它们的本质是在用户空间和内核空间之间拷贝数据。

除了拷贝数据之外,这些 IO 类接口还会执行其他操作,如检查套接字状态、设置套接字选项、处理错误等。因此,它们不仅仅是简单的拷贝函数。

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

UDP协议使用缓冲区来存储发送和接收的数据。在Linux内核中,这些缓冲区由sk_buff结构体表示。每个sk_buff结构体都包含指向数据缓冲区的指针,以及有关数据包的其他信息。

当应用程序调用sendto函数发送数据时,内核会将数据拷贝到一个sk buff结构体中,然后将其添加到发送队列中。网络协议栈会从发送队列中取出数据包,并将其发送到网络。

当内核接收到一个UDP数据包时,它会将数据包存储在一个sk buff结构体中,并将其添加到接收队列中。当应用程序调用recvfrom函数接收数据时,内核会从接收队列中取出一个数据包,并将其中的数据拷贝到应用程序提供的缓冲区中。

UDP本身会维护一个接收缓冲区,当有新的UDP报文到来时就会把这个报文放到接收缓冲区当中,此时上层在读数据的时就直接从这个接收缓冲区当中进行读取就行了,而如果UDP接收缓冲区当中没有数据那上层在读取时就会被阻塞。因此UDP的接收缓冲区的作用就是,将接收到的报文暂时的保存起来,供上层读取。


5. UDP使用注意事项

我们注意到,UDP协议首部中有一个16位的最大长度,也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。

然而64K在当今的互联网环境下, 是一个非常小的数字,如果我们需要传输的数据超过64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装。


6. 基于UDP的应用层协议

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

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


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云2023年双11活动时间、活动入口、活动内容详细解读

阿里云2023年双11活动正在火热进行中,双11活动时间,阿里云推出了金秋上云季活动,活动包括满减礼包福利,云产品降价让利,下面给大家整理分享阿里云双11活动时间、活动入口、活动内容,助力大家轻松上云&#…

网络爬虫-Requests库主要方法解析

一、Requests库的7个主要方法 其中,request()是 基础方法,其他6个方法都是基于request()的,但最常用的是get() 和 head() 二、request() 13个访问控制参数: 三、get(): 获取某一个url链接的相关资源 四、head() 五、post() 六、…

LCR 021. 删除链表的倒数第 N 个结点

这篇也是凑数的 .... 描述 : 给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点 题目 : LeetCode 删除链表的倒数第Nge节点 : LCR 021. 删除链表的倒数第 N 个结点 分析 : 首先创建一个虚拟节点(哨兵节点) , 虚拟节点下一节点指向头节…

从 malloc 分配大块内存失败 来简看 linux 内存管理

文章目录 背景Glibc MallocMalloc 分配大块内存失败原因Overcommit_memory 实现OOM (Out Of Memory) 的实现 背景 应用进程 malloc 返回了null,但是观察到的os 的free内存还有较大的余量 ,很奇怪为什么会这样? 不可能是oom导致的&#xff0…

GAMP源码阅读(上)主要类型、后处理流程、RINEX文件读取

原始 Markdown文档、Visio流程图、XMind思维导图见:https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、GAMP 简介1、程序概述2、工具箱介绍3、函数调用关系4、程序执行流程 二、基础类型定义1、宏定义2、结构体定义3、矩阵、向量、最小二乘、卡尔…

以“信”数智,筑“广”生态:亚信科技CEO高念书受邀出席中国广电数字化赋能大会

6月30日,由国家广播电视总局指导、中国广电集团主办的中国广电数字化赋能大会在京召开。国家广播电视总局党组成员、副局长杨小伟,工信部总工程师赵志国,中国移动党组成员、副总经理高同庆等出席会议并致辞,中广电移动网络有限公司…

【ICCV2023】频率成分在少样本学习中的重要性

论文标题:Frequency Guidance Matters in Few-Shot Learning 论文链接:https://openaccess.thecvf.com/content/ICCV2023/html/Cheng_Frequency_Guidance_Matters_in_Few-Shot_Learning_ICCV_2023_paper.html 代码:暂未开源 引用:…

基于SpringBoot的医院后台管理系统设计与实现

目录 前言 一、技术栈 二、系统功能介绍 管理员功能实现 患者管理 公告信息管理 公告类型管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 四、结论 前言 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理…

[云原生1.] Docker镜像的创建

文章目录 1. Docker镜像概述1.1 简介1.2 镜像结构的分层详解 2. 创建Docker镜像的方法类别2.1 基于已有镜像创建2.1.1 创建流程2.1.2 示例 2.2 基于本地模板创建2.2.1 示例 2.3 基于Dockerfile 创建 3. 联合文件系统(UnionFS)2.1 简介2.2 特性 4. Docker…

云原生-AWS EC2使用、安全性及国内厂商对比

目录 什么是EC2启动一个EC2实例连接一个实例控制台ssh Security groups规则默认安全组与自定义安全组 安全性操作系统安全密钥泄漏部署应用安全元数据造成SSRF漏洞出现时敏感信息泄漏网络设置错误 厂商对比参考 本文通过实操,介绍了EC2的基本使用,并在功…

【排序算法】 归并排序详解!分治思想!

🎥 屿小夏 : 个人主页 🔥个人专栏 : 算法—排序篇 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言🌤️归并排序的思想☁️基本思想☁️归并的思想实现☁️分治法 &#x1f3…

并发编程 -常用并发设计模式

1. 优雅终止线程的设计模式 思考:在一个线程 T1 中如何优雅的终止线程 T2? 错误思路1:使用线程对象的 stop() 方法停止线程 stop 方法会真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释 …

C/C++角谷猜想 2020年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C角谷猜想 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C角谷猜想 2020年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 所谓角谷猜想,是指对于任意一个正整数&…

windows电脑安装系统后固态硬盘和机械硬盘的盘符号顺序显示错乱,解决方法

一、场景 由于电脑磁盘是SSD固态硬盘自己拓展的1T机械硬盘组成,固态硬盘分为C、D两个盘区,机械硬盘分为E、F两个盘区。为了提升运行速度,系统安装在C盘,安装完成后按照习惯盘区顺应该为C、D、E、F,但实际情况却是D、E…

剑指offer --- 二维数组中的元素查找

目录 一、读懂题目 二、思路分析 三、代码呈现 总结 一、读懂题目 题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的个二维数组和一个整数&#…

用baostock库获取沪深300成分股

先看效果: 代码,bs_get_hs300.py import baostock as bs import pandas as pd# 登陆系统 lg bs.login() # 显示登陆返回信息 print(login respond error_code:lg.error_code) print(login respond error_msg:lg.error_msg)# 获取沪深300成分股 rs bs…

Android开发工具介绍(adb、AVD、DDMS)

目录 1. adb 1.1 查看设备 1.2 安装软件 1.3 卸载软件 1.4 登录设备 shell 1.5 从计算机上发送文件到目标机 1.6 从目标机上下载文件到计算机 1.7 显示帮助信息 2. AVD 2.1 AVD 的创建 2.2 启动 AVD 模拟器 3. DDMS 3.1 DDMS的启动方法 3.2 DDMS 工…

H5游戏源码分享-密室逃脱小游戏(考验反应能力)

H5游戏源码分享-密室逃脱小游戏&#xff08;考验反应能力&#xff09; 预判安全位置&#xff0c;这个需要快速的反应能力 源码 <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /&…

WEB登录设备控制台异常——TLS协议问题

问题描述&#xff1a;登录设备web控制台浏览器报错&#xff0c;切换其他浏览器也有问题。 出现这个问题&#xff0c;大概率是网站支持的TLS协议很低&#xff0c;而浏览器的TLS协议很高&#xff0c;那么就是是降浏览器的TLS版本。 解决步骤&#xff1a; 1、火狐浏览器地址栏输…

DbVisualizer和DBeaver启动不来,启动报错

启动报错 大多数启动报错都是因为你没有用管理员身份运行程序&#xff0c;提示的错误都是八竿子打不着的什么jdk、jvm问题。 比如DbVisualizer提示什么jvm配置参数&#xff0c;实际dbvis.exe 用管理员身份打开即可&#xff08;右键 dbvis.exe->属性->兼容性->勾上 “…