【网络通信】传输层之UDP协议

【网络通信】传输层之UDP协议

  • 传输层
    • 端对端通信
      • 实现端到端通信的关键技术
  • UDP协议
    • 再谈端口号
      • 端口号划分
      • 关于端口号的两个问题
    • UDP协议基本格式
    • UDP通信的特点
    • UDP的缓冲区
    • UDP数据报的最大长度
    • 基于UDP的应用层协议
    • 如何封装UDP报文以及如何交付UDP报文
    • 进一步理解封装和解包

传输层

传输层(Transport Layer)是计算机网络体系结构中的一个重要层次,它主要负责端到端的通信,确保数据能从一个终端(节点)传到另一个终端(节点)。它是OSI七层模型中的第四层,也是TCP/IP协议中的重要层之一。它主要提供面向连接和无连接的服务。

端对端通信

端对端通信简单来说就是只关注两个终端之间的直接通信,而忽略了底层网络的差异,为用户提供简单的网络通信模型。端:终端设备。

我们举个通俗点的例子来理解端对端的通信:

假设此时你在给你的朋友写信,信写完后会通过快递员运输,虽然可能你的信件会经过很多地方,但是这些地方都不会关注你的信件的具体内容(它只有到你朋友这里才会被拆封),最终信件到你朋友这里,逻辑上就好像你们直接通信一样

image-20250209121147811

端对端通信就像这样,只不过是在网络中,一条信息经过主机A发送给主机B,中间可能经过很多的路由节点,但是这些路由节点只负责传输数据,并不关系具体内容,最终消息会到主机B手中。逻辑上可以认为是这两个终端直接通信。

实现端到端通信的关键技术

  • 传输层协议:如前面提到的TCP和UDP。TCP提供了一种面向连接的服务,保证了数据的可靠传输;而UDP则是一种无连接的服务,虽然不保证数据的可靠性,但是具有较低的延迟,适用于实时性要求较高的场景。
  • 路由选择:利用IP地址和路由算法决定数据包的最佳路径。尽管路由器不知道所承载的应用层数据的具体意义,但它们根据网络拓扑结构来决定如何最有效地转发数据包。
  • 防火墙与NAT穿越:为了确保端到端的安全性和可访问性,还需要解决诸如防火墙限制和网络地址转换(NAT)带来的挑战。这通常涉及到特定的技术,如STUN、TURN和ICE等,用于帮助建立P2P连接。

下面我们来介绍传输层的两大重要协议:UDPTCP协议。

UDP协议

再谈端口号

端口号是用来标识某个主机中提供网络服务的进程的,它可以区分不同的提供网络服务的进程,因为主机中可能有很多进程在同一时刻提供网络服务。

image-20250209130522892

TCP/IP协议中使用源IP源端口号目的IP目的端口号协议号这样一个五元组来标识一个通信,我们可以使用指令netstat -n来查看:

image-20250209132413759

  1. Proto:协议(Protocol)。显示使用的网络协议,这里为tcp,表示使用的是TCP协议。
  2. Recv-Q:接收队列(Receive Queue)。显示连接当前在本地等待上层应用处理的数据量大小。对于已建立的连接,如果这个值不为0,可能意味着数据没有被及时读取。在这个例子中,它的值是0,表明没有未处理的数据。
  3. Send-Q:发送队列(Send Queue)。显示连接当前等待远端主机确认的数据量大小。通常,在连接正常工作时,这个值应该是0,除非远端主机没有正确地确认接收到的数据包。此例中也为0
  4. Local Address:本地地址。显示本地计算机上的IP地址和端口号。这里的127.0.0.1:44636表示这是一个本地回环接口上的连接,即连接发生在本机上,端口号为44636
  5. Foreign Address:外部地址。显示远程计算机的IP地址和端口号。同样地,这里的127.0.0.1:36731表示这也是一个本地回环接口上的连接,端口号为36731。这意味着该连接实际上是在同一台机器上的两个进程之间进行的通信。
  6. State:状态。表示TCP连接的状态。常见的状态包括LISTEN(监听)、ESTABLISHED(已建立)、TIME_WAIT等。这里的TIME_WAIT表示该连接已经完成了正常的关闭过程,但为了确保网络上的所有数据包都被清除,连接暂时保持在这个状态一段时间。

端口号划分

端口号的范围为0~65535,根据注册和用途,大致可以分为以下三类:

  1. 知名端口

    • 范围:0~1023

    • 描述:这些端口通常不会开放给开发者使用,它们用作特殊的服务,为常见的服务器保留。例如:

      • 80 HTTP:超文本传输协议,用于网页浏览。
      • 443 HTTPS:安全的HTTP连接,通过SSL/TLS加密。
      • 25 SMTP:简单邮件传输协议,用于发送电子邮件。
      • 22 SSH:安全外壳协议,用于安全地远程登录到另一台计算机。
  2. 注册端口

    • 范围:1024~49151

    • 描述:这些端口没有被像知名端口一样严格被定义,它可以开放给开发者使用。尽管如此,许多动态服务也会选择在这个范围内运行,只要不与已知的服务冲突即可。

      • 8080 常用作HTTP代理服务器或其他Web服务的备用端口。
      • 1433 Microsoft SQL Server 默认实例使用的端口。
  3. 动态/私有端口

    • 范围:49152到65535

    • 描述:这些端口主要用于客户端的临时通信。因为客户端一般进行网络服务时,bind源端口号都是系统动态bind,所bind的都是这里面的端口号,由于这些端口是动态分配的,因此不应该长期固定地分配给任何特定的服务。

关于端口号的两个问题

  1. 一个进程是否可以bind多个端口号。
    • 同一个进程是可以bind多个端口号的,如果你想提供不同的服务的话。但是同一个套接字不能bind多个端口号,可以在同一个进程中创建不同的套接字,同时给它们bind不同的套接字,这两个套接字分别用于提供不同的服务。
  2. 同一个端口号是否可以被多个套接字bind
    • 一般情况下,同一个端口号不能被多个套接字同时bind。每个套接字bind一个特定的IP地址和端口号组合,如果将第二个套接字bind在已经被bind的套接字上,就会bind失败。
      • 存在特殊情况,在bind前设置套接字模式为SO_REUSEADDR选项,允许多个套接字绑定到相同的IP地址和端口组合,但这通常仅适用于监听套接字,并且主要用于实现高可用性的服务器架构,其中多个实例可以接受客户端连接,这种情况只是为了让服务器可以快速启动,并不是这个端口被多个服务器bind了,因为服务器在被ctrl C终止后,连接会处于一个TIME_WAIT的状态,所以需要等待一段时间,但是这个只有TCP才会出现这种问题。

UDP协议基本格式

image-20250209150931817

传输层在OS内核中就是结构体数据,例如上面的UDP协议也是可以由结构体来描述其数据的,像http协议一样:

struct udphdr {__u16	source;//源端口号__u16	dest;//目的端口号__u16	len;//UDP长度__u16	check;//校验和
};

相关字段介绍:

16位源端口号:填充本进程在网络通信中使用的端口号。

16位目的端口号:填充通信方在网络通信中使用的端口号。

16位UDP长度:填充UDP数据报的总长度,包括头部8字节的数据。

16位UDP校验和:虽然UDP是不可靠的,但是还是提供了简单的数据校验的方法,通常这个校验和的计算是有一个固定的方式的(与此次通信的协议中的字段相关),通过计算填充到这个字段中,通过网络传输后再次计算,如果两次结果不同就证明传输过程中出现了问题。

UDP通信的特点

  1. 无连接:UDP通信不需要事先建立连接,这一点相信很好理解,如果你学习过UDP套接字通信,编写过UDP网络通信的echo代码的话。

  2. 不可靠:UDP协议简单,并没有提供很多对数据检验的方法,所以数据没有TCP可靠。

  3. 面向数据报:这一点在网络编程中有体现,在创建UDP的套接字时,需要将其设置为SOCK_DGRAMDGRAM的中文翻译就是数据报。上述UDP的一个协议就构成一个数据报,它是一个独立的实体,每个数据报都有自己的头部和有效载荷。

    image-20250209153600476

应用层会把数据交付给传输层,如果传输层使用的是UDP协议,它既不会拆分也不会合并而是原样发送。

example:假设此时调用sendto发送1000字节的数据给客户端,客户端也必须调用recvform一次性接收1000字节,而不能调用10次recvfrom循环接收,因为数据包不会被拆分

UDP的缓冲区

  • UDP没有发送缓冲区,调用sendto后,数据会被交给内核中的传输层(通过不同的套接字交给不同的协议),然后进行相应的封装(添加数据头部),之后由OS交给网络层。

  • UDP有接收缓冲区,但是这个接收缓冲区不能保证发送的数据报的顺序是否和发送时一致,同时当这个缓冲区满了之后,数据报会被丢弃。

UDP是全双工的,可以同时接收,同时发送。

UDP数据报的最大长度

在IPv4中,理论上最大的UDP数据报长度可以达到65,535字节(因为UDP长度字段是16位,能表示的最大值是65,535)。如果超过了这个值,需要使用者在应用层手动的进行分片。

基于UDP的应用层协议

基于UDP(用户数据报协议)的应用层协议有很多,它们利用了UDP的低延迟、无连接特性,适用于那些对实时性要求较高但可以容忍一定程度的数据丢失或乱序的应用场景。以下是一些常见的基于UDP的应用层协议:

  1. DNS (Domain Name System)

    • 用途:用于将域名转换为IP地址。
    • 为什么使用UDP:DNS查询通常很小且需要快速响应,UDP的低开销和低延迟使其成为理想选择。尽管有时也会使用TCP,但大多数DNS查询是通过UDP进行的。
  2. DHCP (Dynamic Host Configuration Protocol)

    • 用途:自动分配IP地址和其他网络配置参数给设备。
    • 为什么使用UDP:DHCP消息较短且频繁,使用UDP可以减少处理时间,提高效率。
  3. TFTP (Trivial File Transfer Protocol)

    • 用途:简单的文件传输协议,主要用于启动无盘工作站或在网络设备间传输配置文件等。
    • 为什么使用UDP:TFTP设计简单,不提供复杂的错误恢复机制,适合小规模文件传输。
  4. NTP (Network Time Protocol)

    • 用途:同步计算机时钟到协调世界时(UTC)。
    • 为什么使用UDP:NTP需要高精度的时间同步,UDP的低延迟特性有助于实现这一目标。即使偶尔丢失数据包也不会严重影响整体同步精度。

如何封装UDP报文以及如何交付UDP报文

  1. 封装UDP报文:

    • 当我们从上层(应用层)拿到数据时,直接在数据的前面添加UDP的报头即可。
  2. 交付UDP报文:

    • 当我们从网络层拿到了一个完整的UDP报文接下来如何将UDP报文的数据交付给上层应用呢?我们结合UDP协议来画图分析(只关心相关的层):

      image-20250209202434950

进一步理解封装和解包

如果仅仅理解封装和解包到图的角度,还是太肤浅了,我们尝试在代码级理解封装和解包。

我们都知道传输层和网络层都属于OS的一部分,OS中是可能存在很多报文的,这些报文还没来得及处理,可能在网络层也可能在传输层的缓冲区,我们需要对这些报文做管理:先描述后组织

封装

image-20250209210543499

解包image-20250209211147024

所以最终的解包和封装就转化成了指针的加减

管理报文

image-20250209211449848

对报文的管理就转化为了对链表的增删查改

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

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

相关文章

时间盲注、boolen盲注

获取当前数据库名 获取数据库表 获取表的列

2025_2_13 二叉搜索树(一)

1.完全二叉树和满二叉树的概念 满二叉树:每一层都达到最大值 完全二叉树:只能右下角空,其他位置满,即最后一排从左到右的中间不能由缺 2.二叉搜索树 左子树中所有结点的 key 值都比根结点的 key 值小,并且左子树也…

DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?

随着人工智能技术的飞速发展,大模型领域不断涌现出具有创新性的成果。DeepSeek 的横空出世,为 AI 大模型领域带来了新的变革浪潮。本文将深入探讨 DeepSeek 出现后 AI 大模型面临的危机与转机。 冲冲冲!!! 目录 一、…

高速差分总线比较--RS422, LVDS,PECL

1. RS422A, 如RS422 & RS485总先, 0/5V的差分电平,匹配电阻120ohm. S2D, Transmitter D2S, Receiver LVDS 如SN65LVDS1,驱动器:DS90LV031(支持预加重),接收器&…

idea 错误: 找不到或无法加载主类 @C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448

idea 错误: 找不到或无法加载主类 C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448 该错误往往和左下角爱弹出的如下提示是一个意思 Error running ‘PayV3Test1.testTransferBatchesBatchId’ Error running PayV3Test1.testTransferBatchesBatchId. Command lin…

Java中如何高效地合并多个对象的List数据:方法与案例解析!

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互…

23、深度学习-自学之路-激活函数relu、tanh、sigmoid、softmax函数的正向传播和反向梯度。

在使用这个非线性激活函数的时候,其实我们重点还是学习的是他们的正向怎么传播,以及反向怎么传递的。 如下图所示: 第一:relu函数的正向传播函数是:当输入值(隐藏层)值大于了,就输出…

React源码揭秘 | scheduler 并发更新原理

React 18增加了并发更新特性,开发者可以通过useTransition等hooks延迟执行优先级较低的更新任务,以达到页面平滑切换,不阻塞用户时间的目的。其实现正是依靠scheduler库。 scheduler是一个依赖时间片分片的任务调度器,React团队将…

腿足机器人之二- 运动控制概览

腿足机器人之二运动控制概览 高层运动规划MPCRL 中层逆运动学和逆动力学底层执行器控制传感器校正 上一篇博客是腿足机器人的骨架和关节的机械和电气组件,关节不仅需要通过机械设计实现复杂的运动能力,还必须通过电子组件和控制系统来精确控制这些运动。…

企业级高可用 Kubernetes 实践:基于青云 LB 搭建容灾与负载均衡集群全攻略

一、前言 在企业生产环境,k8s高可用是一个必不可少的特性,其中最通用的场景就是如何在 k8s 集群宕机一个节点的情况下保障服务依旧可用。部署高可用k8s集群对于企业级云平台来说是一个根本性的原则,容错、服务可用和数据安全是高可用基础设施的关键。本文是在青云上利用青云…

软件项目估算偏差的5 大源头及解决方案

软件项目成本估算偏差往往导致资金紧张,资源投入受限,进度延误无法按时交付,为控制成本还可能牺牲质量,引发团队士气低落、客户不满,严重时项目直接失败 。 因此,及时解决或降低项目偏差就非常重要&#xf…

树莓派学习

树莓派4B 基础操作 开机 开机要主要先接好线再通电 关机 先在系统里面关机再断电 可以在界面里面点击关机,或者使用命令行 使用网线连接到树莓派 用笔记本的以太网口接线到树莓派 在网络连接里面打开WLAN的网络共享,共享选择以太网口 在cmd里面输…

Jenkins 新建配置 Freestyle project 任务 六

Jenkins 新建配置 Freestyle project 任务 六 一、新建任务 在 Jenkins 界面 点击 New Item 点击 Apply 点击 Save 回到任务主界面 二、General 点击左侧 Configure Description:任务描述 勾选 Discard old builds Discard old builds:控制何时…

一场始于 Selector Error 的拯救行动:企查查数据采集故障排查记

时间轴呈现事故进程 17:00:开发人员小李正在尝试利用 Python 爬虫从企查查(https://www.qcc.com)抓取公司工商信息。原本一切正常,但突然发现信息采集失败,程序抛出大量选择器错误。17:15:小李发现&#x…

HCIA项目实践---OSPF的基本配置

9.5.12 OSPF的基本配置 (所搭环境如上图所示) A 先配置IP地址 (先进入路由器R1的0/0/0接口配置IP地址,再进入环回接口配置IP地址) (配置R2路由器的0/0/0和0/0/1以及环回接口的IP地址) (置R3路由器的0/0/0接…

Java练习(20)

ps:练习来自力扣 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 class Solution {pu…

在ArcGIS JS API中使用WebGL实现波纹扩散特效

在现代WebGIS开发中,ArcGIS JS API 是一个非常强大的工具,它允许开发者创建丰富的地理信息应用。结合WebGL技术,我们可以实现更加复杂和炫酷的可视化效果。本文将介绍如何使用ArcGIS JS API结合WebGL实现一个波纹扩散特效。 波纹扩散效果 1 概…

基于图像处理的裂缝检测与特征提取

一、引言 裂缝检测是基础设施监测中至关重要的一项任务,尤其是在土木工程和建筑工程领域。随着自动化技术的发展,传统的人工巡检方法逐渐被基于图像分析的自动化检测系统所取代。通过计算机视觉和图像处理技术,能够高效、精确地提取裂缝的几何特征,如长度、宽度、方向、面…

支持向量机原理

支持向量机(简称SVM)虽然诞生只有短短的二十多年,但是自一诞生便由于它良好的分类性能席卷了机器学习领域。如果不考虑集成学习的算法,不考虑特定的训练数据集,尤其在分类任务中表现突出。在分类算法中的表现SVM说是排…

关于conda换镜像源,pip换源

目录 1. 查看当前下载源2. 添加镜像源2.1清华大学开源软件镜像站2.2上海交通大学开源镜像站2.3中国科学技术大学 3.删除镜像源4.删除所有镜像源,恢复默认5.什么是conda-forge6.pip换源 1. 查看当前下载源 conda config --show channels 如果发现多个 可以只保留1个…