传输层协议UDP详解

目录

一.   知识准备

1.1   传输层

1.2   重识端口号

二.   UDP协议

三.   UDP协议特点


一.   知识准备

1.1   传输层

前面已经讲过,HTTP协议是应用层协议,在此之前,我们短暂的认为HTTP是直接通过应用层与外界通信的。但是我们要知道,应用层需要向下将数据传到传输层,再由传输层向下传送。最终才能通过网络传输到接收方。

传输层负责保证可靠性传输,确保数据能够可靠地传送到接收方。

1.2   重识端口号

端口号的作用是标识主机上的一个唯一的进程。当目标主机接收到数据之后,需要自底向上进行数据的传送,最后根据端口号来确定该传给上层哪个进程。

端口号是属于传输层的概念,因此在传输层协议中就会包含与端口相关的字段。

五元组标识一个通信:

在TCP/IP协议中,用“源IP地址”、“源端口号”、“目的IP地址”、“目的端口号”、“协议号”这样一个五元组来标识一个通信。

 像上图这样,有多台主机访问服务器,这些主机中可能有多个进程在同时访问服务器。

而这台服务器收到请求之后,根据五元组分离出“源IP地址”“源端口号”“目的IP地址”“目的端口号”“协议号”这些元素。

  • 根据目的IP地址和目的端口号确定这些主机确实是想跟这台服务器通信。
  • 然后根据源IP地址和源端口号确定是哪台主机上的哪个进程想要通信。
  • 最后根据协议号确定该用什么类型进行通信。

也可以通过netstat命令查看五元组信息。

其中Local Address就是源IP和源端口号,Foreign Address就是目的IP和目的端口号。而Proto代表的就是协议类型。

端口号范围划分:

• 0 - 1023: 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的端口号都是固定的。

例如:

• ssh 服务器, 使用 22 端口

• ftp 服务器, 使用 21 端口

• telnet 服务器, 使用 23 端口

• http 服务器, 使用 80 端口

• https 服务器, 使用 443

• 1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的。

协议号 VS  端口号:

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

两个问题:

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

这是绝对不行的,因为我们是通过端口号来标识唯一的一个进程,如果我们将一个端口号绑定多个进程。通信时就不知道该与哪个进程通信。

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

这个是可以的,与“端口号唯一标识一个进程”不冲突,只不过现在变成了一个进程可以由多个端口号来标识。

二.   UDP协议

网络套接字编程时用到的各种接口,是位于应用层和传输层之间的一层系统调用接口,这些接口是系统提供的,我们可以通过这些接口搭建上层应用,比如HTTP。我们经常说HTTP是基于TCP的,实际就是因为HTTP在TCP套接字编程上搭建的。

而socket接口往下的传输层实际就是由操作系统管理的,因此UDP是属于内核当中的,是操作系统本身协议栈自带的,其代码不是由上层用户编写的,UDP的所有功能都是由操作系统完成,因此网络也是操作系统的一部分。

  • 16位源端口号:表示数据从哪里来。
  • 16位目的端口号:表示数据要到哪里去。
  • 16位UDP长度:表示整个数据报(UDP首部 + UDP数据)的长度。
  • 16位UDP检验和:如果UDP报文的检验和出错,就会直接将报文丢弃。

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

UDP如何实现报头与数据的分离?

 可以看到,报头里面只有四个部分,每个部分的长度都是16位,总共8字节。所以可以将报头看做定长的,那么只需在读取的时候将前面8字节的报头读完,剩下的就是数据。

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

UDP上层也有很多应用层协议,因此UDP必须想办法将有效载荷交给对应的上层协议,也就是交给应用层对应的进程。

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

特别注意:内核中用哈希的方式维护了端口号与进程ID之间的映射关系,因此传输层可以通过端口号得到对应的进程ID,进而找到对应的应用层进程。 

三.   UDP协议特点

UDP传输的过程类似于寄信,其特点如下:

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

 注意:报文在网络中进行路由转发时,并不是每一个报文选择的路由路径都是一样的,因此报文发送的顺序和接收的顺序可能是不同的。


面向数据报:

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

用 UDP 传输 100 个字节的数据:

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

UDP的缓冲区:

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

为什么UDP要有接收缓冲区?

如果UDP没有接收缓冲区,那么就要求上层及时将UDP获取到的报文读取上去,如果一个报文在UDP没有被读取,那么此时UDP从底层获取上来的报文数据就会被迫丢弃。

一个报文从一台主机传输到另一台主机,在传输过程中会消耗主机资源和网络资源。如果UDP收到一个报文后仅仅因为上次收到的报文没有被上层读取,而被迫丢弃一个可能并没有错误的报文,这就是在浪费主机资源和网络资源。

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

UDP使用注意事项:

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

然而 64K 在当今的互联网环境下, 是一个非常小的数字。

如果我们需要传输的数据超过 64K, 就需要在应用层手动的分包, 多次发送, 并在接收端 手动拼装;


基于UDP的应用层协议:

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

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


总结:

好了,到这里今天的知识就讲完了,大家有错误一点要在评论指出,我怕我一人搁这瞎bb,没人告诉我错误就寄了。

祝大家越来越好,不用关注我(疯狂暗示)

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

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

相关文章

DOTween动画插件超详解(保姆级巨细)

文章目录 一、前言二、DOTween简介与安装(一)什么是DOTween?(二)下载安装 三、DOTween 的使用(基础)(一)使用前注意事项1. 引入命名空间2. 进行初始化3. 清除遗留4. 设置…

基于Java的电商书城系统源码带本地搭建教程

技术框架:jQuery MySQL5.7 mybatis jsp shiro 运行环境:jdk8 IntelliJ IDEA maven3 宝塔面板 系统功能介绍 该系统分为前台展示和后台管理两大模块,前台主要是为消费者服务。该子系统实现了注册,登录, 以及…

asp.net core mvc发布时输出视图文件Views

var builder WebApplication.CreateBuilder(args); builder.Services.AddRazorPages();builder.Services.AddControllersWithViews(ops > {//全局异常过滤器&#xff0c;注册ops.Filters.Add<ExceptionFilter>(); })// Views视图文件输出到发布目录&#xff0c;视图文…

使用 VSCode 通过 Remote-SSH 连接远程服务器详细教程

使用 VSCode 通过 Remote-SSH 连接远程服务器详细教程 在日常开发中&#xff0c;许多开发者需要远程连接服务器进行代码编辑和调试。Visual Studio Code&#xff08;VSCode&#xff09;提供了一个非常强大的扩展——Remote-SSH&#xff0c;它允许我们通过 SSH 协议直接连接远程…

背包九讲——完全背包问题

目录 完全背包问题 问题定义 动态规划解法 状态转移方程 初始化 遍历顺序 三种解法&#xff1a; 朴素版——枚举k 进阶版——dp正推&#xff08;一维滚动数组&#xff09; 背包问题第三讲——完全背包问题 背包问题是一类经典的组合优化问题&#xff0c;通常涉及在限定…

kafka 的高可用机制是什么?

大家好&#xff0c;我是锋哥。今天分享关于【kafka 的高可用机制是什么&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka 的高可用机制是什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Apache Kafka 是一个分布式消息系统&am…

《性能之巅:洞悉系统、企业与云计算》读书笔记-Part 1

本文是读书笔记第一部分&#xff0c;包括原书第一、二章。 绪论 性能是一门令人激动的&#xff0c;富于变化同时又充满挑战的学科。 系统性能 单台服务器上的通用系统软件栈 人员 系统性能是一项需要多类人员参与的工程。 事情 关于性能的理想执行顺序排列如下&#x…

8个方法教会你提高企业培训效率

培训成本是企业中的一个复杂问题。它完全取决于课程内容、培训方法以及成本效益。在计算培训费用时&#xff0c;公司会面临许多关于包括哪些内容、如何进行以及假设情景的问题。 企业员工培训的每个方面都会产生自己的成本。例如&#xff1a; 地点&#xff1a;我们专门找个培训…

【重拾算法第一天】质数约数欧拉筛 埃氏筛GCD

1.素数 素数&#xff08;Prime Number&#xff09;是指大于1的自然数&#xff0c;只有两个正因数&#xff1a;1和它自身。换句话说&#xff0c;素数是不能被其他自然数整除的数。 1.1小素数的判定 判定一个数是否为素数 &#xff0c;当N ≤ 时&#xff0c; 用试除法 &#…

Redis 命令集 (超级详细)

目录 Redis 常用命令集 string类型 hash类型 list类型 set类型 zset类型 bitmap 类型 geo 类型 GEOADD (添加地理位置的坐标) GEOPOS (获取地理位置的坐标) GEODIST (计算两个位置之间的距离) GEOHASH (返回一个或多个位置对象的 geohash 值) GEORADIUS (根据用户…

DAF-Net:一种基于域自适应的双分支特征分解融合网络用于红外和可见光图像融合

题目&#xff1a;DAF-Net: A Dual-Branch Feature Decomposition Fusion Network with Domain Adaptive for Infrared and Visible Image Fusion 作者&#xff1a;JianXu发表时间&#xff1a;2024年9月 面临的问题&#xff1a;红外图像擅长捕捉热辐射&#xff0c;特别是在低…

国家能源集团携手海康威视研发攻克融合光谱煤质快检技术

10月24日&#xff0c;在国家能源集团准能集团黑岱沟露天煤矿&#xff0c;安装于准能选煤厂785商品煤胶带机中部的煤质快检核心设备&#xff0c;正在对当天装车外运的商品煤煤质进行实时检测。仅两分钟后&#xff0c;涵盖发热量、水分、灰分、硫分等多项指标的数据信息已传输到到…

前端方案:播放的视频加水印或者文字最佳实践

前言&#xff1a; 很多时候&#xff0c;视频的转码工作在后端&#xff0c;我们前端是拿到可以播放的链接进行播放即可。但是总是会出现一些定制化的需求&#xff0c;比如在视频的某个区域贴上水印、标识或者文字。这个时候大部分是由前端来操作的。 直接去修改播放器里的东西…

c语言指针详解2

c语言指针详解2 1.数组名理解 数组名其实是地址&#xff0c;是数组首元素的地址&#xff08;详解1有提及&#xff09; 我们可以根据打印来确认 我们发现数组名和数组⾸元素的地址打印出的结果⼀模⼀样&#xff0c;数组名就是数组⾸元素(第⼀个元素)的地址。 但是上述结论有…

DataX简介及使用

目录 一、DataX离线同步工具DataX3.0介绍 1.1、 DataX 3.0概览 1.2、特征 1.3、DataX3.0框架设计 1.4、支持的数据元 1.5、DataX3.0核心架构 1.6、DataX 3.0六大核心优势 1.6.1、可靠的数据质量监控 1.6.2、丰富的数据转换功能 1.6.3、精准的速度控制 1.6.4、强劲的…

轻松清理 PC 微信文件,释放存储空间

软件介绍 微信在我们的日常生活中使用频率极高&#xff0c;但随着时间的推移&#xff0c;它占用的存储空间也越来越大。以一个使用了两年时间的微信为例&#xff0c;它可能会占用多达几十G的存储空间。其中大部分都是与自己无关的各大群聊中的文件、视频、图片等内容&#xff…

java导出带图形的word

先看效果图&#xff1a;方法都是一样的&#xff0c;所以数据只做了前两组 第一步需要准备模版&#xff1a; 新建一个word插入图表&#xff0c;选择想要的图表。 编辑图表&#xff1a;营业额表示数字&#xff0c;季度表示文字。其他的样式编辑可根据自己的需求更改&#xff0c;…

从 Vue 2 到 Vue 3:全面升级指南

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vuet篇专栏内容:Vue-从 Vue 2 到 Vue 3&#xff1a;全面升级指南 前言 随着前端技术的不断发展&#xff0c;Vue.j…

基于大型语言模型的智能网页抓取

Google Gemini 是 Google AI 创建的大型语言模型 (LLM) 系列&#xff0c;可提供最先进的 AI 功能。Gemini 模型包括&#xff1a; Gemini Ultra — 最大、最强大的模型&#xff0c;擅长处理编码、逻辑推理和创意协作等复杂任务。可通过 Gemini Advanced&#xff08;原名 Bard&a…

FreeRTOS任务状态_改进播放控制 任务管理与调度 空闲任务及其钩子函数 两个Delay函数

任务状态_改进播放控制 FreeRTOS源码概述&#xff08;内存管理&#xff0c;入口函数&#xff0c;数据类型和编程规范&#xff09;创建任务&#xff08;声光色影&#xff0c;使用任务参数&#xff09;删除任务&#xff08;使用遥控器控制音乐&#xff09;-CSDN博客https://blog…