为什么需要将服务器在地理位置上靠近用户? 原因之一是获得较低的延迟。 当您发送应尽快传送的短数据突发时,这很有意义。 但是,大文件(例如视频)呢? 接收第一个字节肯定会带来延迟损失,但是在那之后难道不是一帆风顺吗?

通过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知识相关推荐

  1. tcp序列号为什么是随机的_译文:每个开发人员应了解的 TCP 知识

    为什么要把服务器放在离用户很近的地理位置上?其中一个原因是为了实现更低的延迟.当您发送的数据是短的.应该尽可能快的传输数据时,这很有意义.但如果是大文件,比如视频等大文件呢?当然,在接收第一个字节时肯 ...

  2. 后端开发除了编码还要做什么_每个开发人员都应掌握的基本技能(除了编码)

    后端开发除了编码还要做什么 Whether you are learning to code, looking for a new job, or just want to improve your ...

  3. 如何成为一个区块链开发人员_成为开发人员是社会工作

    如何成为一个区块链开发人员 Times have changed since the old days when an IT professional was this typical shy per ...

  4. delphi5开发人员指南_建立开发人员职位的黄金指南

    delphi5开发人员指南 Landing a software engineering position can be one of the most difficult obstacles tha ...

  5. java相关段子_为什么Java开发人员都带眼镜 | 程序员搞笑段子合集

    劳工节小长假愉快! Enjoy! 01 如何区分HTML和HTML5? 用IE打开,打不开吗?那就是HTML5没错了. 02 程序员为什么放弃斗争呢? 因为他没有兵(array)啊. 03 数据库SQ ...

  6. tcp序列号为什么是随机的_TCP学习笔记

    TCP:传输控制协议.是一种面向连接的协议,提供可靠的双全工的字节流,TCP套接口是流套接口的一种,关心确认.超时和重传等具体细节. TCP提供客户和服务器连接,跨该连接与服务器交互数据.提供可靠的双 ...

  7. 知不足者好学耻下问者自满_对抗开发人员自满情绪的有效方法

    知不足者好学耻下问者自满 We've all been there at some point. You're working on a project or a bug and suddenly h ...

  8. 大学可以学前端开发_所有开发人员在大学中应该学习的东西

    大学可以学前端开发 忘记"代码行" (Forget About "Lines of Code") Source 资源 As a developer, you'l ...

  9. 利益相关者软件工程_改善开发人员团队与非技术利益相关者之间交流的方法

    利益相关者软件工程 Whether you're working on a startup or a big company, keeping your stakeholders and non-te ...

最新文章

  1. Android客户端捕获http请求包的方法
  2. 基于Coravel定时任务之计算总页数
  3. 实例使用pyhanlp创建中文词云
  4. 用Unity实现游戏弹反效果
  5. 求教PHP+oracle的开发
  6. 记录一次HBase的scan的分页查询
  7. 图片安全检测和数据跨境复制,规避违规风险
  8. hdu-5867 Water problem(水题)
  9. vue路由1:基本使用
  10. 拉普拉斯算子_图机器学习图拉普拉斯算子的离散正则性,141页ppt,Discrete regularity graph Laplacians...
  11. (2)从文件中解析JSON数据
  12. 浏览器中performance的基本使用
  13. 解决wps公式编辑器上移情况
  14. python扫描局域网端口和ip_如何高效实现扫描局域网IP、主机名、MAC和端口
  15. 图解机器学习神器:Scikit-Learn
  16. 时空超分辨论文阅读笔记(一)---- Zooming Slow-Mo
  17. 【ZZULIOJ】1092: 素数表(函数专题)
  18. 新人爬虫学习_爬取腾讯招聘信息
  19. 题都城南庄---中华诗词-唐五代-崔护
  20. 异贝,通过移动互联网技术,为中小微实体企业联盟、线上链接、线上线下自定义营销方案推送。案例60

热门文章

  1. tvpvar模型的建模步骤_风控建模六部曲
  2. python输出word内容_Django输出word文件(.doc),只在内容中显示原始html
  3. java 静态分派_Java中的静态分派与动态分派
  4. java session丢失_跨域造成session丢失
  5. 安装百分之80卡住_石家庄铜铝80*80散热器品牌
  6. 服务器脚本执行sql文件命令行,sh命令执行sql脚本
  7. logic多分类的两种类别
  8. python pandas for循环_python – 将一个for循环应用于Pandas中的多个DataFrame
  9. python numpy官网_Python Numpy 教程(上)
  10. 天翼云从业认证(4.12) 天翼云医疗行业解决方案