tcp序列号为什么是随机的_每个开发人员都应该掌握的TCP知识
为什么需要将服务器在地理位置上靠近用户? 原因之一是获得较低的延迟。 当您发送应尽快传送的短数据突发时,这很有意义。 但是,大文件(例如视频)呢? 接收第一个字节肯定会带来延迟损失,但是在那之后难道不是一帆风顺吗?
通过TCP(例如HTTP)发送数据时,常见的误解是带宽与延迟无关。 但是,对于TCP,带宽是延迟和时间的函数。 让我们看看如何。
握手
在客户端可以开始向服务器发送数据之前,它需要为TCP执行一次握手,为TLS执行一次握手。
TCP使用三向握手来创建新连接。
· 发送方选择一个随机生成的序列号" x",并将SYN数据包发送给接收方。
· 接收器递增" x",选择一个随机生成的序列号" y",然后发回SYN / ACK数据包。
· 发送方增加序列号,并用ACK数据包和应用程序数据的第一个字节进行回复。
TCP使用序列号来确保按顺序传送数据且没有空洞。
握手会引入完整的往返,这取决于基础网络的延迟。 TLS握手也最多需要两次往返。 在TLS连接打开之前,无法发送任何应用程序数据,这意味着在此之前您的带宽出于所有目的和目的均为零。 往返时间越短,建立连接的速度就越快。
流量控制
流控制是一种退避机制,旨在防止发送方压倒接收方。
接收器将等待应用程序处理的传入TCP数据包存储到接收缓冲区中。
每当接收方确认数据包时,接收方还将其大小发送回发送方。 如果发件人遵守协议,则应避免发送更多可能容纳在收件人缓冲区中的数据。
此机制与应用程序级别的速率限制不太相似。 但是,TCP不是在API密钥或IP地址上进行速率限制,而是在连接级别上进行速率限制。
发送方和接收方之间的往返时间(RTT)越短,发送方将其出站带宽调整到接收方容量的速度就越快。
拥塞控制
TCP不仅可以防止接收器不堪重负,还可以防止淹没底层网络。
发送者如何找出底层网络的可用带宽是多少? 估计它的唯一方法是根据经验进行测量。
这个想法是发送者维护一个所谓的"拥塞窗口"。 该窗口表示无需等待对方的确认就可以发送的未完成数据包的总数。 接收器窗口的大小限制了拥塞窗口的最大大小。 拥塞窗口越小,在任何给定时间可以传输的字节越少,并且占用的带宽越少。
建立新连接后,拥塞窗口的大小将设置为系统默认值。 然后,对于每个确认的数据包,该窗口的大小都会成倍增加。 这意味着建立连接后,我们无法立即使用网络的全部容量。 同样,往返时间越短,发件人就可以越快地开始利用基础网络的带宽。
如果丢包怎么办? 当发件人通过超时检测到错过的确认时,就会启动一种称为"避免拥塞"的机制,从而减小拥塞窗口的大小。 从那时起,时间将窗口大小增加了一定数量,而超时又将窗口大小减少了一些。
如前所述,拥塞窗口的大小定义了无需等待确认即可发送的最大位数。 发件人需要等待完整的往返行程才能获得确认。 因此,通过将拥塞窗口的大小除以往返时间,可以得到最大的理论带宽:
这个简单的方程式表明带宽是等待时间的函数。 TCP会尽力优化窗口大小,因为它无法解决往返时间。 但是,这并不总是能产生最佳配置。
总之,拥塞控制是一种自适应机制,用于推断网络的基础带宽和拥塞。 类似的模式也可以应用于应用程序级别。 想一想当您在Netflix上观看电影时会发生什么。 开始模糊; 然后,它会稳定到合理的水平,直到出现打ic为止,然后质量再次变差。 应用于视频流的这种机制称为自适应比特率流。
记住这一点
如果您使用的是HTTP,那么您将受基础协议的约束。 如果您不知道香肠的制作方法,就无法获得最佳性能。
突发请求受到冷启动惩罚。 可能需要多次往返,才能发送带有TCP和TLS握手的第一个字节。 而且由于拥塞控制的工作方式,往返时间越短,底层网络的带宽利用就越好。
关于此主题的所有书籍都已经写好了,您可以做很多事情来压缩每一盎司的带宽。 但是,如果您必须记住关于TCP的一件事,那就这样:
您发送数据的速度不能超过光速,但是您可以做的是使服务器离客户端更近,并重新使用连接以避免冷启动的代价。
(本文翻译自Roberto Vitillo的文章《What every developer should know about TCP》,参考:https://medium.com/swlh/what-every-developer-should-know-about-tcp-755ece34f13b)
tcp序列号为什么是随机的_每个开发人员都应该掌握的TCP知识相关推荐
- tcp序列号为什么是随机的_译文:每个开发人员应了解的 TCP 知识
为什么要把服务器放在离用户很近的地理位置上?其中一个原因是为了实现更低的延迟.当您发送的数据是短的.应该尽可能快的传输数据时,这很有意义.但如果是大文件,比如视频等大文件呢?当然,在接收第一个字节时肯 ...
- 后端开发除了编码还要做什么_每个开发人员都应掌握的基本技能(除了编码)
后端开发除了编码还要做什么 Whether you are learning to code, looking for a new job, or just want to improve your ...
- 如何成为一个区块链开发人员_成为开发人员是社会工作
如何成为一个区块链开发人员 Times have changed since the old days when an IT professional was this typical shy per ...
- delphi5开发人员指南_建立开发人员职位的黄金指南
delphi5开发人员指南 Landing a software engineering position can be one of the most difficult obstacles tha ...
- java相关段子_为什么Java开发人员都带眼镜 | 程序员搞笑段子合集
劳工节小长假愉快! Enjoy! 01 如何区分HTML和HTML5? 用IE打开,打不开吗?那就是HTML5没错了. 02 程序员为什么放弃斗争呢? 因为他没有兵(array)啊. 03 数据库SQ ...
- tcp序列号为什么是随机的_TCP学习笔记
TCP:传输控制协议.是一种面向连接的协议,提供可靠的双全工的字节流,TCP套接口是流套接口的一种,关心确认.超时和重传等具体细节. TCP提供客户和服务器连接,跨该连接与服务器交互数据.提供可靠的双 ...
- 知不足者好学耻下问者自满_对抗开发人员自满情绪的有效方法
知不足者好学耻下问者自满 We've all been there at some point. You're working on a project or a bug and suddenly h ...
- 大学可以学前端开发_所有开发人员在大学中应该学习的东西
大学可以学前端开发 忘记"代码行" (Forget About "Lines of Code") Source 资源 As a developer, you'l ...
- 利益相关者软件工程_改善开发人员团队与非技术利益相关者之间交流的方法
利益相关者软件工程 Whether you're working on a startup or a big company, keeping your stakeholders and non-te ...
最新文章
- Android客户端捕获http请求包的方法
- 基于Coravel定时任务之计算总页数
- 实例使用pyhanlp创建中文词云
- 用Unity实现游戏弹反效果
- 求教PHP+oracle的开发
- 记录一次HBase的scan的分页查询
- 图片安全检测和数据跨境复制,规避违规风险
- hdu-5867 Water problem(水题)
- vue路由1:基本使用
- 拉普拉斯算子_图机器学习图拉普拉斯算子的离散正则性,141页ppt,Discrete regularity graph Laplacians...
- (2)从文件中解析JSON数据
- 浏览器中performance的基本使用
- 解决wps公式编辑器上移情况
- python扫描局域网端口和ip_如何高效实现扫描局域网IP、主机名、MAC和端口
- 图解机器学习神器:Scikit-Learn
- 时空超分辨论文阅读笔记(一)---- Zooming Slow-Mo
- 【ZZULIOJ】1092: 素数表(函数专题)
- 新人爬虫学习_爬取腾讯招聘信息
- 题都城南庄---中华诗词-唐五代-崔护
- 异贝,通过移动互联网技术,为中小微实体企业联盟、线上链接、线上线下自定义营销方案推送。案例60
热门文章
- tvpvar模型的建模步骤_风控建模六部曲
- python输出word内容_Django输出word文件(.doc),只在内容中显示原始html
- java 静态分派_Java中的静态分派与动态分派
- java session丢失_跨域造成session丢失
- 安装百分之80卡住_石家庄铜铝80*80散热器品牌
- 服务器脚本执行sql文件命令行,sh命令执行sql脚本
- logic多分类的两种类别
- python pandas for循环_python – 将一个for循环应用于Pandas中的多个DataFrame
- python numpy官网_Python Numpy 教程(上)
- 天翼云从业认证(4.12) 天翼云医疗行业解决方案