【计算机网络】传输层协议 -- UDP协议

文章目录

  • 1. 传输层相关知识
    • 1.1 端口号
    • 1.2 端口号范围划分
    • 1.3 知名端口号
    • 1.4 一些相关命令
  • 2. UDP协议
    • 2.1 UDP协议格式
    • 2.2 UDP协议的特点
    • 2.3 什么是面向数据报
    • 2.4 UDP的缓冲区
    • 2.5 UDP使用注意事项
    • 2.6 基于UDP的应用层协议

1. 传输层相关知识

传输层是计算机网络中的一个重要层次,位于网络层和应用层之间,它的主要功能是为应用层提供端到端的数据传输服务,负责确保数据可靠传输、流浪控制和拥塞控制等。

传输层的两个主要协议是传输控制协议(TCP)和用户数据报协议(UDP)。它们各自有不同的特点和用途,本文章主要大概介绍了传输层相关知识以及UDP协议。

1.1 端口号

端口号的作用

端口号(port)标识一个主机上进行网络通信的不同程序。当主机从网络中获取到数据之后,需要自底向上进行数据的交付,而这个数据最终应该交付给上层的哪个进程,就是由端口号来决定的。

所以,端口号就是计算机网络中用于标识应用程序或服务的数字标识符,它是在传输层使用的,以便将数据正确地交给对应的应用程序。

当网络中的数据在向上交付时,在传输层系统会提取出数据对应的端口号,进而确定该数据应该交付给哪一个进程。

在这里插入图片描述

五元组标识通信

在TCP/IP协议中,用源IP,源端口号,目的IP,目的端口号,协议号这样一个五元组来标识一个通信(可以通过netstat命令查看)。
在这里插入图片描述
其中Local Address表示的就是源IP地址和源端口号,Foreign Address表示的就是目的IP地址和端口号,而Proto表示的就是协议类型。

协议号与端口号

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

1.2 端口号范围划分

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

1.3 知名端口号

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

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

查看知名端口号

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

我们可以查看 /etc/services 文件,该文件是记录网络服务器名和它们对应使用的端口号和协议。
在这里插入图片描述
文件中的每一行对应一张服务,它由四个字段组成,每个字段之间用TAB或者空格分开,分别表示“服务名称”、“使用端口”、“协议名称”、“别名”。

1.4 一些相关命令

netstat命令是一个用来查看网络状态的工具。

其常见的选项如下:

  • n:不显示别名,能显示数字的全部转换为数字
  • l:仅显示出处于LISTEN状态的服务器
  • p:显示建议相关链接的程序名
  • t:仅显示TCP相关选项
  • u:仅显示UDP相关选项
  • a:显示所有选项

查看UDP相关网络信息,一般使用nlup选项

在这里插入图片描述
查看TCP相关网络信息,一般使用nltp选项
在这里插入图片描述

iostat命令

iostat命令主要用于输出磁盘IO和CPU的统计信息。

其常见的选项如下:

  • c:显示CPU的使用情况
  • d:显示磁盘的使用情况
  • N:显示磁盘列阵信息
  • n:显示NFS使用情况
  • k:以KB为单位显示
  • m:以M为单位显示
  • t:报告每秒向终端读取和写入的字符数和CPU的信息
  • V:显示版本信息
  • x:显示详细信息
  • p:显示磁盘分区情况

在这里插入图片描述
CPU属性值说明:

  • %user:CPU处在用户模式下的时间百分比
  • %nice:CPU处在带NICE值的用户模式下的时间百分比
  • %system:CPU处在系统模式下的时间百分比
  • %iowait:CPU等待输入输出时间的百分比
  • %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比
  • %idle:CPU空闲时间百分比

pidof命令

pidof命令可以通过进程名,查看进程id。

2. UDP协议

2.1 UDP协议格式

UDP的位置

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

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

  • UDP协议格式

在这里插入图片描述

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

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

UDP如何将报头与有效载荷分离?

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

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

UDP的报头当中包含了目的端口号,通过目的端口号去找到对应的进程。

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

如何理解报头?

操作系统是用C语言写的,而UDP协议又是属于内核协议栈的,因此UDP协议也一定是用C语言写的,UDP报头实际就是一个位段结构。
在这里插入图片描述

UDP数据封装

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

UDP数据分用

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

2.2 UDP协议的特点

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

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

2.3 什么是面向数据报

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

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

2.4 UDP的缓冲区

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

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

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

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

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

因此UDP接收缓冲区的作用就是:将收到的报文暂时保存起来,供上层读取。

2.5 UDP使用注意事项

需要注意的是,UDP协议报头当中的UDP最大长度是16位的,因此一个UDP报文的最大长度是64K(包含UDP的大小)。

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

2.6 基于UDP的应用层协议

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

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

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

相关文章

【如何训练一个中英翻译模型】LSTM机器翻译模型部署之onnx(python)(四)

系列文章 【如何训练一个中英翻译模型】LSTM机器翻译seq2seq字符编码(一) 【如何训练一个中英翻译模型】LSTM机器翻译模型训练与保存(二) 【如何训练一个中英翻译模型】LSTM机器翻译模型部署(三) 【如何…

云原生架构

1. 何为云原生? 很多IT业内小伙伴会经常听到这个名词,那么什么是云原生呢?云原生是在云计算环境中构建、部署和管理现代应用程序的软件方法。 当今时代,众多企业希望构建高度可扩展、灵活且有弹性的应用程序,以便能够快…

13 亿美金买个寂寞?No!AI 时代的数据行业蓄势待发

6月底,全球数据分析领域彻底炸锅了。 两大数据分析企业Databricks和Snowflake纷纷将目光瞄准了AI大模型。要知道,这两位对手平时没少对台戏,为性能、产品和技术经常开撕。但在今年的自家大会上,两家企业却出奇的一致,…

云安全攻防(二)之 云原生安全

云原生安全 什么是云原生安全?云原生安全包含两层含义:面向云原生环境的安全和具有云原生特征的安全 面向云原生环境的安全 面向云原生环境的安全的目标是防护云原生环境中的基础设施、编排系统和微服务系统的安全。这类安全机制不一定会具有云原生的…

Java 设计模式 - 简单工厂模式 - 创建对象的简便之道

简单工厂模式是一种创建型设计模式,它提供了一种简单的方式来创建对象,而无需暴露对象创建的逻辑。在本篇博客中,我们将深入了解简单工厂模式的概念、实现方式以及如何在Java中使用它来创建对象。 为什么使用简单工厂模式? 在软…

【无标题】深圳卫视专访行云创新马洪喜:拥抱AI与云原生,深耕云智一体化创新

人工智能(AI)是引领新一轮科技革命和产业变革的重要驱动力。因此,深圳出台相关行动方案,统筹设立规模1,000亿元的人工智能基金群,引导产业集聚培育企业梯队,积极打造国家新一代人工智能创新发展试验区和国家…

【高压架构】AP5199S LED平均电流型恒流驱动IC 0.01调光 景观舞台汽车灯驱动照明

说明 AP5199S 是一款外围电路简单的多功能平均电流型 LED 恒流驱动器,适用于宽电压范围的非隔离式大功率恒流 LED 驱动领域。芯片 PWM 端口支持超小占空比的 PWM 调光,可响应 60ns 脉宽。为客户提供解决方案,限度地发挥灯具优势,…

shell中按照特定字符分割字符串,并且在切分后的每段内容后加上特定字符(串),然后再用特定字符拼接起来

文件中的内容&#xff0c;可以这么写&#xff1a; awk -F, -v OFS, {for(i1;i<‌NF;i){$i$i"_suffix"}}1 input.txt-F,&#xff1a;设置输入字段分隔符为逗号&#xff08;,&#xff09;&#xff0c;这将使awk按照逗号分割输入文本。-v OFS‘,’&#xff1a;设置输…

【Golang】Golang进阶系列教程--为什么 Go 不支持 []T 转换为 []interface

文章目录 前言官方解释内存布局程序运行中的内存布局通用方法 前言 在 Go 中&#xff0c;如果 interface{} 作为函数参数的话&#xff0c;是可以传任意参数的&#xff0c;然后通过类型断言来转换。 举个例子&#xff1a; package mainimport "fmt"func foo(v inter…

python 面向对象编程的特点 - 封装 - 继承(经典类、新式类) - 多态 - 静态方法、类方法 - 下划线的使用 - 回合制攻击游戏实验

目录 面向对象编程的特点&#xff1a; 封装&#xff1a;封装是将数据和操作&#xff08;方法&#xff09;封装在一个对象中的能力 继承&#xff1a;继承是指一个类&#xff08;子类&#xff09;可以继承另一个类&#xff08;父类&#xff09;的属性和方法。 我们为什么需要继…

HashMap中hash方法的作用(详解)

首先&#xff0c;hash方法用来干什么&#xff1f; 在搞清楚原理之前&#xff0c;我们先站在巨人的肩膀浅浅了解一下hash方法的本质作用。 实质上&#xff0c;它的作用很朴素&#xff0c;就是用key值通过某种方式计算出一个hash码 而且这个hash码我们后面要用来计算key存在底…

golangd\pycharm-ai免费代码助手安装使用gpt4-免费使用--[推荐]

golangd-ai免费代码助手安装使用,pycharm可以使用&#xff0c;估计只要是xx的ide都是可以使用这个插件 目前GPT4以及gpt的大规模使用&#xff0c;如何快速掌握以及在ide中快速使用的办法&#xff0c;今天安装一款golangd编辑器的插件已经使用 一、安装以及使用 1.在golangd中…

贼全! 一举通关的 Spring+SpringBoot+SpringCloud 全攻略, 是真香啊

前几天&#xff0c;有幸从朋友那里得到了一份 Alibaba 内部的墙裂推荐的“玩转 Spring 全家桶的 PDF”&#xff0c;我也不是个吝啬的人&#xff0c;好的东西当然要一起分享。那今天我就秀一把&#xff0c;带你一站通关 Spring、Spring Boot 与 Spring Cloud,让你轻松斩获大厂 O…

Statefulset部署应用

上一部分我们分享到了使用 RS 没有办法让自己管理的多个 pod 都有一个独立的持久化声明&#xff0c;RS 没有办法在指定模板中对不同的 pod 做差异化处理 使用多个 RS 来分别管理自己的的一个 pod&#xff0c;当我们扩缩容的时候&#xff0c;也会出现问题&#xff0c;老的 pod …

C# 关于使用newlife包将webapi接口寄宿于一个控制台程序、winform程序、wpf程序运行

C# 关于使用newlife包将webapi接口寄宿于一个控制台程序、winform程序、wpf程序运行 安装newlife包 Program的Main()函数源码 using ConsoleApp3; using NewLife.Log;var server new NewLife.Http.HttpServer {Port 8080,Log XTrace.Log,SessionLog XTrace.Log }; serv…

【微服务架构设计】微服务不是魔术:处理超时

微服务很重要。它们可以为我们的架构和团队带来一些相当大的胜利&#xff0c;但微服务也有很多成本。随着微服务、无服务器和其他分布式系统架构在行业中变得更加普遍&#xff0c;我们将它们的问题和解决它们的策略内化是至关重要的。在本文中&#xff0c;我们将研究网络边界可…

使用贝叶斯算法完成文档分类问题

贝叶斯原理 贝叶斯原理&#xff08;Bayes theorem&#xff09;是一种用于计算条件概率的数学公式。它是以18世纪英国数学家托马斯贝叶斯&#xff08;Thomas Bayes&#xff09;的名字命名的。贝叶斯原理表达了在已知某个事件发生的情况下&#xff0c;另一个事件发生的概率。具体…

二十三种设计模式第十七篇--迭代子模式

迭代子模式是一种行为型设计模式&#xff0c;它允许你按照特定方式访问一个集合对象的元素&#xff0c;而又不暴露该对象的内部结构。迭代子模式提供了一种统一的方式来遍历容器中的元素&#xff0c;而不需要关心容器的底层实现。 该模式包含以下几个关键角色&#xff1a; 迭…

计算机网络(1) --- 网络介绍

目录 1.介绍协议 基础知识 协议 协议分层 OSI七层模型 2.TCP/IP五层模型 3.网络传输的基本流程 1.基本知识 协议报头 2.局域网通信的基本流程 3.网络传输流程 局域网分类 跨路由器传输 数据包封装和分用 4.网络中的地址管理 1.IP地址 2.MAC地址 3.区别 1.介绍…

训练自己的行文本检测EAST模型

训练自己的行文本检测EAST模型 训练数据格式 训练数据格式