TCP/IP协议:传输层之UDP

2023-11-18

一、

UDP用户数据报协议,它是一个无连接的,面向数据报的协议,它不提供可靠性但传输速度比TCP要快。

UDP数据报中的“UDP长度”为两个字节,所以我们要发送的UDP数据最多支持65507大约68K的数据,超过该大小的话需要自己来分割发送。 使用UDP必须关心IP数据报的长度,因为如果它超过MTU的话,会对IP数据报进行分片。

在UDP数据报文中,头部占8个字节,报文具体格式如下:


UDP适合一次只传送少量数据、对可靠性要求不高的场景:
  发送小尺寸的数据,如DNS通讯使用的是UDP以提高通信速度。
  流媒体、VOD、IPTV、音视频通讯等常采用UDP。
  UDP的高级应用:广播/多播、P2P、TCP over UDP。

 二、广播/多播

1、

  利用广播可以将数据发送到子网内所有计算机上,广播几乎占用了子网内网络的所有带宽,所以如果有多个进程来同时发送广播数据则网络会阻塞。路由器会隔绝广播。

  对于广播发送方需额外设置两点:一个是设置套接字的SO_BROADCAST选项(BOOL bBroadcast = TRUE; setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bBroadcast, sizeof(BOOL));),一个是发送数据的地址设为"255.255.255.255",其它按照UDP发送方模型来编程即可。

  对于广播数据接收方按照UDP接收者模型来编程即可接收广播数据。

2、

  多播地址即代表了一个组,用户可以加入或退出这个组,多播地址使用D类IP地址,范围是从224.0.0.0到239.255.255.255,而且有一些地址是保留作为特殊的地址所使用。网络中的交换机和路由器只向加入多播组的主机复制并转发数据,这样可以不影响其他不需要(未加入组)的主机的其他通讯。

  多播编程方法与UDP模型也大体相同,对于发送端需要增加设置数据的TTL生存时间功能(使用函数setsockopt),对于接收端需要增加加入多播组的功能(使用函数setsockopt)。

  多播需要网络硬件(如路由器)的支持或者硬件开启了多播服务。

3、

  单播是主机之间一对一的通讯模式,可以使用TCP或UDP,网络中的交换机和路由器对数据只进行转发不进行复制。网络上大部分的数据都是以单播的形式传输的,如浏览网页、收发邮件等。对于广播或多播数据,网络中的交换机和路由器会对其进行复制并转发。

  广播和多播一般只适合向不同客户传送相同数据的应用,如有线电视使用广播,网络电台使用多播,如果需要对每个客户的不同请求发送不同的数据的话只能使用单播服务器。因为广播和多播是仅发送一次数据所有的接收方就都能收到数据,所以发送方(服务器)流量负载很低,而单播服务器要向所有客户发送数据,即发送多次数据才能到达多个客户上,所以服务器网络负载大。

  因为广播和多播使用的是UDP,发生丢包错包后无法重传。

三、P2P

  NAT使只能内网中计算机去连接外网,然后二者再进行通信,而外网中的计算机是无法主动连接内网计算机进行通信的,所以产生了P2P通信技术来解决这个问题,P2P也被称为NAT打洞或NAT穿透。P2P技术广泛存在于基于UDP的应用中,但本质上,相同的技术也应该支持TCP。

  NAT打洞需要一个处于公网的中间服务器,具体流程为:

  ① A请求Server(向Server发送本地IP地址和端口号的信息, A所处的NAT外网地址Server可以通过recvfrom()的sockaddr_in结构获得),B请求Server。

  ② Server将A的IP地址信息(内网IP+端口,外网IP+端口)发送给B,将B的IP地址信息也发送给A。

  ③ A使用B的外网IP地址和端口号向其发消息,虽然B是收不到消息的(B所在的NAT会将其过滤掉),但这样做只是为了使A信任B,以后B向A发消息A就会收到(A的NAT不会过滤掉,因为A向B主动发过消息就代表A或者说A的NAT信任了B)。

  ④ B使用A的外网IP地址和端口号向其发消息,A会收到,而且这样使B也信任了A。

  ⑤ A和B互相信任,可以直接进行通信了。

  上面的第③步其实还应该向B的内网地址和端口号发消息,以对应处理A和B在一个内网中的情况,具体的步骤可以参考作者休耕的这篇文章:https://www.cnblogs.com/xiugeng/p/12029388.html,这篇文章还介绍了打的洞会出现超时失效问题的解决以及基于TCP协议的P2P打洞技术,以下为截取的该文章的内容:

  

    由于NAT的配置不同,打洞并不保证100%都能成功,所以可以考虑P2P + SSH端口转发的模式。

四、SSH端口转发

  ssh命令除了登陆外还有端口转发(又称代理)的功能,这包括三种转发模式:

    ① 本地端口转发(Local Port Forwarding,又称正向代理)

    ② 远程端口转发(Remote Port Forwarding,又称反向代理)

    ③ 动态端口转发(Dynamic Port Forwarding,又称socks5 代理)

  本地端口转发:将发送到本地端口的请求,转发到目标端口,格式为 -L 本地网卡地址:本地端口:目标地址:目标端口,其中的本地网卡地址可以省略,表示本机所有网卡。如ssh -L localhost:2000:localhost:3000 root@103.59.22.17 表示将发送到本地主机2000端口的请求转发到主机103.59.22.17的3000端口,ssh -L localhost:2000:192.168.59.100:3000 root@103.59.22.17 则表示将发送到本地2000端口的请求经主机103.59.22.17的转发到其局域网下的192.168.59.100:3000下。网上我看到说是这两种方法的区别是第一种用法本地HostA到跳板机 HostB 的数据是明文的,二种用法一般本地就是 HostA,访问本地的 PortA,数据被 ssh 加密传输给 HostB 又转发给 HostC:PortC。

  远程端口转发:将发送到远程端口的请求,转发到目标端口,格式为-R 远程网卡地址:远程端口:目标地址:目标端口,其中的远程网卡地址可以省略,使用时需修改远程主机的 /etc/ssh/sshd_config,添加GatewayPorts yes。如ssh -R :2000:localhost:3000 root@103.59.22.17表示将发送到103.59.22.17主机2000端口上的数据转发到本机的2000端口上,ssh -R :2000:192.168.0.100:3000 root@103.59.22.17则表示将发送到103.59.22.17主机2000端口上的数据转发到本机局域网下192.168.0.100的2000端口上。

  动态端口转发:又称本地 socks5 代理,如ssh -D localhost:1080  HostB 表示本地 1080 端口启动一个 socks5 服务,通过这个 socks5 代理,数据会通过 ssh 链接先发送给 HostB,再从 HostB 转发送给远程目标主机。

  如要长期高效的转发(代理)服务,推荐使用对应的专用软件,ssh-L可以用 iptable 的 port-forwarding 模拟,iptable 性能更好,但是需要 root 权限。ssh-R功能的专业软件有 frp /ngrok /shootback。

五、TCP中的反向链接

  如下的A电脑处于局域网内,NAT为其分配的IP为10.0.0.1,A可以主动连接B电脑,因为B处于公网中,但B不能主动连接A。所以如果B想要给A发通知的话只能是让A先连上B然后等待B随时发来的消息,如果我们只想在有消息的时候A和B再进行连接通信的话可以使用中间的Server电脑 ,让A一直与处于公网的Server相连,当B想要与A通信的时候给Server发一个消息,让Server通知A去连接B。

   

六、TCP over UDP

  TCP over UDP具有UDP速度快、实时性高的特点,同时又兼备TCP的可靠性,它主要是在UDP之上参考TCP协议算法来实现。

转自:https://www.cnblogs.com/milanleon/p/6902232.html分类: TCP/IP协议

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP/IP协议:传输层之UDP 的相关文章

  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • 为什么Apache MPM prefork.c 使用互斥体来保护accept()?

    我坐下来读书Apache 的 MPM prefork c http code metager de source xref apache httpd server mpm prefork prefork c这段代码使用了一个名为accept
  • 在 C# 中生成 HMAC-SHA1

    我正在尝试使用 C 来使用 REST API API 创建者提供了以下用于 hmac 创建的伪代码 var key1 sha1 body var key2 key1 SECRET KEY var key3 sha1 key2 var sig
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • CultureInfo 的实例(来自相同的文化)根据操作系统而变化

    我有一个网站 上面写着这样的日期 CultureInfo cultureInfo CultureInfo GetCultures CultureTypes AllCultures FirstOrDefault c gt string Equ
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • 2D morton 码编码/解码 64 位

    如何将给定 x y 的莫顿代码 z 顺序 编码 解码为 32 位无符号整数 生成 64 位莫顿代码 反之亦然 我确实有 xy2d 和 d2xy 但仅适用于 16 位宽的坐标 产生 32 位莫顿数 在网上查了很多 但没有找到 请帮忙 如果您可
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • C++ 错误 - “成员初始值设定项表达式列表被视为复合表达式”

    我收到一个我不熟悉的 C 编译器错误 可能是一个非常愚蠢的错误 但我不能完全指出它 Error test cpp 27 error member initializer expression list treated as compound
  • 如何随着分辨率的变化自动调整大小和调整表单控件

    我注意到某些应用程序会更改控件的位置以尽可能适应当前的分辨率 例如 如果窗口最大化 则控件的设置方式应使整个 GUI 看起来平衡 是否可以使用 C 在 Visual studio 2010 中制作或实现此功能 Use Dock http m
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • DataTable:通过 LINQ 或 LAMBDA 进行动态 Group By 表达式

    我有一个数据表 我想在其中对未指定数量的字段进行分组 发生这种情况的原因是用户可以选择他想要分组的字段 所以 实际上 我将选择推入列表中 在这个选择上 我必须对我的数据表进行分组 想象一下这段代码 VB 或 C 都一样 public voi
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 在 C++17 中使用 成员的链接错误

    我在 Ubuntu 16 04 上使用 gcc 7 2 并且需要使用 C 17 中的新文件系统库 尽管确实有一个名为experimental filesystem的库 但我无法使用它的任何成员 例如 当我尝试编译此文件时 include
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul

随机推荐

  • MOS管做二极管使用

    注 个人学习记录 目录 原理分析 电路仿真 NMOS电路连接方法 NMOS仿真I V特性曲线 PMOS电路连接方法 PMOS二极管接法的I V特性曲线 原理分析 如下图所示 左边为NMOS 右边为PMOS 由MOS管的结构可以看出 其衬底B
  • 图解laravel的生命周期

    先来张图大致理解下laravel的生命周期 下面对应相应的代码 解释上图 文件路径 laravel public index php laravel的启动时间 define LARAVEL START microtime true 加载项目
  • 2024王道408数据结构 P92 T3

    2024王道408数据结构 P92 T3 思考过程 这题比较复杂做的我好 累 首先我们还是先看懂题目 让我们用一个栈来实现递归函数的非递归计算 我们先剖析一下这个表达式 式子展开变成图上这样 那既然让我们用非递归来计算 那我们顺理成章就想到
  • [Qt]控件

    文章摘于 爱编程的大丙 文章目录 1 按钮类型控件 1 1 按钮基类 QAbstractButton 1 1 1 标题和图标 1 1 2 按钮的 Check 属性 1 1 3 信号 1 1 4 槽函数 1 2 QPushButton 1 2
  • 蓝桥杯单片机14届省赛解析(个人)

    下面记录一下自己这届省赛比赛时的思路 不太会写作文 比较口语化 而且一些看法仅仅是我个人观点 赛后我还没有看过任何讲解或例程 可能会有很多理解不对的地方希望大家能够指出一起交流 一 硬件框图 往届省赛基本上都是考两个外设 这次一看硬件框图就
  • vue 集成高德地图

    准备工作 高德地图官网 https lbs amap com 高德地图JS API 2 0 教程 https lbs amap com api jsapi v2 summary 高德地图JS API 2 0 参考手册 https lbs a
  • python中sqlite3对数据库的增删改查

    1 python API的介绍 1 connection 数据库连接对象 连接对象 建立python客户端与数据库的网络连接 创建方法 sqlite3 connect 参数 2 cursor 游标对象 2 增删改查的流程 select语句
  • C++代码审查工具Cppcheck和TscanCode

    cppcheck简介 cppcheck 是一个静态代码检查工具 支持c c 代码 作为编译器的一种补充检查 cppcheck对源代码执行严格的逻辑检查 助力开发与测试工程师从代码层面挖掘问题 聚焦于包括逻辑错误 可疑的代码 运算错误 空指针
  • stm32通过spi连接esp8266的hspi 开发

    stm32通过spi连接esp8266的hspi 开发 刚刚做了stm32通过spi连接esp8266的开发 目前已经解决了遇到的大多数问题 基本可以交付使用了 写一篇文章留作记录 也可以给以后做这个的朋友做为参考 esp8266模块本身发
  • Nand Flash基础知识

    1 Nand Flash组织架构 Device Package 就是封装好的nand flash单元 包含了一个或者多个target 一个target包含了一个或者多个LUN 一个target的一个或者多个LUN共享一组数据信号 每个tar
  • 一个迷惑性很高的生产故障-Elasticsearch日志rotate导致节点CPU激增

    背景 Elasticsearch CPU很高的场景很常见 优化读写以及扩容即可解决问题 如果只有一个节点CPU高 那可能的情况就比较多了 节点机器异常 读写不均匀 GC过高 forcemerge 这里描述一个极具迷惑性的case 问题 收到
  • 电机专题2:直流有刷电机工作原理

    直流有刷电机的工作原理 直流有刷电机 其实就是直接最简单的方式利用安培力 给导线通电 然后在磁场中运动 在上面的电流电机物理模型中 电刷和主磁铁是固定不动的 是电机的定子 绕组线圈和换向片连接到一起 为转子 电机的工作过程 这种是直流有刷电
  • diskmark使用教程

    raid盘测速 首先说明一下软件各个参数的意义 1 9 测试次数 50MB 4000MB 测试规模 C D E F选择测试对象 ALL 测试以下所有 第一行代表你硬盘的读写速度 第二行代表你硬盘4K文件多线程读写速度 第三行代表你硬盘的连续
  • 计算机概论易错题总结:概念类

    为期末考试 冲鸭 文字类 1 在计算机运行时 把程序和数据一样存放在内存中 这是1946年由 领导的研究小组 正式提出并论证的 冯 诺依曼 2 被誉为第一位程序员的是 Augusta 3 我国自行设计研制的天河2号计算机是 巨型机 记法 天
  • JSP动态网页设计——tomcat配置、第一个动态工程

    默认设置 已完成eclipse安装 JDK安装 环境配置 下载tomcat压缩包 已上传至资源 并解压好 启动tomcat 在此文件夹下找到bin文件 在bin目录下点击startup bat 启动标志 双击弹出黑框 若出现以下图片 则已启
  • STL之Set基本用法

    单独说一下Set是因为这个工具以前很少用 因为接触不多 后来发现功能太强大了 本来很多题目用Set可以快速通过 但无奈之前都没有使用set的习惯 导致吃了不少亏 set功能非常强大 原因在于Set就是一棵二叉搜索树 我们在很多题目中经常遇到
  • 在Android下初始化Native OpenGL ES

    在上一篇文章中 介绍了在Android Native层初始化EGL及OpenGL ES的方法 其中 大量代码花费在EGL的初始化上面 非常的麻烦 在本文中 将展示利用GLSurfaceView来代替我们手动初始化EGL的过程 用GLSurf
  • 数据分析 告诉你《飞驰人生》为什么这么燃?

    数据分析 飞驰人生 为什么这么燃 2019年贺岁电影 飞驰人生 在豆瓣排名和猫眼排名中都排名第二的位置 我们这里爬取了豆瓣500条的评论数据来 分析一下 飞驰人生 为何这么燃 这里说明一下 之所以获取这么点数据 是豆瓣的 的反爬限制 非登录
  • Vue 0基础学习路线(24)—— 图解深度详述vue的路由动画效果的使用及详细案例(附详细案例代码解析过程及版本迭代过程)

    文章目录 1 路由动画效果 2 实例 2 1 example01 1 路由动画效果 路由动画 gt 利用 transition 组件 我们还可以给路由导航加上动效 App vue
  • TCP/IP协议:传输层之UDP

    一 UDP用户数据报协议 它是一个无连接的 面向数据报的协议 它不提供可靠性但传输速度比TCP要快 UDP数据报中的 UDP长度 为两个字节 所以我们要发送的UDP数据最多支持65507大约68K的数据 超过该大小的话需要自己来分割发送 使