【计算机网络】UDP协议详解

目录

前言      

端口号的拓展

端口号范围划分

netstat

pidof

UDP协议

UDP协议端格式

UDP的特点

面向数据报

UDP的缓冲区

UDP使用注意事项

基于UDP的应用层协议


 

前言      

  我们前面讲完了http和https协议,它们都属于应用层,按照TCP/IP五层模型,我们下一层该讲解传输层了。传输层又分为TCP协议和UDP协议,五层模型都以TCP/IP命名,可想而知TCP重要性。所以本章及后面的章将详细讲解TCP和IP,以及它们之间的区别。

端口号的拓展

我们之前说了,端口号(Port)标识了一个主机上进行通信的不同的应用程序(进程)。利用ip地址+端口号可以定位全球上唯一一个进程。

        知道了ip地址,便知道了对方主机的位置;至于传送给哪个应用处理程序,是根据端口号决定的。每个应用处理程序都会有一个或多个端口号。

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

端口号范围划分

        0 - 1023: 知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的.

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

        1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的.例如我们平常运行自己程序所用的是8080端口,或其它端口都可以

我们可以使用以下指令来查看所有的知名端口号

cat /etc/services

我们自己在写程序使用端口号时,要尽量与这些知名端口号避开。 

netstat

netstat是一个用来查看网络状态的重要工具.

语法netstat [选项]
功能查看网络状态
常用选项:

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

例如我们平常所用的

netstat -nltp

  即将所有全部显示为数组,然后仅显示listen相关的服务,然后显示与tcp相关连接的程序名字。

pidof

查看服务器的进程id时非常方便.

语法:pidof [进程名]
功能:通过进程名, 查看进程id

当我们运行起来一个进程后,使用pidof可以直接找到对应的pid,而不用使用ps和grep找了。

我们也可以搭配xargs使用,它可以将管道的内容作为命令行参数使用,我之前在讲linux基础命令时也有讲过。

例如平常使用管道时:

cat log.txt | tail -10

该命令是先输出log.txt里的内容,然后作为输入传送给tail,然后取后10行的内容并输出。

xargs:

pidof HttpServer | xargs kill -9

该命令会将得到的HttpServer的pid,作为kill的参数,相当于是kill -9 pid.

UDP协议

UDP协议端格式

我们首先要知道几乎任何协议都要优先解决两个问题:

a.如何分离(封装)    b.如何交付

至于是如何解决的,每个协议的方式不一样,UDP采用的是定长报头的方式来解决的。

其中数据(有效载荷)是上一层应用层的数据,上面8个字节便是UDP的报头。

16位UDP长度 是UDP报头的长度和数据的长度之和。所以提取数据时,要将16位UDP长度-8字节便是数据的长度了。

这样,问题便解决了:

a.如何分离:采用固定长度(8字节)的报头,将报头和数据(有效载荷)分离

b.如何交付:分离出来后,根据报头中的16位目的端口号,进行向上交付。因为进程bind了端口号,知道端口号便知道交给哪个进程。

所以,这也能解释

a.我们平常编写代码时,端口号通常使用uint16_t类型,因为端口号是16位的

b.udp是如何提取完整报文的?先提取固定长度的报头,再根据报头中的16位udp长度 -8,剩下的长度便是数据总长度了。这同时也说明UDP是面向数据报的,这个后面会详细说明。

UDP的特点

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

面向数据报

应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并;

比如用UDP传输100个字节的数据:

        如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个字节; 而不能循环调用10次recvfrom, 每次接收10个字节;

总之就是,你发几次,我就严格的收几次,不会多也不会少。

UDP的缓冲区

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

UDP的socket既能读, 也能写, 这个概念叫做 全双工

UDP使用注意事项

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

基于UDP的应用层协议

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

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

到这里,UDP协议的内容就讲解完了,当然这个比较简单,TCP是我们要讲解的重点,下一章,我们将详细介绍TCP协议。

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

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

相关文章

2023国赛数学建模C题模型代码

C题代码全部都完成了,可以看文末名片 我们先看C题的一个背景 在生鲜商超中,蔬菜类商品保鲜期短,且品相会随销售时间增加而变差。商超需要根据历史销售和需求每天进行补货。由于蔬菜品种众多、产地不同,补货时间在凌晨,商家须在不明确具体单品和价格的情况下进行补…

如何排查网站及APP数据泄露的源头

近年来数据泄露安全事件频发,在今年的hw网络安全攻防演练中,获取敏感信息、数据泄露等漏洞的得分也越来越高,我们SINE安全近十年来成功的帮助了许多客户,查找到了数据泄露的原因,在这里向大家分享我们的经验与心得&…

端口已被占用

报的错误 Exception in thread "Thread-76" java.net.BindException: Address already in use: bindat sun.nio.ch.Net.bind0(Native Method)at sun.nio.ch.Net.bind(Net.java:433)at sun.nio.ch.Net.bind(Net.java:425)at sun.nio.ch.ServerSocketChannelImpl.bind…

实相融、云启未来,智慧公厕让城市生活更美好

现代社会,随着科技的不断发展,人们对于城市生活的要求也在不断提升。在这个过程中,智慧公厕作为城市基础设施中的重要组成部分,正在发挥着越来越重要的作用。通过数字化、云管理、人工智能等未来的科技方式,智慧公厕为…

Acwing算法心得——街灯(差分)

大家好,我是晴天学长,差分广泛用于一段范围的加减运算,可以优化时间复杂度,需要的小伙伴请自取哦!如果觉得写的不错的话,可以点个关注哦,后续会继续更新的。💪💪&#x1…

计及电池储能寿命损耗的微电网经济调度(matlab代码)

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《考虑寿命损耗的微网电池储能容量优化配置》模型,以购售电成本、燃料成本和储能寿命损耗成本三者之和为目标函数,创新考虑储能寿命损耗约束、放电深度约束和储能循环次…

为什么零基础选择语言首选python

在众多编程语言中,似乎已经没有什么能够阻挡Python的步伐。本月Python又是第一名,市场份额达到了13.42%,在2023年,Python已经连续7个月蝉联榜首,遥遥领先于其他对手。 每个月榜单发布后,都有小伙伴会好奇&…

数学建模竞赛常用代码总结-PythonMatlab

数学建模过程中有许多可复用的基础代码,在此对 python 以及 MATLAB 中常用代码进行简单总结,该总结会进行实时更新。 一、文件读取 python (pandas) 文件后缀名(扩展名)并不是必须的,其作用主要一方面是提示系统是用…

每日一题(设计循环队列)

每日一题(设计循环队列) 622. 设计循环队列 - 力扣(LeetCode) 1.题意解读 本题只能为队列开辟k个单位空间,并且只能利用这几个空间进行数据的存储。 思路:本题使用数组来实现队列是比较方便的&#xff0c…

网络是如何进行通信

网络是如何进行通信的 简介 在现代社会中,网络已经成为我们生活中不可或缺的一部分。从上网搜索信息、在线购物到远程工作和社交媒体,我们几乎无时无刻不与网络保持着联系。但是,网络究竟是个什么玩意,它是如何工作的呢&#xf…

OpenCV 01(图像加载与显示)

一、机器视觉 现在说的机器视觉(Machine Vision)一般指计算机视觉(Computer Vision), 简单来说就是研究如何使机器看懂东西。就是是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传…

道一云·七巧对接打通金蝶云星空查询七巧表单接口与供应商新增接口

道一云七巧对接打通金蝶云星空查询七巧表单接口与供应商新增接口 数据源平台:道一云七巧 道一云七巧拥有强大的自定义表单设计工具,并配置工作流程,通过流程智能流转,打通各个业务场景中的审批、协作环节,包含数据采集单、任务单…

用于独立系统应用的光伏MPPT铅酸电池充电控制器建模(Simulink实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【0906 C高级day1】 Linux中的文件相关指令

一、使用cut截取出Ubuntu用户的家目录,要求:不能使用":"作为分割 grep "ubuntu" /etc/passwd | cut -d "/" -n -f 2-3 | cut -c 1-11 二、思维导图 文件相关指令:

WordPress(5)在主题中添加文章字数和预计阅读时间

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 样式图一、添加位置二、找到主题文件样式图 提示:以下是本篇文章正文内容,下面案例可供参考 一、添加位置 二、找到主题文件 在主题目录下functions.php文件把下面的代码添加进去: // 文章字数…

记一次生产环境服务卡死排查记录

接现场运维报告某java服务CPU狂飙,服务处于卡死无响应状态 询问现场运维什么场景造成的,答复是偶发现象,没有规律,和请求高峰期并没有关系。 因为服务是负载均衡的(A、B两台),临时处理让运维重…

go语言学习笔记

Go学习 一直想学一门新语言,难度又不想太大,C和Java都会但是不怎么精通,某天看到Go语言,好的,就是它了。总体来说,go语言的学习还是相对简单,有编程基础的入手很快。 简介 go是一种并发、带垃…

第15章_锁: (表级锁、页级锁、行锁、悲观锁、乐观锁、全局锁、死锁)

3.2 从数据操作的粒度划分:表级锁、页级锁、行锁 为了提高数据库并发度,每次锁定的数据范围越小越好,理论上每次只锁定当前操作的数据的方案会得到最大的并发度,但管理锁是很耗资源(涉及获取、检查、释放锁等动作)。因…

全网超50万粉丝的Linux大咖良许,出书了!

全网超50万粉丝的Linux大咖良许 出书了! 今天我们要说的就是这本由Linux领域头部号主,良许老师编写的这本《速学Linux:系统应用从入门到精通》 如果你是刚开始学习Linux的小白同学,相信你已经体会到与学习一门编程语言相比&…

fastjson 1.2.24 反序列化导致任意命令执行漏洞复现

拉取docker容器 访问并抓包 修改为POST 方式,文件类型改为json格式,发送json数据包,发送成功 这里安装一个bp的插件 使用安装的插件 可以看到,插件告诉我们这里有漏洞,并且提供了POC 既然我们发现有 rmi ,…