tcp的无延时发送_每个开发者都应该知道的 TCP 知识点

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

通过TCP发送数据时,像HTTP一样,一个常见的误解是带宽与延迟无关。但是,对于TCP来说,带宽是延迟和时间的函数。我们来看看是怎么做到的。

握手

在客户端开始向服务器发送数据之前,它需要对TCP进行握手,对TLS进行另一个握手。

TCP使用三向握手来建立一个新的连接。

  1. 发送方选择一个随机生成的序列号 "x",并向接收方发送一个SYN数据包。

  2. 接收方递增 "x",选择一个随机生成的序列号 "y",然后发送一个SYN/ACK数据包。

  3. 发送方递增序列号并以ACK数据包和第一个字节的应用数据回复。

序列号被TCP用来确保数据按顺序和无漏洞地传送。

2f7ed775c64fcdfba466b75487320a26.png

握手引入了一个完整的往返,这取决于底层网络的延迟。TLS 握手也需要最多两次往返。在TLS连接打开之前,不能发送任何应用数据,这意味着在这之前,你的带宽是零。来回时间越低,建立连接的速度就越快。

流量控制

流量控制是一种回避机制,实现的目的是防止发送方压倒接收方。

接收方将传入的TCP数据包存储到一个接收缓冲区,等待应用程序处理。

930adf8308ee691ea367f7dc75d11e2b.png

每当接收方承认一个数据包时,接收方也会向发送方反馈缓冲区的大小。如果发送方尊重协议,发送方就会避免发送更多可以装入接收方缓冲区的数据。

ce0a7e7aaaa47d85bf01ba2b8fd94c4f.png

这种机制与应用层面的速率限制没有太大区别。但是,与API密钥或IP地址上的速率限制不同,TCP是在连接层面上的速率限制。

发送方和接收方之间的往返时间(RTT)越低,发送方就越快地将其输出带宽与接收方的容量相适应。

拥塞控制

TCP不仅要防止接收方不堪重负,还要防止底层网络被淹没。

发送方如何知道底层网络的可用带宽是多少?唯一的方法就是通过测量来估算。

其思路是,发送方维护一个所谓的 "拥塞窗口"。拥塞窗口代表了不等待对方的确认而可以发送的未发送数据包的总数。接收器窗口的大小限制了拥塞窗口的最大大小。拥塞窗口越小,在任何给定的时间内可以飞行的字节数就越少,带宽的利用率就越低。

当建立新连接时,拥塞窗口的大小被设置为系统默认值。然后,每承认一个数据包,窗口的大小就会成指数级地增加。这意味着,我们不能在建立连接后立即使用网络的全部容量。再次,来回时间越低,发送方就越能迅速开始利用底层网络的带宽。

efd33ec9df7bfca65b876e5c36ec5bbc.png

如果数据包丢失了怎么办?当发送方通过超时检测到漏报时,一个叫做 "拥塞避免 "的机制就会启动,拥塞窗口大小就会减小。从此以后,时间会使窗口大小增加一定的量,超时则会使窗口大小减少另一个。

如前所述,拥塞窗口的大小定义了无需等待确认就可以发送的最大比特数。而发送者需要等待一个完整的往返,才能得到一个确认。所以,将拥塞窗口的大小除以往返时间,就可以得到最大理论带宽。

8b68f72a05791736a899d887d8a194d8.png

这个简单的等式表明,带宽是延时的一个函数。TCP会非常努力地优化窗口大小,因为它对往返时间无能为力。但是,这并不总是能得到最佳配置。

总结一下,拥塞控制是一种自适应机制,用于推断网络的底层带宽和拥塞情况。类似的模式也可以应用在应用层面。想一想,当你在Netflix上看一部电影时,会发生什么?它开始模糊;然后,它会稳定到合理的程度,直到出现打嗝,质量再次恶化。这种应用于视频流媒体的机制被称为自适应比特率流媒体。

请记住这一点

如果你使用的是HTTP,那么你就得听从底层协议的安排。如果你不知道香肠是怎么做的,你就无法获得最好的性能。

突发请求会受到冷启动惩罚。使用TCP和TLS握手协议发送第一个字节可能需要多次往返。而且由于拥塞控制的工作方式,往返时间越低,底层网络的带宽利用得越好。

在这个问题上已经写了整整一本书,你可以做很多事情来榨取每一盎司的带宽。但是,如果你必须记住一件事,那就是关于TCP的事情。

你不能以光速发送数据,但你可以做的是把你的服务器放在离客户端更近的地方,并重复使用连接来避免冷启动惩罚。

如果你想了解更多关于网络是如何影响分布式系统的,请查看我即将上的视频课。

最后,别忘了点个在看。


作者:爱业星辰

图片:The Internet

欢迎大家点个在看,分享至朋友圈

看鸡汤不如看科普

f7238edf6e53fc78cdde3168dbb49c84.png

 怪兽的实验室

天才想法?,全在这里

来自【怪兽的实验室】的推荐阅读:

如何写出不一样的PHP? 2020-05-11 微服务入门所需了解的一切内容 2020-05-08 为什么服务有时会很慢? 2020-04-30 你可以成为没有开发人员的团队中的开发人员吗? 2020-04-27
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值