【Linux】UDP协议

目录

    • 传输层
      • 端口号
      • netstat
      • 端口号范围划分
      • 认识知名端口号(Well-Know Port Number)
    • UDP协议
      • UDP协议端格式
      • UDP的特点
      • UDP的缓冲区
      • UDP使用注意事项
      • 基于UDP的应用层协议


传输层

通过前面文章对于应用层的讲解,我们知道应用层主要是将我们的数据按照协议的格式进行划分,它并不关心数据是如何从发送端到接收端的,它将数据报向下交付给传输层,由它来负责数据从发送端传输到接收端。

端口号

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

在这里插入图片描述

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

netstat

netstat是一个用来查看网络状态的重要工具。
语法: netstat [选项]
功能:查看网络状态
常用选项:

  • n 拒绝显示别名,能显示数字的全部转化成数字
  • l 仅列出有在 Listen (监听) 的服務状态
  • p 显示建立相关链接的程序名
  • t (tcp)仅显示tcp相关选项
  • u (udp)仅显示udp相关选项
  • a (all)显示所有选项

在这里插入图片描述

端口号范围划分

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

认识知名端口号(Well-Know Port Number)

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

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

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

Q:一个进程可以绑定多个端口号吗?

一个进程可以绑定多个端口号。因为在计算机网络中,一个进程可能需要提供不同的服务或处理不同类型的数据流,因此需要监听不同的端口来处理来自网络的不同请求。

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

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

Q:某个报文经过网络传输到达了指定的计算机,它是如何交给指定的进程处理的呢?

我们知道网络通信的本质其实就是上层应用的进程间进行通信,进程间通信就是让双方看到同一份资源。发送端将报文数据经过网络传输到了接收端,报文数据中包含目的IP地址和目的端口号信息,操作系统本身维护一张端口号到进程的映射表,当网络协议栈确定了报文应该交给哪个端口号时,它会查询这张映射表,找到对应的进程,然后将该报文传递给该进程进行处理。

pidof
pidof 命令用于查找指定名称进程的进程 ID,在查看服务器的进程id时非常方便。
语法: pidof [进程名]
功能:通过进程名, 查看进程id

UDP协议

UDP协议端格式

在这里插入图片描述
UDP 报文分为 UDP 报头和 UDP 数据区两部分。报头由 4 个 16 位长(2字节)字段总共8字节组成,分别说明该报文的源端口、目的端口、报文长度和校验值。

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

我们知道传输层是负责将数据向上/向下交付给接收端的,那么必定要将报头与有效载荷进行分离,那么对于UDP协议,它是如何来分离的呢?

Q:UDP报头和有效载荷是如何分离的?

UDP协议报头中有2个字节是来表示UDP长度的,而且我们也知道UDP报头是固定大小的,我们只需UDP长度-8字节就能得到有效载荷的长度。当struct UDP_header* p = start,有效载荷的起始位置即为:start + 8.

Q:有效载荷是如何交付给上层的?
在分离出有效载荷后,网络协议栈会将其传递给上层应用程序进行处理。操作系统会维护一个端口号到进程的映射表,当网络协议栈确定了数据报应该交给哪个端口号时,它会查询这张映射表,找到对应的进程,然后将有效载荷传递给该进程进行处理。

Q:为什么应用层使用的端口号类型是 uint16_t 呢?

因为在 UDP 和 TCP 报文头中源端口和目的端口字段都是 16 位长,这意味着端口号的取值范围是 0 到 65535。uint16_t 类型正好可以表示这个范围内的所有整数,因此它被用作应用层端口号的类型。

UDP的特点

UDP 协议是一种无连接的、不可靠、面向数据报的传输协议。

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

Q:为什么UDP是面向数据报的?

这是由UDP协议特点性质决定的,UDP 协议是面向数据报的,这意味着它将应用层传递给它的数据作为一个独立的数据报来处理,每个数据报都包含了足够的信息,如:UDP报头字段中的UDP长度,上层应用就能知道我们要接收的数据报长度,使得接收端能够将其独立地传递给上层应用程序。
应用层交给UDP多长的报文,UDP原样发送, 既不会拆分, 也不会合并。用UDP传输100个字节的数据:如果发送端调用一次sendto发送100个字节,那么接收端也必须调用对应的一次recvfrom, 接收100个字节; 而不能循环调用10次recvfrom,每次接收10个字节。

UDP的缓冲区

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

Q:为什么UDP不需要发送缓冲区呢?

因为应用层交给UDP多长的报文,UDP只需原样发送即可,不需要控制发送长度将其放在缓冲区中,那么直接调用sendto拷贝到内核即可,由内核再将数据进行传递;而由于上层应用的接收速度、网络等各种原因导致数据不按顺序到达,所以我们需要暂时将数据保存在接收缓冲区中。那为何TCP有发送缓冲区?这是由TCP可靠机制决定的,它能控制每次读取多大的数据,保证数据按序到达并且对丢失数据进行重传等,这样就注定了TCP具有发送缓冲区!

UDP协议是全双工通信的,它可以同时进行读与写操作。也就是说,应用程序可以在不等待接收完成的情况下发送数据,反之亦然。这种全双工的工作方式提高了通信效率,使得 UDP 协议能够更好地满足实时应用的需求;而像我们之前提到的管道属于半双工通信,只能有一方进行读或写的操作,你写的时候对方是处于堵塞状态的,必须等你写完才能读。

UDP使用注意事项

UDP 协议首部中有一个 16 位的最大长度,也就是说一个 UDP 能传输的数据最大长度是 64K(包含 UDP 首部)。然而 在当今的互联网环境下,64 K 是一个非常小的数字,如果我们需要传输的数据超过 64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装。

基于UDP的应用层协议

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

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

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

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

相关文章

注册安全分析报告:PingPong

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …

Day15 —— 大语言模型简介

大语言模型简介 大语言模型基本概述什么是大语言模型主要应用领域大语言模型的关键技术大语言模型的应用场景 NLP什么是NLPNLP的主要研究方向word2vecword2vec介绍word2vec的两种模型 全连接神经网络神经网络结构神经网络的激活函数解决神经网络过拟合问题的方法前向传播与反向…

【Linux】锁|死锁|生产者消费者模型

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ ​ 访问互斥 …

力扣-两数之和

文章目录 题目题解方法1-暴力方法2-哈希 题目 原题链接:两数之和 题解 方法1-暴力 我最先想到的方法就是暴力,两层for循环,也能通过。(拿到算法题在没有思路的时候暴力就是思路,哈哈哈) public class T…

【STM32-存储器映射】

STM32-存储器映射 ■ STM32F1-4G地址空间分成8个块■ STM32F1-Block0■ STM32F1-Block1■ STM32F1-Block2■ STM32F1- ■ STM32F1-4G地址空间分成8个块 ■ STM32F1-Block0 有出厂 BootLoader 就可以使用串口下载程序。如Keil5图中IROM地址是0x8000000 开始 就是flash地址 ■ S…

2-17 基于matlab的改进的遗传算法(IGA)对城市交通信号优化分析

基于matlab的改进的遗传算法(IGA)对城市交通信号优化分析。根据交通流量以及饱和流量,对城市道路交叉口交通信号灯实施合理优化控制,考虑到交通状况的动态变化,及每个交叉口的唯一性。通过实时监测交通流量&#xff0c…

代码随想录-Day41

46. 携带研究材料(第六期模拟笔试) 题目描述 小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实…

GroundingDINO1.5突破开放式物体检测界限:介绍与应用

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

小程序 UI 风格,引人入胜

小程序 UI 风格,引人入胜

如何基于项目人力和管线方案选择FGUI和UGUI

1)如何基于项目人力和管线方案选择FGUI和UGUI 2)TMP字体出包丢失字体描边 3)如何将一张贴图经过Shader处理后的结果输出给另外一个Shader使用 4)为什么我的水这么干净,和UE教程里的有差别 这是第390篇UWA技术知识分享的…

Handling `nil` Values in `NSDictionary` in Objective-C

Handling nil Values in NSDictionary in Objective-C When working with Objective-C, particularly when dealing with data returned from a server, it’s crucial (至关重要的) to handle nil values appropriately (适当地) to prevent unexpected crashes. Here, we ex…

2024年最新通信安全员考试题库

61.架设架空光缆,可使用吊板作业的情况是()。 A.在2.2/7规格的电杆与墙壁之间的吊线上,吊线高度5m B.在2.2/7规格的墙壁与墙壁之间的吊线上,吊线高度6m C.在2.2/7规格的电杆与电杆之间的吊线上,吊线高度…

ChatGPT API技术教程OpenAI APIKey在线对接-Chat Completion对象

表示模型根据提供的输入返回的聊天完成响应。 {"id": "chatcmpl-123","object": "chat.completion","created": 1677652288,"model": "gpt-3.5-turbo-0125","system_fingerprint": "fp…

solidity智能合约如何实现跨合约调用函数

背景 比如现在有一个需求、我需要通过外部合约获取BRC20 token的总交易量。那么我需要在brc20的转账函数里面做一些调整,主要是两个函数内统计转移量。然后再提供外部获取函数。 /*** dev Sets amount as the allowance of spender over the callers tokens.** Ret…

【ai】tx2-nx:安装深度学习环境及4.6对应pytorch

参考:https://www.waveshare.net/wiki/Jetson_TX2_NX#AI.E5.85.A5.E9.97.A8 英伟达2021年发布的的tritionserver 2.17 版本中,backend 有tensorflow1 和 onnxruntime ,他们都是做什么用的,作为backend 对于 triton 推理server意义是什么,是否应该有pytorch? Triton Infer…

数据分析必备:一步步教你如何用matplotlib做数据可视化(13)

1、Matplotlib 文本 Matplotlib具有广泛的文本支持,包括对数学表达式的支持,对光栅和矢量输出的TrueType支持,具有任意旋转的换行符分隔文本以及unicode支持。Matplotlib包含自己的matplotlib.font_manager,它实现了一个跨平台&a…

modelsim做后仿真的一点思路

这是以TD_5.6.3_Release_88061生成的网表文件(其他工具生成的网表文件类似),与modelsim联合进行门级仿真的样例,时序仿真与门级仿真的方法类似,只是增加了标准延时文件。 1、建立门级仿真工程 将门级网表和testbench添…

Redis-数据类型-Hash

文章目录 1、查看redis是否启动2、通过客户端连接redis3、切换到db3数据库4、插入新数据返回15、获取指定哈希(hash)对象的所有字段(field)名6、获取存储在指定哈希(hash)对象中的所有字段(fiel…

OpenCV练习(2)图像校正

1、傅里叶变换 霍夫变换 直线 角度 旋转2、边缘检测 霍夫变换 直线角度 旋转3、四点透视 角度 旋转4、检测矩形轮廓 角度 旋转 1.目的 实现类似全能扫面王的图像校正功能 2. 基于轮廓提取和透射变换 基于轮廓提取和透射变换的矫正算法更适用于车牌、身份证、人民…

ue 材质贴图Tiling repeat

材质问题,如下 贴图显然不符合逻辑,太大,并且是一次性贴图 换一个红砖纹理,就看清了,砖太大了 修改: 拖出一个TexCoord,代表坐标,拖出一个参数,代表次数,如…