1.TCP和UDP

2.TCP为什么慢于UDP

3.可靠UDP


1.TCP和UDP

1).通过打电话的方式说明TCP和UDPa.TCP(传输控制协议), 就像打电话- 需要先拨号, 接通, 问候(建立连接)- 你一句, 我一句, 对方没有听清会要求你重复(确认与重传)- 保证对话有条不紊, 内容准确无误(可靠, 有序)- 如果信号不好, 你们会下意识地慢点说(拥塞控制)- 最后会礼貌道别(断开连接)b.UDP(用户数据报), 就像学校广播站发公告- 拿起麦克风就直接说, 不管下面有没有听(无连接) - 只管自己念完, 不关心学生听没听清, 记没记住(无确认, 不可靠)- 念得飞快, 一口气念完所有内容(高效, 速度块)- 各个班级听到的顺序可能不同(无序)- 即使有学生喊"没有听清", 广播站也不会重复(不重传) 

2).TCP(传输控制协议)a.连接性面向连接, 传输数据前必须通过三次握手建立一条逻辑连接通道; 传输结束后通过四次挥手断开连接b.可靠性高可靠性, 确保数据无差错, 不丢失, 不重复, 按次序到达c.流量控制有, 由接收方控制发送方的速率, 防止发送过快导致接收方缓冲区溢出d.拥塞控制有, 根据网络状况动态调整发送速率, 避免网络瘫痪e.有序性有序, 对每个数据字节进行编号, 接收端会重新排序, 保证应用程序收到的数据和发送顺序一致f.数据模式面向字节流, 将数据看作一连串无结构的字节流, 没有边界; 所以会出现黏包问题, 需要应用层自行解决g.首部开销首部结构复杂, 包含序列号, 确认号, 窗口大小, 校验等控制信息h.传输效率速度相对慢, 延迟较高; 因为需要建立连接, 确认, 重传, 流量控制和拥塞控制, 带来了额外的延迟i.双工性在一条TCP连接上, 双方可以同时进行数据的发送和接收j.应用场景要求数据绝对准确, 完整性大于速度的场景, 比如: 电子邮件(SMRTP, POP3, IMAP), 文件传输(FTP)

3).UDP(用户数据报)a.连接性无连接, 无需建立和断开连接, 想发数据就直接发b.可靠性尽最大努力交付, 不保证数据一定到达终点, 可能丢失, 乱序或重复c.流量控制无, 发送速率不受接收方控制, 可能因发送过快导致接收方丢包d.拥塞控制没有拥塞控制, 即使网络拥堵, 也以恒定速率发送数据, 可能会加剧网络拥堵e.有序性每个数据报都是独立的, 不保证先后顺序, 接收端收到的是什么顺序就是什么顺序f.数据模式面向报文的, 发送和接收的都是完整的, 有边界的数据; 应用层交付的数据包不会合并也不会拆分g.首部开销首部非常简单, 仅包含源/目标端口, 长度, 校验等基本信息h.传输效率没有复杂的控制机制, 传输效率高, 延迟低i.双工性支持一对一, 一对多, 多对多j.应用场景要求传输速度和实时性, 速度大于完整性的场景; 比如: 音视频直播, 语音通话等

2.TCP为什么慢于UDP

TCP慢于UDP, 是因为TCP为了保证可靠性而牺牲部分速度1).确认应答(ACK)和超时重传- UDP, 发送方发送完数据就结束了, 不管对方是否收到, 就像仍纸团, 扔出去就不管了- TCP, 发送方每发送一个数据包, 都必须收到接收方的确认回复(ACK), 才会发送下一个; 如果一段时间内没有收到ACK, 发送方就认为数据包丢了, 会重新发送由于TCP每次发送和等待ACK都需要等待时间(即RTT - 往返时间), 网络延迟本身就高的环境下(如卫星链路), 这种一来一回的等待就会非常明显; 重传更是增加了额外的时间成本2).按序交付- UDP, 接收方收到什么就立刻上交什么, 不管顺序; 后发的包可能先到- TCP, 必须保证接收方应用程序读到的数据顺序和发送方发出的顺序完全一致; 如果中间某个数据包丢失或延迟了, 即使后面的数据包已经到达, 接收方也必须将它们缓存起来, 等待丢失的那个包重传成功并组装顺序后, 才交给应用层由于TCP需要按序交付, 这造成了队头阻塞, 一个包的丢失或延迟就会拖累后面所有已到达但无序的数据无法及时处理3).流量控制- 目的, 防止发送方发送的过快, 导致接收方的缓冲区溢出- 机制, 主要通过TCP首部的窗口大小来实现, 接收方告诉发送方"我目前还能接收多少数据"; 发送方发送的数据量不能超过这个窗口- 带来的延迟, 如果接收方处理速度慢(比如应用程序读取数据慢), 窗口会变小, 设置为0; 发送方就必须暂停发送, 等待接收方腾出缓冲区并告知新的窗口大小; 这个等待就引入了延迟4).拥塞控制- 目的, 防止发送方发送的过快, 导致网络中间设备过载, 它感知网络的承载能力- 核心机制, 一套复杂的算法(慢启动, 遇到拥塞等), 通过动态调整一个拥塞窗口的值来控制发送速率慢启动: 连接刚建立时, 发送速率会从很低的值开始, 然后像指数增长一样迅速增加, 直到遇到阈值或发现丢包(网络拥塞的信号)遇到拥塞: 一旦检测到丢包(超时), TCP会认为网络堵了, 会剧烈地减小发送速率, 然后再开始缓慢增长- 带来的延迟/速度变化, 拥塞控制使得TCP的速度不是稳定的, 而是像一个锯齿波一样上下波动, 它永远在试探网络的极限带宽, 一旦碰壁后就后退; UDP一直以恒定的速率发送, 挤占其他连接带宽, 直到把网络塞满

3.可靠UDP

游戏开发中的可靠UDP是有选择地实现部分TCP的功能, 只会实现当前业务最需要的那部分; 必须实现的功能1).序列号a.判断丢包, 没有序列号, 根本无从知道包2和包3之间是不是丢了一个包b.判断重复包, 网络抖动可能让我们收到两个一样的包, 序列号可以帮我们去重c.对于需要按顺序执行的指令, 接收方可以依据序列号进行排序后提交给游戏逻辑处理注: 在接收方, 序列号用于判断和排序, 不一定要像TCP那样阻塞等待; 比如包3到了但包2没到, 对于非关键数据可以直接处理包3, 对于关键指令则可以等待包2重传后再按顺序处理2).丢包检测a.为什么实现UDP本身不告诉你数据是否到达, 如果枪击指令的包丢了, 玩家会觉得自己开了空枪, 体验极差; 所以你必须自己能检测到哪个包可能丢了b.如何实现- 确认应答(ACK), 接收方收到包后, 会发送一个ACK消息回去, 告诉发送方法我收到了X号包- 否定确认(NACK), 接收方发现序列号不连续(比如收到了包1和包3, 没有收到包2), 会主动发送一个NACK的消息, 请求发送方重传包2- 超时计时器, 发送方为每个已发送的包启动一个计时器, 如果在一定的时间内没有收到对应的ACK, 就认为丢了, 触发重传3).重传机制a.为什么必须检测到丢包是为了补救, 重传是保证关键数据可靠的最终手段b.关键: 选择性重传, 不是所有数据都值得重传- 需要重传的: 关键的指令, 比如玩家释放技能- 不需要重传的: 比如玩家的位置和朝向, 对于这种数据, 最新的数据永远比旧数据更有价值4).拥塞控制(强烈建议实现)a.为什么如果我们的游戏不顾网络拥堵情况疯狂发送和重传数据, 会拖垮整个局域网或路由器的性能, 最终所有人的连接质量下降b.我们不需要实现TCP那样复杂的拥塞控制算法, 可以实现一个轻量级, 对游戏友好的版本- 监测往返时间(RTT)的变化, 如果RTT持续变大, 说明网络可能拥堵了, 应适当降低发送速率- 监测丢包率, 丢包率上升也是网络拥堵的标志  

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

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

相关文章

CMap常用函数

CMap 是 MFC 中用于存储键值对(key-value)的关联容器类,类似于 C 标准库中的 std::map,但依赖 MFC 框架实现。它采用哈希表(Hash Table)作为底层数据结构,支持高效的键值查找、插入和删除操作。…

Rocky9.0去堆叠双发arp(支持“ARP 广播双发”)

摘要 在去堆叠/MLAG 场景下,默认 bonding 只会以单口回复 ARP,另一台交换机收不到 ARP Reply。本文在 Linux bonding 驱动中增加参数 arp_broadcast_mode,当开启时对 ARP 包临时切换到 广播模式,实现双口同时发 ARP Reply。文内提…

网页连接摄像头

摄像机处理 <!-- camera_solve.html --> <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

FPGA雷达信号处理之:自适应门限阈值

一、原理 参考这个博主&#xff0c;讲的很仔细&#xff1a;基于脉冲功率的雷达脉冲参数检测原理详解 二、FPGA实现 使用system generator搭建算法模型如下&#xff1a; 在这里&#xff0c;滤波器窗长度为8&#xff0c;原博主设置为50效果更好&#xff0c;门限公式如下&#xf…

Vue 中实现选中文本弹出弹窗的完整指南

在现代 Web 应用中&#xff0c;选中文本后显示相关操作或信息是一种常见的交互模式。本文将详细介绍如何在 Vue 中实现选中文本后弹出弹窗的功能&#xff0c;包括其工作原理、多种实现方式以及实际项目中的应用示例。 一、实现原理 1. 文本选中检测机制 浏览器提供了 Select…

第4节-排序和限制-FETCH

摘要: 在本教程中&#xff0c;你将学习如何使用 PostgreSQL 的 FETCH 子句从查询中检索部分行。 PostgreSQL FETCH 简介 在 PostgreSQL 中&#xff0c;OFFSET 子句的作用类似于 LIMIT 子句。FETCH 子句允许你限制查询返回的行数。 LIMIT 子句并非 SQL 标准的一部分。不过&#…

洛谷 P2680 [NOIP 2015 提高组] 运输计划(二分答案 + 树上差分)

题目链接题目概括与评价 很经典&#xff0c;突破口藏的很深&#xff0c;求最小值这里&#xff0c;是问题切入点&#xff0c;想到用二分答案&#xff0c;然后思考怎么写 f_check 函数。二分答案树上差分。代码 #include <iostream> #include <vector> #include <…

接力邓承浩,姜海荣能讲好深蓝汽车新故事吗?

出品 | 何玺排版 | 叶媛深蓝汽车迎来新话事人。9月5日&#xff0c;新央企长安汽车旗下品牌深蓝汽车传出新的人事调整。多家业内媒体报道称&#xff0c;荣耀前中国区CMO姜海荣已正式加入长安汽车&#xff0c;并出任旗下深蓝汽车CEO一职。原CEO邓承浩则升任深蓝汽车董事长&#x…

esp32-c3写一个收集附近 WiFi 和蓝牙信号通过

下面给你一个基于 ESP-IDF(v5.x) 的完整示例&#xff1a;在 ESP32-C3 上同时扫描附近 Wi-Fi 与蓝牙&#xff08;BLE&#xff09;广播&#xff0c;把结果以 JSON 结构统一输出到串口&#xff0c;并且可可选通过 MQTT 上报到服务器&#xff08;打开一个宏即可&#xff09;。日志默…

文心大模型 X1.1:百度交出的“新深度思考”答卷

文心大模型 X1.1&#xff1a;百度交出的“新深度思考”答卷 2025年9月9日&#xff0c;WAVE SUMMIT 2025深度学习开发者大会在北京正式召开&#xff0c;由深度学习技术及应用国家工程研究中心主办&#xff0c;百度飞桨与文心大模型联合承办。大会上&#xff0c;百度正式发布了基…

开始 ComfyUI 的 AI 绘图之旅-Flux.1图生图(八)

文章标题一、Flux Kontext Dev1.关于 FLUX.1 Kontext Dev1.1 版本说明1.2 工作流说明1.3 模型下载2.Flux.1 Kontext Dev 工作流2.1 工作流及输入图片下载2.2 按步骤完成工作流的运行3.Flux Kontext 提示词技巧3.1 基础修改3.2 风格转换3.3 角色一致性3.4 文本编辑4.常见问题解决…

Java 生成微信小程序二维码

1. java 二维码生成工具类import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import com.pdatao.api.controller.file.FileController; import com.pdatao.api.error.CommunityException; import org.apache.commons.io.IOUtils; import org.springframe…

智慧健康触手可及:AI健康小屋——未来健康管理的全能守护者

AI健康小屋&#xff0c;这座融合人工智能、物联网与医疗科技的“健康堡垒”&#xff0c;正悄然重构健康管理生态。它以科技为引擎&#xff0c;将专业医疗资源下沉至社区、企业、家庭&#xff0c;通过智能检测、精准分析、个性化干预&#xff0c;实现从疾病治疗到主动预防的健康…

[工作表控件19] 验证规则实战:如何用正则表达式规范业务输入?

在企业应用中,数据准确性至关重要。工作表控件通过“验证规则”能力,支持在文本字段和附件字段中使用正则表达式(RegEx)进行格式校验。它能帮助开发者轻松实现邮箱、身份证号、车牌号、URL 等格式的高效验证,大幅提升数据质量与表单使用体验。 一、官方功能介绍与基础能力…

uniapp分包实现

关于分包优化的说明 在对应平台的配置下添加"optimization":{"subPackages":true}开启分包优化 目前只支持mp-weixin、mp-qq、mp-baidu、mp-toutiao、mp-kuaishou的分包优化 分包优化具体逻辑&#xff1a; 静态文件&#xff1a;分包下支持 static 等静态…

ctfshow_web14------(PHP+switch case 穿透+SQL注入+文件读取)

题目&#xff1a;解释&#xff1a;$c intval($_GET[c]); //获取整数值 6sleep($c);//延迟执行当前脚本若干秒。提示一下哈没有break会接着执行下面的但是像是44444&#xff0c;555555,sleep的时间太久我们用3进入here_1s_your_f1ag.php是一个查询页面&#xff0c;sql注入查看源…

linux x86_64中打包qt

下载安装 地址: Releases linuxdeploy/linuxdeploy mv linuxdeploy-x86_64.AppImage linuxdeployqtchmod 777 linuxdeployqtsudo mv linuxdeployqt /usr/local/bin/linuxdeployqt --version报错 Applmage默认依赖FUSE&#xff0c;需要挂载自身为虚拟文件系统才能运行, ubuntu…

华为昇腾CANN开发实战:算子自定义与模型压缩技术指南

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;注册即送-H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 摘要 随着人工智能技术的飞速发展&#xff0c;越来越多…

Vue3源码reactivity响应式篇之reactive响应式对象的track与trigger

概览 在BaseReactiveHandler类的get方法中&#xff0c;有如下代码块if (!isReadonly2){track(target, "get", key);}&#xff0c;这表示通过reactive、shallowReactive创建的响应式对象&#xff0c;非只读的&#xff0c;当读取代理对象proxyTarget的某个属性key时&am…

VRRP 多节点工作原理

VRRP 多节点工作原理 基本概念 VRRP 的设计初衷是给一组节点提供一个 虚拟路由器&#xff0c;对外只表现出一个 VIP。协议规定&#xff1a;同一个 VRRP 实例 下始终只有 一个 Master 持有 VIP&#xff0c;其它全部是 Backup。 Master → 持有 VIP&#xff0c;负责转发流量到Mas…