即时通讯开发之详解TCP/IP中的UDP 协议

news2025/1/1 23:42:54

UDP 是传输层协议,和 TCP 协议处于一个分层中,但是与 TCP 协议不同,UDP 协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议。

UDP 协议头

2.1UDP 端口号

由于很多软件需要用到 UDP 协议,所以 UDP 协议必须通过某个标志用以区分不同的程序所需要的数据包。端口号的功能就在于此,例如某一个 UDP 程序 A 在系统中注册了3000端口,那么,以后从外面传进来的目的端口号为3000的 UDP 包都会交给该程序。端 口号理论上可以有2^16这么多。因为它的长 度是16个 bit。

2.2UDP 检验和

这是一个可选的选项,并不是所有的系统都对 UDP 数据包加以检验和数据(相对 TCP 协议的必须来说),但是 RFC 中标准要求, 发送端应该计算检验和。

UDP 检验和覆盖 UDP 协议头和数据,这和 IP 的检验和是不同的,IP 协议的检验和只是覆盖 IP 数据头,并不覆盖所有的数据。 UDP 和 TCP 都包含 一个伪首部,这是为了计算检验和而摄制的。伪首部甚至还包含 IP 地址这样的 IP 协议里面都有的信息,目的是 让 UDP 两次检查数据是否已经正确到达目的地。 如果发送端没有打开检验和选项,而接收端计算检验和有差错,那么 UDP 数据将会 被悄悄的丢掉(不保证送达),而不产生任何差错报文。

2.3UDP 长度

UDP 可以很长很长,可以有65535字节那么长。但是一般网络在传送的时候,一次一般传送不了那么长的协议(涉及到 MTU 的问 题),就只好对数据 分片,当然,这些是对 UDP 等上级协议透明的,UDP 不需要关心 IP 协议层对数据如何分片,下一个章节将会稍 微讨论一些分片的策略。即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询

IP 分片

IP在从上层接到数据以后,要根据IP地址来判断从那个接口发送数据(通过选路),并进行MTU的查询,如果数据大小超过MTU 就进行数据分片。数 据的分片是对上层和下层透明,而数据也只是到达目的地还会被重新组装,不过不用担心,IP 层提供了足够的信 息进行数据的再组装。

在 IP 头里面,16bit 识别号唯一记录了一个 IP 包的 ID,具有同一个 ID 的 IP 片将会被重新组装;而13位片偏移则记录了某 IP 片相对整个包的 位置;而这两个表示中间的3bit 标志则标示着该分片后面是否还有新的分片。这三个标示就组成了 IP 分片的所有信息,接 受方就可以利用这些信息对 IP 数据 进行重新组织(就算是后面的分片比前面的分片先到,这些信息也是足够了)。

因为分片技术在网络上被经常的使用,所以伪造 IP 分片包进行流氓攻击的软件和人也就层出不穷。可以用 Trancdroute 程序来进行简单的 MTU 侦测。请参看教材。

UDP 和 ARP 之间的交互式用

这是不常被人注意到的一个细节,这是针对一些系统地实现来说的。当 ARP 缓存还是空的时候。UDP 在被发送之前一定要发送一个 ARP 请求来获得目的 主机的 MAC 地址,如果这个 UDP 的数据包足够大,大到 IP 层一定要对其进行分片的时候,想象中,该 UDP 数据包的第一个分片会发出一个 ARP 查询请求, 所有的分片都辉等到这个查询完成以后再发送。事实上是这样吗?

结果是,某些系统会让每一个分片都发送一个 ARP 查询,所有的分片都在等待,但是接受到第一个回应的时候,主机却只发送了 最后一个数据片而抛弃了其 他,这实在是让人匪夷所思。这样,因为分片的数据不能被及时组装,接受主机将会在一段时间内将永远 无法组装的 IP 数据包抛弃,并且发送组装超时的 ICMP 报文(其实很多系统不产生这个差错),以保证接受主机自己的接收端缓存不 被那些永远得不到组装的分片满。

ICMP 源站抑制差错

当目标主机的处理速度赶不上数据接收的速度,因为接受主机的 IP 层缓存会被占满,所以主机就会发出一个“我受不了”的一个 ICMP 报文。

UDP 服务器设计

UDP 协议的某些特性将会影响我们的服务器程序设计,大致总结如下:

关于客户IP和地址:服务器必须有根据客户IP地址和端口号判断数据包是否合法的能力(这似乎要求每一个服务器都要具备)

关于目的地址:服务器必须要有过滤广播地址的能力。

关于数据输入:通常服务器系统的每一个端口号都会和一块输入缓冲区对应,进来的输入根据先来后到的原则等待服务器的处理,所以难免会出现缓冲区溢出的问题,这种情况下,UDP 数据包可能会被丢弃,而应用服务器程序本身并不知道这个问题。

服务器应该限制本地IP地址,就是说它应该可以把自己绑定到某一个网络接口的某一个端口上。

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

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

相关文章

C 语言零基础入门教程(二十一)

C 头文件 头文件是扩展名为 .h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享。有两种类型的头文件:程序员编写的头文件和编译器自带的头文件。 在程序中要使用头文件,需要使用 C 预处理指令 #include 来引用它。前…

Linux | 编辑器gcc/g++的使用【动静态库的认识】

文章目录一、对程序的认知 && 初识gcc1、程序是如何诞生的?2、gcc的初步认识3、如何使用gcc二、gcc逐步分析程序的翻译环境1、预编译【进行宏替换】2、编译【C语言——>汇编语言】3、汇编【汇编语言——>可重定位目标二进制文件】4、链接【生成可执行…

一篇文章学会写SQL

本篇文章主要讲如何写SQL,虽然我在之前有篇文章中写到过数据库的操作和概念,其中有讲到数据库和表的操作语句以及有哪些函数和查询关键字(本篇不赘述),但毕竟理解概念和会实践书写是两码事。。 身为一名测试人员&#…

证明:lim (x->0+) x^x=1

原式:lim⁡x→0xx\lim _{x\to 0^{}} {x^{x}}x→0lim​xx 根据公式1:u(x)v(x)eu(x)ln⁡v(x)u(x)^{v(x)}e^{u(x)\ln v(x)}u(x)v(x)eu(x)lnv(x)则原式可以化为lim⁡x→0exln⁡x\lim _{x\to 0^{}} e^{x \ln x}x→0lim​exlnx 接下来利用倒代换进行进一步计算。&#xff…

【USB】USB video class (UVC)相关概念学习

UVC协议 IAD 全称Interface Association Descriptor This is used to describe that two or more interfaces are associated to the same function. An ‘association’ includes two or more interfaces and all of their alternate setting interfaces. IAD用来描述由两个…

一次JVM垃圾收集全过程

目录 JVM堆内存分配 JVM垃圾收集完整过程(带图解) 在介绍垃圾收集过程之前,有必要先对JVM堆内存做一个回顾,因为讲垃圾收集主要针对的是堆内存。 JVM堆内存分配 在JDK1.8之前,JVM堆内存主要分为新生代、老年代和永…

Kafka和Flink双剑合璧,Confluent收购Immerok引起业内广泛讨论

2023年开年开源界就出了一个大新闻,1月6日Kafka的商业化公司Confluent创始人宣布签署了收购 Immerok 的最终协议,而Immerok是一家为 Apache Flink 提供完全托管服务的初创公司,其创始团队正是Flink的创始团队。 无论是Kafka还是Flink&#x…

MQ 消息丢失、重复、积压问题,如何解决?

引入 MQ 消息中间件最直接的目的是:做系统解耦合流量控制,追其根源还是为了解决互联网系统的高可用和高性能问题。 系统解耦:用 MQ 消息队列,可以隔离系统上下游环境变化带来的不稳定因素,比如京豆服务的系统需求无论如…

你安全吗?丨生活中常见的黑产行为有哪

作者丨黑蛋电视剧《你安全吗?》我也追完了,到了终结篇。在结尾,网安黑产头子马平川终于因为陷害秦淮攻击虎迫系统被查出来就是虎迫内奸,随后也被一系列证据指出饮料厂等薅羊毛事件背后都有马平川的影子:今天我们就来聊…

python基础学习--数据类型、语句、函数

python的语法比较简单,采用缩进形式,如下: 在这里# print absolute value of an integer: a 100 if a > 0:print(a) else:print(-a)插入代码片以“#”开头的语句是注释。 注意:python是大小写敏感的,如果先写错了…

在线 OJ 项目(二) · 操作数据库 · 设计前后端交互的 API · 实现在线编译运行功能

一、操作数据库前的准备二、封装操作数据库数据的相关操作三、设计前后端交互的 API四、实现在线编译运行功能一、操作数据库前的准备 设计数据库表 我们需要对数据库中存储的题目进行操作. 创建一个 “题目表” oj_table 题目的序号 id. 作为题目表的自增主键。 标题 title.…

Android之常见的使用技巧

文章目录1.全局获取Context的技巧2.使用Intent传递对象Serializable方式Parcelable方式3.定制自己的日志工具4.深色主题5.Java和Kotlin代码之间的转换1.全局获取Context的技巧 在Android中,你会发现有很多地方都需要用到Context,例如:弹出To…

设计模式在项目中的运用

一、如何管理庞大而复杂的项目开发?1、从设计原则和思想的角度来看,如何应对庞大而复杂的项目开发?① 封装与抽象:“一切皆文件”:封装了不同类型设备的访问细节,抽象为统一的文件访问方式,更高层的代码就能…

windows下解决Git报错: LF will be replaced by CRLF the next time Git touches it

问题 在命令行执行git add *的时候,提示Warning: 通常情况下是在 Windows环境中才会遇到。 原因 Uinx/Linux采用换行符LF表示下一行(LF:LineFeed,中文意思是换行),即:\n&#xff1…

Visual Transformer开端——ViT及其代码实现

深度学习知识点总结 专栏链接: https://blog.csdn.net/qq_39707285/article/details/124005405 此专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器…

购买和登录Linux云服务器

目录 云服务器的购买 SSH登录云服务器 云服务器的购买 我们以腾讯云为例, 其他的服务器厂商也是类似。 1. 进入腾讯云官方网站:学生云服务器_云校园特惠套餐 - 腾讯云 (tencent.com) 2. 登陆网站(可以使用微信登陆) 3.购买云服务器 购买最低级即可,对于…

36/365 java 类的加载 链接 初始化 ClassLoader

1.类的加载,链接,初始化 注意点: Class对象是在类的加载过程中生成的(类的数据(static,常量,代码)在方法区,Class类对象在堆中),这个Class类对象作为方法区中…

Canvas 实现台球假想球精准定位

1. 前言 台球是一个让人非常着迷的运动项目,充满了各种计算逻辑,十分有趣。 对于初学者,母球、目标球、袋口三者在一条线上的时候,是非常容易进球的,但对于三者不在一条线上时,就是需要假想球的帮助&…

Windows 上安装 Insomnia 代替 Postman

Windows 上安装 Insomnia 代替 PostmanInsomnia 概述官网地址下载和安装 Insomnia使用 InsomniaInsomnia 概述 Insomnia 是一个开源桌面应用程序,它提供了设计、调试和测试API的简单方法。 通过对开发者友好的界面、内置的自动化和可扩展的插件生态系统&#xff0…

自动驾驶中间件:量产落地的关键技术

/ 导读 /对于初入自动驾驶行业的人来说,各色各样的新型传感器、线控系统、芯片域控制器、算法软件似乎是自动驾驶未来实现的重中之重,对于中间件大多数人可能都不太熟悉,有些甚至从未听说过其存在。但中间件却也是极为重要的一环,…