| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> 网络协议 -> TCP拥塞控制及其缺点 与 基于UDP应用层自定义可靠有连接协议 -> 正文阅读 |
|
|
[网络协议]TCP拥塞控制及其缺点 与 基于UDP应用层自定义可靠有连接协议 |
|
? ? 本文前半部分为计算机网络课程最后一节课学习内容的课堂笔记,后半部分为结合最近碰巧学习了解应用层网络协议时了解到的一些内容总结到此处。阅读本文需要了解 TCP 协议与 UDP 协议的区别,了解网络五层模型,复习一般 TCP congestion control 流程(本文着重解释回顾)。阅读完后将会了解?TCP 协议的缺点不足以及一些用户态自定义协议的动机。 Congestion Control 和为什么简单的算法能工作
TCP congestion control 算法? ? 三种算法 Taho TCP, Reno TCP, and New Reno TCP. 这里针对基本的相同部分解释几个要点,一个是为什么会有 dupACK,这是因为接收方不断接受到新的包但是却缺少某个顺序中前面的包,所以无法发行新编号的 ACK 而要发送未收到的那个包。然而 TCP 已经发送过未收到的那个包,timer 还在倒计时。time-out 或者收到3个 dupACK 说明丢包,网络可能拥塞了(之后否定这条)。 ? ? 普通 Taho TCP 的状态机
? ? Reno TCP 讲解
? ? 我就具体讲这个 Reno TCP 吧, 也就是课上老师讲解的. 首先注意 cwnd 的单位是 MSS 最大报文段长度,然后 cwnd + 1 的意思是一个 RTT 加1,而一次发 n 个包,?ACK n 个包则加 n,所以是翻倍。
? ? 再看一下 cwnd (congestion control window) 的调整趋势图:
? ? 然后再改进的话还有方法就是上文中 more than one lost 的情况, 这里我不探讨了. 有时间看一下文字补充一下吧…但是实际上, 在高速网络上, 由于他这个拥塞避免下太保守了, 就还提出了 CUBIC 和 BIC 算法, Linux 一般用 Reno, Windows 下用的默认是 CUBIC, 还有 new Reno 以及一些其他的没学过的. 后续网络课程持续学习,可以基于 UDP 编写一个用户态网络栈。 BBR 算法
应用层传输协议? ? 应用层有很多其他基于 UDP 的协议。比如 KCP,google 的 QUIC(同时使用了 BBR 算法 congestion control)。首先明确时间上是先开发的特色 TCP 再开发的 UDP,所以没有把 TCP 基于 UDP 上来实现继承“超集”关系,这个和 C/C++ 关系不一样。 ? ? 参考一些网络内容:
? ? 为什么要做这个的总结:(部分论述收集自网络) ? ? why UDP? ? 最本质上UDP的优势还是带宽的利用。这一切要回归到99~03年的网络状况,当时网络的特点就是接入带宽很窄而且抖动特别厉害。所谓抖动可能是多方面的,例如延时突发性地暴增、也有可能是由于路由层面的变化突然导致路由黑洞,还各种等等等等的问题。TCP因为拥塞控制、保证有序等原因,在这种网络状态上对带宽的利用是非常低的。而且因为网络抖动的原因,应用层心跳超时(一般不依靠keepalive)应用层主动断掉socket之后TCP需要三次握手才能重新建立链接,一旦出现频繁的小抖动就会使得带宽利用更低。而等待四次挥手的时间,也会占用服务器上宝贵的资源。总结来说,当网络差到一定程度了,TCP的优势反而会成为劣势。 ? ? 信道质量判据不实:? ? tcp设计的时候,就把丢包 (time-out) 这个现象,认为是网络堵塞,从而作出降低发送频率等减缓网络带宽占用的行为;然而,无线网络下,丢包并不代表网络堵塞或带宽不够,所以tcp不能充分利用无线带宽,导致游戏的延迟不必要的增加。实例说明:TCP丢包时会退避,然后就会超时。但是,在中国丢包往往是因为ISP的路由器丢你的包,而不是你本地带宽不足(回想TCP Congestion Control是分布式算法自己控制自己端)。对于ISP这种行为,对用户最有利的解决办法应该是暴力重发,抢占更多带宽,而不是主动退避嘛。当然如果实际 time-out 真的是发送 congestion 了,那么可以选择 fallback 到 tcp 利用 tcp 的 congestion control。 ? ? 重复校验成本? ? tcp本身不错,简化了研发和维护,但是因为需要握手和维护长链接,协议本身开销比较大,对于海量用户服务来说就是成本,而且tcp虽然有数据校验,但是并不能保证数据传输的绝对正确,所以应用还是需要自己有校验,于是又有额外开销,比如魔兽每个数据包都是自带crc校验。另外协议成本导致tcp协议因为维护数据完整性时,实时性比udp要差那么点。 ? ? 不必要的重传? ??网络游戏的环境下,部分丢包是可以接受的。我接受最新的数据包即可,对于固定刷新每次更新完整所有玩家信息的游戏来说,即使少量丢失和错误的包出现,并不需要被重发,只需要在下一次数据来时更新(玩家位置动作状态等)即可,如果条件恶劣,只要安排关键数据重发,非常灵活,很适合fps。即重传和排序不是非常必要的。 ? ? 不可控的重传? ? 在网络不好时,TCP会尝试多次重传,多次重传还是 Time-out(没有收到 SYN/ACK)或者收到服务器的RST reset 指令, 应用层会收到一个TCP错误,用UDP则会在沉默中丢失数据。而应用层重发请求常常导致服务器重复多次处理相同请求的bug(只是回信道出问题)。 |
|
|
| 网络协议 最新文章 |
| 使用Easyswoole 搭建简单的Websoket服务 |
| 常见的数据通信方式有哪些? |
| Openssl 1024bit RSA算法---公私钥获取和处 |
| HTTPS协议的密钥交换流程 |
| 《小白WEB安全入门》03. 漏洞篇 |
| HttpRunner4.x 安装与使用 |
| 2021-07-04 |
| 手写RPC学习笔记 |
| K8S高可用版本部署 |
| mySQL计算IP地址范围 |
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年11日历 | -2025/11/23 8:33:11- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |