初识网络之再看udp协议

news2024/11/24 6:53:38

目录

一、端口号 

1. 五元组

2. 端口号范围划分

3. 一些知名端口号

4. 进程与端口号

5. 两个常用网络工具

5.1 netstat

5.2 pidof

二、UDP协议

1. udp协议格式

2. udp报文解包

3. udp报文分用

4. udp的特点

5. 缓冲区

5.1 tcp缓冲区

5.2 udp缓冲区

6. 一些常见的基于udp的应用层协议


一、端口号 

1. 五元组

在一台主机中,是可以同时运行不同的应用程序的。而端口号则标识了一台主机上运行的不同的应用程序

在上图中的主机A中就存在多个不同的应用程序。大家知道,一份数据从网络中传输过来后,需要通过网络协议栈自底而上传输。当数据到达传输层后,就需要通过数据携带的端口选择对应的应用程序

在TCP/IP协议中,用“源IP”“源端口号”“目的IP”“目的端口号”“协议号”这样的五元组来标识一个通信。(可以通过“netstat -n”命令查看)。

这五元组中的前四个大家应该都很熟悉,前两个标识数据发送方,后两个标识数据接收方。至于协议号,是用于标识该数据使用的是何种协议。协议号其实是有点冗余的,因为协议号其实是可以用目的端口号替代的。但是协议号可以让这个五元组更加清晰的表征协议。即五元组合起来看,就是发送端和接收端用何种协议通信。

举个例子,例如大家在浏览器中打开多个网页,此时浏览器就会向服务器发起多次请求。在这些请求中,虽然 源IP、目的IP和目的端口号是相同的,但是源端口号是不同的,因为源端口号是由OS自动生成的。通过这种方式,服务器就能够准确的判断这些请求是否为不同请求。

2. 端口号范围划分

为了方便使用,在服务器中,有很多端口号都是固定的。

0~1023:知名端口号。如http、ftp、ssh等这些广为使用的应用层协议,它们的端口号都是固定的,属于这个范围内。

1024~65535操作系统动态分配的端口号。客户端程序的端口号,就是由OS从这个范围分配的。换句话说,这个范围的端口号是可以让用户随意绑定分配的。

3. 一些知名端口号

在这里简单介绍几个知名端口号:

ssh服务器:使用22端口;

ftp服务器:使用21端口;

telnet服务器:使用23端口

http服务器:使用80端口;

https服务器:使用443端口;

除了这几个端口号外,还有一些其他知名端口号。大家可以执行“vim /etc/services”命令查看其他知名端口号。

在大家自己写应用程序绑定端口号时,最好避开0~1023范围的知名端口号。

4. 进程与端口号

大家知道,一个端口号对应一个进程,这就意味一个端口号只能被一个进程bind。但是这并不意味这一个进程只能bind一个端口号。事实上,一个进程是可以bind多个端口号的

一个端口号被一个进程bind,是为了保持端口号->进程的唯一关系,即通过一个端口号找到唯一一个进程。

但是如果一个进程bind了多个端口号,这个条件依然没有被打破,可以通过该进程bind的任意一个端口号找到唯一进程。例如我们可以给一个应用程序bind两个端口号,一个端口号用于接收数据,一个端口号用于接收数据,这种方式都是可行的。

5. 两个常用网络工具

5.1 netstat

netstat是一个用于查看网络状态的工具。其常用选项有如下几个:

n:拒绝显示别名,将能够以数字显示的内容全部转化为数字

l:仅列出当前处于Listen(监听)状态的服务

p:显示建议相关连接的程序名

t(tup):仅显示使用tcp相关选项

u(udp):仅显示udp相关选项

a(all):显示所有选项,但默认不显示Listen相关的内容

使用方法很简单,在linux中输入“netstat -选项”即可:

5.2 pidof

pidof工具可以用于查看服务器的进程id

之前大家应该都用过“ps axj | grep 进程名”的方式查看进程id。但如果仅仅是想查看某个服务器的进程的id,可以直接用“pidof 进程名”命令查看:

由此,我们可以再加上“xargs kill -9”来快速结束指定进程:

xargs可以将前面的命令的结果拼接到当前命令的后面。因此,上面"pid httServer | xargs kill -9"命令其实就相当于“kill -9 进程id”

二、UDP协议

1. udp协议格式

udp报头的格式如下:

首先大家可以了解一下“数据”。数据其实就是我们在应用层中需要传输的数据。例如大家如果在客户端向服务器发送了一条“你好”消息,这条消息就是我们要传输的数据,这份数据到达传输层后,如果使用的是udp协议,那么就会为这份数据添加如上的报头。而数据本身,则被称为“有效载荷”

这份报头中的16位源端口号和16位目的端口号大家应该都很清楚了,这里就不再多讲。

16位udp校验和,其实就是用于检测udp报文是否出错。在发送数据之前,会先对报文整体做校验。校验完后将校验值填入。当数据被接收后,对方会再次对报文做校验,如果结果不相等,那么说明报文中数据丢失,该份数据会被直接丢弃。

16位udp长度标识了udp报文的长度,即报头+有效载荷。大家应该注意到了,这个udp长度是16位的,这就意味着它的最大长度是2^16,即65535字节,即64kb字节的数据。这就说明在udp中,一份报文的最大长度是64kb,如果要发送的数据超过了64kb,就需要程序员在应用层中自己将这份数据拆分为64kb以下的数据,分为多份发送。

2. udp报文解包

从上面的内容可以知道,当一份udp数据被发送后,这份数据中会带上udp报头。那么当这份数据被接收后,如何将这份数据的报头和报文相分离呢?udp中采用的方式就是“定长报头”,即报头有一个固定的长度,当需要解包时,直接将对应长度拿走即可。在udp中这个长度是8字节,因此当主机收到一份udp报文后,就可以直接去掉这份报文的前8个字节,后面的内容就是有效载荷。

那么我们如何拿到报头中的数据呢?大家知道,linux是用c写的,并且在以前的文章中也讲过,所谓的报头其实就是一份结构化数据。因此要拿到报头中的数据很简单,直接使用一个结构体,这个结构体中就存储了4个16字节的整形的成员变量

通过这种方式,就可以很轻松的拿到报头中的数据了。

3. udp报文分用

udp报文解包完成后,就需要将有效载荷向上递交给应用层。那么udp报文如何知道应该把自己交付给应用层的那么程序呢?其实就是依赖于16位目的端口号。通过目的端口号,就可以让udp报文找到应递交的进程。

4. udp的特点

udp的特点主要有三个。

第一个是无连接。udp协议的特性就是只需要知道对端的ip和port就可以直接进行传输,不需要建立连接。如果大家了解了tcp就应该能很明显的感受到udp和tcp在连接上的差异。tcp需要客户端发起请求,服务器确认是否建立连接后才可以建立连接通信,而udp则无需这么做。

第二个是不可靠。在udp中没有“确认应答”和“超时重传”等用于维持可靠传输的机制。如果因为某些原因导致报文无法发送给对方,dup协议也不会给应用层返回任何错误消息。

第三个是面向数据报。面向数据报,大家可以看成发快递。例如你的朋友给你发快递,它可能发了1个,也可能发2个、3个。但无论他发多少个,你在拿快递时必定拿到的是一个完整的快递,而不是0.5、1.5这种不完整的快递。这其实就是数据报。

当客户端发送一份udp数据报后,服务器在读取这份报文后,只有两个选择,要么不读,要么就读走一份完整的报文,即必须“整发整取”。在udp中就无需考虑它读取或发送的是不是一个完整的请求,只需要考虑序列化和反序列的问题。

这就和tcp的面向字节流有很大差距。在面向字节流中,一份请求可能被分为多份发送,接收端接收数据时并不知道读取到的数据是否为一份完整的请求,需要程序员自行设计如何保证从字节流中提取到一个完整报文。

因此,面向数据报的缺点就是不能够灵活的控制读写数据的次数和数量。例如有一份100字节的数据,面向数据报在发送数据时发送了几次,接收端就必须要按照发送的次数来接收,即“发几次,收几次”;而面向字节流则可以分为多份接收,例如这100字节的数据分为了两次发,但是接收端可以每次读取10字节,分10次读取。

5. 缓冲区

5.1 tcp缓冲区

在了解udp缓冲区之前,我们要先了解tcp缓冲区,这样才能更好的理解udp缓冲区。

首先,我们使用的网络IO接口,如send、sendto、read等接口,它们本质上并不是发送和接收接口,而是拷贝接口。这就意味着,当调用这些接口时,并不是直接从网络中接收和发送数据,而是将下层数据拷贝到应用层的缓冲区中

传输层中,是存在接收缓冲区发送缓冲区的。当应用层需要发送数据调用send、write等接口时,其实是将应用层的数据拷贝到传输层的“发送缓冲区”中,然后再向下通过网络发送给另一台主机。当接收数据时,数据通过网络被填入到传输层的“接收缓冲区”中,当我们调用recv、read等接口读取数据时,其实是将接收缓冲区中的数据拷贝到我们在应用层中准备好的缓冲区内,而非直接从网络接收数据。

通过这种方式,就让接收方和发送方同时拥有一组成对的发送缓冲区和接收缓冲区,就实现了通信双方在发送的数据的时候,也可以并发的接收数据,这就叫做“全双工”

当应用层将数据拷贝给传输层后,应用层就可以直接返回去执行其他任务了。通过这样的方式,应用层就无需等待网络然后自己去发送和接收数据,提高了应用层的效率。这就好比我们要发快递时直接将快递交给快递站,让快递站帮我们发快递,无需我们自己去到目标地点把快递交给对方。通过这种方式就节省了我们很多的时间。同时在发快递时,快递的个数太少回不了本、快递在发送途中出现了意外等等问题都是让快递站去解决,无需我们自己想办法。应用层中也是如此,如何发送数据,要不要集中式发送数据,数据在传输中出现了意外等等问题,都交由传输层解决,应用层不用参与。

因此,tcp协议的译名是“传输控制协议”,即数据在发送过程中的一切情况,都由tcp去处理解决

5.2 udp缓冲区

udp中没有真正意义上的“发送缓冲区”,因为在udp中调用sendto后会直接将数据交给内核,由内核将数据传给网络层协议进行后续的传输动作,这就意味着udp并不需要发送缓冲区。

udp具有“接收缓冲区”。这个接收缓冲区可以用来存放网络中传来的数据。但是udp缓冲区并不能保证收到的udp数据报的顺序和发送udp数据报的顺序一致,即udp缓冲区中的数据可能是乱序的。而乱序也是不可靠的一种,因此udp中并没有处理这一情况的机制。

缓冲区的存在也降低了数据丢包的概率。如果udp中没有接收缓存区,那么如果进程正在处理一份数据,这份数据还没有处理完的时候又来一份数据,此时就无法收到该数据。但如果udp缓冲区满了,再到达的udp数据就会被丢弃。

由于udp中也是可以在发送数据的同时接收数据,因此udp也是“全双工”。

6. 一些常见的基于udp的应用层协议

NFS:网络文件系统;

TFTP:简单文件传输协议;

DHCP:动态主机配置协议;

BOOTP:启动协议(用于无盘设备启动);

DNS:域名解析协议;

在这几个协议中,为大家简单介绍一下DNS协议。在我们的浏览器中输入网址时,在https后面都带有一串www开头的字符串:

这个字符串其实就是域名。而这个域名被解析之后,其实就是一个ip地址。

大家可以在计算机上搜索cmd:

 在这个界面中输入“ping 域名”命令:

通过这个命令,就可以直接看到该域名解析后对应的ip地址。

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

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

相关文章

函数重载异常的常见原因

函数重载异常的常见原因 使用重载函数时,如果数据类型不匹配,C尝试使用类型转换与形参进行匹配,如果转换后有多个函数能匹配上,编译将报错。引用可以作为函数重载的条件,但是,调用重载函数的时候&#xff0…

Linux:端口

端口是设备与外界进行通讯的出入口,端口可以分为物理端口和虚拟端口 物理端口:又叫接口,是可见的端口,比如HDMI端口、USB接口虚拟端口:是指计算机内部的端口,用来操作系统和外部进行交互使用 通过IP地址只能…

6.python高频函数-处理缺失值isnull()、fillna()、dropna()

前言 如何判断pandas.DataFrame、Series是否包含缺失值NaN以及如何处理缺失值NaN。 Part.1 isnull() 函数 使用 isnull()、isna() 确定每个元素的缺失值 如果值为 NaN,则值为 True,如果不是,则值为 False。 读取数据集 panel_data pd.r…

从C语言到C++_19(容器适配器+stack和queue模拟实现+优先级队列priority_queue)

目录 1. 容器适配器 1.1 什么是适配器 1.2 STL标准库中stack和queue的底层结构 2. stack和queue的模拟实现 2.1 stack模拟实现 2.2 queue的模拟实现 3. deque的介绍(了解) 3.1 deque的实现原理 3.2 deque的缺陷和使用场景 4. 优先级队列 priority_queue 4.1 priorit…

编码规范、Git分支整理

代码命名规范 包命名规范 采用反域名命名规则,全部使用小写字母。一级包名为com,二级包名kl(为公司名称,可以简写),三级包名pos(根据应用进行命名),四级包名activity或…

芳禾数据CTO李明:数据分类分级与治理驱动下的应用革命丨数据猿专访

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 我们进入数字化时代,数据已经变得比任何时候都更加关键。每天,我们都在生成、处理和存储海量的数据,这些数据在企业决策、市场研究、产品开发等方面扮演着重要的角色。然而,数…

Qt编写精美输入法(历时十年迭代/可换肤/支持Qt4/5/6/win/linux/mac/嵌入式等)

一、前言 大概是从2012年就开始研究用Qt写输入法,因为项目需要,嵌入式板子上,没有对应的输入法,当初使用过很多NVR,里面也是鼠标按下弹出输入法面板进行输入,可以切换数字和字母及中文,于是借鉴…

5大趋势与10大应用场景!未来的智能工厂要这么建...

在经济下行压力、人口红利消失、消费结构升级、疫情冲击等多种因素推动下,制造企业加快转型步伐,工厂正向高效化、智能化、绿色化方向跃迁升级,不断涌现出技术创新、应用领先、成效显著的智能工厂。 近日,中国信息通信研究院发布…

常见的台账在线、可视化数据看板工具

目前已知和常见的一些在线可视化数据看板工具: Trello:Trello 是一种流行且直观的看板工具,可让创建看板、列表和卡片来管理任务和项目。它提供了一个可视化界面,可以在其中跨工作流程的不同阶段拖放卡片。还可以添加截止日期、标…

cesium调用celestrak接口获取卫星数据

celestrak是一家免费开源提供卫星空间数据的非营利性组织 接口调用 import axios from "axios";const BASE_URL "https://celestrak.org";function getTleDataFromExternal(path "") {let uri ${BASE_URL}/NORAD/elements/gp.php?GROUP${…

复习并发编程的基础知识之线程池

并发编程中,线程池是很重要的一块内容。 线程池是一种池化技术,线程池、字符串常量池和数据库链接池都属于池化技术。 使用线程池的好处: 1.提高了线程的利用率(想一想,我们不可能每打一个电话,就去买一部手…

Unity编辑器扩展-第三集-添加按钮到组件菜单并且重置组件

第二集链接:Unity编辑器扩展-第二集-按钮排序/分组/放入右键菜单_菌菌巧乐兹的博客-CSDN博客 一、本节目标效果展示 1.把按钮放到组件菜单上 2.做一个类似Reset功能,点一下能改变里面的数据 二、 把按钮放到组件菜单上 如上图,我的的组件名…

echarts 配置相关

echarts更多模板链接 http://chart.majh.top/ 1、echarts.clear()是清空当前实例,会移除实例中所有的组件和图表。 echarts.dispose()是销毁实例,销毁后实例无法再被使用。 this.chart.dispose() this.chart.clear(); // 清空图表2、series虽然是[] 数…

BRC20赛道的刚需基础设施,BrccSwap如何延续新的造富神话?

引言 BRC20代币和去中心化交易所的背景 BRC20代币赛道的刚需SWAP BrccSwap如何延续新的造富神话 结语 引言 随着加密货币市场的不断发展,BRC20代币和去中心化交易所成为了越来越受欢迎的概念。BRC20代币是建立在比特币区块链上的代币,具有高级别的…

一季度亏损47亿,全系降价背后,蔚来能否实现自救?

降价之后,蔚来能否实现自救? 6月12日,蔚来汽车宣布全系车型起售价减 3 万元;新购车首任车主用车权益调整为整车6年或15万公里质保等;免费换电补能不再作为标准用车权益,新用户可灵活选择在家充电或到充换电…

new Vue后整个的流程

文章目录 new Vue后整个的流程Vue.js 创建应用程序流程概述使用 new Vue() 创建Vue 实例流程概述 new Vue后整个的流程 new Vue({el: #app,render: h > h(App),data() {return {message: hello vue}} }).$mount(#app)Vue.js 创建应用程序流程概述 在使用 Vue.js 创建一个应…

Linux:进程管理

进程:为管理程序的运行,操作系统会给每个运行的程序都注册为系统的一个进程,并为每个进程分配一个进程id 查看进程:Linux中可以通过ps命令查看系统中的进程信息,语法: ps [-e -f] -e选项:表示显…

0基础入门---第3章---神经网络(前向传播)

🌞欢迎来到深度学习的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 🙏作者水平很有限,如果发现错误&#xff…

退出印度之后,越南制造也有麻烦,苹果摆脱中国制造成幻想

日前媒体报道指苹果在越南的代工厂面临麻烦,由于越南缺乏足够的电力供应,越南的工厂出现断电的问题,工厂生产被迫暂停,最严重的时候连续20天白天无法开工,这对于苹果来说无疑是又一个重大打击。 一、苹果的印度制造计划…

MODNet Background Remover 环境搭建步骤

1、安装 Python 3.8以上 2、安装 CUDA环境 4、下载 MODNet Background Remover 5、解压并进入到 MODNet Background Remover文件夹 6、创建虚拟环境 python -m venv venv7、使用虚拟环境 .\venv\Scripts\activate8、安装依赖包 pip install --upgrade pippip install --upg…