传输层协议—UDP协议

传输层协议—UDP协议

文章目录

  • 传输层协议—UDP协议
      • 传输层
      • 再谈端口号
      • 端口号范围划分
      • pidof
      • netstat
    • UDP协议端格式
      • UDP报文
      • UDP特点
      • UDP缓冲区
      • 基于UDP的应用层协议

传输层

在学习HTTP/HTTPS等应用层协议时,为了方便理解,可以简单认为HTTP将请求和响应直接发送到网络中。实际上HTTP是将数据打包交付给下层传输层,然后传输层协议对该数据进行处理后继续向下交付,该过程贯穿成功网络协议栈,最后才将数据发送到网络中。

传输层负责将数据通过网络发送到对方主机的传输层的接收缓冲区中。因此为了方便理解,在学习传输层协议时可以简单认为传输层是直接将数据发送到网络中。

再谈端口号

端口号(Port)标识了一个主机上进行通信的不同的应用程序

当主机从网络中获取到对方发送过来的数据时,将数据自底向上进行解包交付,交付到传输层时,传输层协议要通过端口号将数据交付给应用层的指定进程(程序)。

image-20231001161950968

  • 由于端口号属于传输层概念,因此自底向上交付到传输层的报文的报头内就含有端口号,解包后传输层协议能拿到该端口号,根据该端口号将有效载荷交付给对应的程序。

五元组标识一个通信

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

  • 源IP和源端口号标识发来报文的来源主机和来源服务程序,目的IP标识网络中接收数据的主机,目的端口号标识的是传输层向上交付的应用层服务程序。
  • 协议号标识的是发送方接收方双方规定所使用的协议。

image-20231001163026001

例如服务器的IP是172.20.100.32,该服务器上有多进程版服务程序。有两个客户端连接上了服务器。因此服务器收到不同的客户端发送来的请求,是根据源IP区别出不同的主机、根据源端口号区别出目标主机上的不同程序。而客户端B发送请求给服务器需要根据目的IP找到服务器主机,目的端口号找到目标主机的服务程序。

image-20231001184231904

  • 通过源IP、目标IP、协议号、源端口号、目的端口号这五个数字标识一个通信。

五元组可以通过netstat -n查看

image-20231002123336854

  • 假如本地是服务器,那么从服务器的角度查看,Local Address对应的是目的IP和目的端口号,Foreign Address对应的是源IP和源端口号。

端口号范围划分

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

知名端口号有:

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

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

可以通过指令查询刀知名端口号

cat /etc/services

image-20231002114755196

因此我们自己写服务器使用端口号时,就需要避开这些知名端口号。

  1. 一个端口号是否可以被多个进程bind?

数据自底向上交付时,在传输层需要找到数据报头内含的目的端口号对应的进程,并交付给该进程,这注定着一个端口号只能标识一个进程,不能一个端口号标识多个进程。因此一个端口号只能被一个进程bind。

  1. 一个进程是否可以bind多个端口号?

一个端口号只能bind一个进程,但一个进程可以bind多个端口号。服务器具备多种功能时,客户端就需要根据不同的功能,选择不同的端口号进入同一个服务器,即从不同的端口号进入同一个进程。

pidof

pidof 进程:查询到该进程的pid。

image-20231002120619634

xargs:将管道传输过来的内容尾接到后面的指令后面。例如图中的 pid httpserver | xargs kill -9管道传输过来httpserver的pid,xargs将该pid尾接到kill -9后面即给httpserver进程发送9号命令。

netstat

netstat 是一个用于查看网络连接和网络统计信息的命令行工具。它可以用来显示当前系统上的网络连接、路由表、接口统计信息等等。在 Linux 系统中,netstat 命令的用法如下:

netstat [options]

一些常用的选项包括:

  • -a:显示所有的连接,包括监听中和已建立的连接。
  • -t:显示 TCP 协议的连接。
  • -u:显示 UDP 协议的连接。
  • -n:以数字形式显示 IP 地址和端口号,而不是尝试进行 DNS 解析。
  • -p:显示与连接关联的进程信息。
  • -r:显示路由表。
  • -l:仅显示监听中的连接。
  • -atun:显示所有的TCP和UDP连接

image-20230825190401543

注意一下:这里出现了两个连接,原因在于服务器和客户端在同一台主机上,即服务器和客户端完成了本地环回,因此能看到两个连接。

UDP协议端格式

UDP报文

image-20231002124703979

  • 报文=报头+有效载荷。报头长度为8字节,即UDP报头为固定报头,当传输层收到UDP报文时,提取前8字节,剩下的为有效载荷,直接向上交付给应用层即可。
  • 报头内含16位源端口号,16位目的端口号,16位UDP长度,16位UDP校验和。当发送UDP报文给对方时,需要对整个UDP报文做检查,16位UDP校验和标识UDP报文的完整性。对方收到UDP报文后,先对整个UDP报文做检查,也形成一个16位UDP校验和,然后将形成的校验和与UDP报头的校验和做比对,若相同则说明UDP报文完整,没有在传输途中发生报文丢失。若校验和出错,就会直接将UDP报文丢弃。
  • 源端口号和目的端口号的长度是16位的原因是内核的端口号也是16位的,底层决定了上层数据长度。
  • 16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度。而2的16次方大约是64kb,这意味着UDP报文大小最大为64kb。因此通过UDP通信,报文大小大于64KB时,就需要将一个报文拆解成多个报文进行发送。
  • 应用层将数据以UDP协议的方式发送到网络中,其实是将数据自顶向下做封装。传输层拿到应用层交付的数据后,给该数据添加UDP报头,然后继续向下交付。

image-20231002155011305

  • 实际上报头是OS层面定制的协议。由于Linux内核是由C语言写的,因此可以把报头看作是一个结构体struct udp_hdr,那么传输层收到应用层交付过来的数据时,先开辟一块空间,空间容纳一个报头大小,将报头里面的属性填充,最后加上数据就成为一个报文了。

UDP特点

  • 无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接。
  • 不可靠:没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层 返回任何错误信息。UDP在传输层交付給下层就不关心了,即掉包后没有反应。
  • 面向数据报:不能够灵活的控制读写数据的次数和数量,給多少发多少。sendto 几次recvfrom几次。相比于:TCP可能发了很多次,而接收要根据应用层实现。

UDP缓冲区

image-20231002150359165

  • UDP没有真正意义上的发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后 续的传输动作。没有发送缓冲区使得上层应用层的send/write函数调用完直接返回,不用阻塞。因为该函数直接将数据拷贝到传输层,由传输层自主决定将数据拷贝到OS的内核缓冲区,拷贝完直接返回,因此函数不关心数据的发送。
  • UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致。如果缓冲区满了, 再到达的UDP数据就会被丢弃;
  • UDP的socket即能够读也能够写,虽然没有发送缓冲区,但是有接收缓冲区,因此通过UDP协议通信可以完成全双工通信。

基于UDP的应用层协议

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

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

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

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

相关文章

【算法优选】双指针专题——贰

文章目录 😎前言🌲[快乐数](https://leetcode.cn/problems/happy-number/)🚩题目描述🚩题⽬分析:🚩算法思路:🚩代码实现: 🎋[盛水最多的容器](https://leetco…

CocosCreator3.8研究笔记(二十二)CocosCreator 动画系统-动画剪辑和动画组件介绍

国庆假期,闲着没事,在家研究技术~ 大家都知道在Cocos Creator3.x 的版本的动画编辑器中,可以实现不用写一行代码就能实现各种动态效果。 Cocos Creator动画编辑器中主要实现关键帧动画,不仅支持位移、旋转、缩放、帧动画&#xff…

【算法】算法基础课模板大全

一、基础算法 快速排序算法模板 void quick_sort(int q[], int l, int r) {//递归的终止情况if (l > r) return;//选取分界线。这里选数组中间那个数int i l - 1, j r 1, x q[l r >> 1];//划分成左右两个部分while (i < j){do i ; while (q[i] < x);do …

正点原子嵌入式linux驱动开发——TF-A初探

上一篇笔记中&#xff0c;正点原子的文档简单讲解了一下什么是TF-A&#xff0c;并且也学习了如何编译TF-A。但是TF-A是如何运行的&#xff0c;它的一个运行流程并未涉及。TF-A的详细运行过程是很复杂的&#xff0c;涉及到很多ARM处理器底层知识&#xff0c;所以这一篇笔记的内容…

PHP 反序列化漏洞:__PHP_Incomplete_Class 与 serialize(unserialize($x)) !== $x;

文章目录 参考环境声明__PHP_Incomplete_Class灵显为什么需要 __PHP_Incomplete_Class&#xff1f;不可访问的属性 serialize(unserialize($x)) $x;serialize(unserialize($x)) ! $x;雾现__PHP_Incomplete_Class 对象与其序列化文本的差异试构造 __PHP__Incomplete_Class 对象…

UE5.1编辑器拓展【二、脚本化资产行为,快速更改资产名字,1.直接添加前缀或后缀2.通过资产类判断添加修改前缀】

目录 了解相关的函数 第一种做法&#xff1a;自定义添加选择资产的前缀或后缀 代码 效果 第二种做法&#xff1a;通过映射来获取资产类型添加前缀和修改前缀 映射代码 代码 效果 在之前一章中&#xff0c;我们创建了插件&#xff0c;用来扩展编辑器的使用&#xff1a; …

VS Code 如何搭建 C/C++开发环境

目录 VScode是什么? VScode的下载和安装? 2.1 下载和安装 安装&#xff1a; 2.2 环境的介绍 环境介绍&#xff1a;​编辑 安装中文插件&#xff1a; VScode配置 C/C 开发环境 3.1 下载和配置MinGW-w64 编译器套件 下载&#xff1a; 配置MinGW64&#xff1a; 3.2 安…

加入PreAuthorize注解鉴权之后NullPointerException报错

记录一次很坑的bug&#xff0c;加入PreAuthorize注解鉴权之后NullPointerException报错&#xff0c;按理来说没有权限应该403报错&#xff0c;但是这个是500报错&#xff0c;原因是因为controller层的service注入失败&#xff0c;然而我去掉注解后service注入成功&#xff0c;并…

python之股票财务分析

#import akshare as ak import pandas as pd import matplotlib.pyplot as plt symbol1"资产负债表" symbol2"利润表" symbol3"现金流量表" #df1ak.stock_financial_report_sina(stock"601633",symbolsymbol1) #df2ak.stock_financial…

数据结构刷题(三十三):完全背包最小值情况。322. 零钱兑换、279. 完全平方数

题目一&#xff1a; 322. 零钱兑换https://leetcode.cn/problems/coin-change/ 思路&#xff1a;完全背包问题&#xff0c;求解最小组合数。dp[j]&#xff1a;凑足总额为j所需钱币的最少个数为dp[j]。同时需要确保凑足总金额为0所需钱币的个数一定是0&#xff0c;那么dp[0] 0…

001 Python开发环境搭建

1、下载python 2023/10 python-3.11.5-amd64.exehttps://www.python.org/ftp/python/3.11.5/python-3.11.5-amd64.exe 2、下载Visual Studio Code 2023/10 VSCodeSetup-x64-1.82.2.exehttps://code.visualstudio.com/docs/?dvwin64 3、安装python 双击打开python-3.11.5-a…

SpringCloud Alibaba - Sentinel 授权规则、自定义异常结果

目录 一、授权规则 1.1、什么是授权规则 1.2、授权规则的配置 1.2.1、配置信息介绍 1.2.2、如何得到请求来源 1.2.3、实现步骤 a&#xff09;给网关过来的请求添加请求头信息 b&#xff09;在 订单微服务 中实现 RequestOriginParser 接口中的 parseOrigin 方法 c&…

排序:外部排序算法分析

1.外存与内存之间的数据交换 1.外存&#xff08;磁盘&#xff09; 操作系统以“块”为单位对磁盘存储空间进行管理&#xff0c;如:每块大小1KB 各个磁盘块内存放着各种各样的数据。 2.内存 磁盘的读/写以“块”为单位数据读入内存后才能被修改修改完了还要写回磁盘。 2.外…

Jmeter分布式压力测试

目录 1、场景 2、原理 3、注意事项 4、slave配置 5、master配置 6、脚本执行 1、场景 在做性能测试时&#xff0c;单台机器进行压测可能达不到预期结果。主要原因是单台机器压到一定程度会出现瓶颈。也有可能单机网卡跟不上造成结果偏差较大。 例如4C8G的window server机…

2023-10-01 LeetCode每日一题(买卖股票的最佳时机)

2023-10-01每日一题 一、题目编号 121. 买卖股票的最佳时机二、题目链接 点击跳转到题目位置 三、题目描述 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一…

[NOIP2012 提高组] 国王游戏(贪心,排序,高精度)

[NOIP2012 提高组] 国王游戏 题目描述 恰逢 H 国国庆&#xff0c;国王邀请 n n n 位大臣来玩一个有奖游戏。首先&#xff0c;他让每个大臣在左、右手上面分别写下一个整数&#xff0c;国王自己也在左、右手上各写一个整数。然后&#xff0c;让这 n n n 位大臣排成一排&…

Mac程序坞美化工具 uBar

uBar是一款为Mac用户设计的任务栏增强软件&#xff0c;它可以为您提供更高效和更个性化的任务管理体验。 以下是uBar的一些主要特点和功能&#xff1a; 更直观的任务管理&#xff1a;uBar改变了Mac上传统的任务栏设计&#xff0c;将所有打开的应用程序以类似于Windows任务栏的方…

xilinx的原语的使用

xilinx的原语的使用 在学习FPGA实现千兆网时需要GMII转RGMII&#xff0c;这就涉及了原语的使用&#xff0c;特此记录&#xff01; 一、原语 与RGMII接口相关的原语&#xff1a; BUFG:全局时钟网络 BUFIO&#xff1a;只能采集IO的数据&#xff0c;采集IO数据的时候延时是最低的…

浅谈OV SSL 证书的优势

随着网络威胁日益增多&#xff0c;保护网站和用户安全已成为每个企业和组织的重要任务。在众多SSL证书类型中&#xff0c;OV&#xff08;Organization Validation&#xff09;证书以其独特的优势备受关注。让我们深入探究OV证书的优势所在&#xff0c;为网站安全搭建坚实的防线…

【自定义类型】--- 位段、枚举、联合

&#x1f493;博客主页&#xff1a;江池俊的博客⏩收录专栏&#xff1a;C语言进阶之路&#x1f449;专栏推荐&#xff1a;✅C语言初阶之路 ✅数据结构探索&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐ 文…