Building Blocks of TCP -- 题目怎么翻译呢? TCP构建块? 深入浅出TCP?认识TCP?TCP的构建?
---------------------------------------------------------------------------------------
第二章 Building Blocks of TCP
- RFC 791 -- Internet Protocol
- RFC 793 -- Transmission Control Protocol
三次握手
TCP快速打开TCP握手阶段已经被确认为总网页浏览时延的一个重要来源,很多程度上是由于,对于很多网页,它的几十到上百个子资源分布在不同的主机上,需要大量很短的TCP流来获取这些资源。TCP Fast Open是一个旨在减少新的TCP连接强加的延迟惩罚的机制。基于Google所做的流量分析和网络模拟,研究人员已经证明,TFO,它允许SYN报文携带数据,能够HTTP事务网络延迟降低15%,整个网页平均加载时间减少10%,在某些高延迟的场景甚至达到40%。在linux 3.7+ 内核中,客户端和服务器都可以获得TFO支持。花虽如此,TFO并不能解决所有问题。它可以帮助消除三次握手的往返惩罚,但它只能用于特定场景:SYN报文能够携带的数据有效载荷大小是有限制的,只能发送特定类型的HTTP请求,因为它需要一个加密的cookie,所以只能用于重复的连接。
拥塞避免和控制
拥塞控制是复杂网络中一个公认的问题。我们发现,当这两个协议,国防部的Internet Protocol(IP),一个纯粹的数据包协议,和传输控制协议(TCP),一个传输层协议,一起使用时,由于传输层和数据报层的交互,会引起不寻常的拥塞问题。尤其是,IP网关很容易发生“拥塞奔溃”现象,特别是在它连接到一个带宽差别很大的网络时。一旦往返时间超过了主机的最大传输间隔,主机就会开始发送越来越多的相同数据包的副本到网络中。现在网络就麻烦了。最终交换节点的可用缓冲将被填满,后面的包只能丢掉。被发送的数据包的往返时间现在达到了最大值。主机不断的重发数据包,最终,每一个包都有多个副本到达目标主机。这就是拥塞奔溃。这种情况是稳定的。一旦达到饱和点,如果挑选丢弃包的算法是公平的,网络将继续在退化状态下运行。-- John Nagle RFC896
ARPANET是现代互联网的先驱,是世界上第一个包交换网络。该项目正式启动于1969年,1983年,TCP/IP取代了早期的NCP,成为主要的通信协议。后来的事,便是总所周知的历史了。
流控制
$> sysctl net.ipv4.tcp_window_scaling
$> sysctl -w net.ipv4.tcp_window_scaling=1
慢启动
- 客户端和服务端接收窗口大小65,535字节(64KB)
- 初始拥塞窗口大小:4报文段 (RFC 2581)
- RTT: 56ms (伦敦到纽约)
慢启动重启
$> sysctl net.ipv4.tcp_slow_start_after_idle
$> sysctl -w net.ipv4.tcp_slow_start_after_idle=0
- RTT:56ms
- 带宽:5 Mbps
- 接收窗口大小: 65,535字节
- 初始拥塞窗口:4 segments(4x1460字节 = 5.7KB)
- 服务器处理时间:40ms
- 没有包丢失,一包一确认,GET请求位於单个报文段中
作为一个练习,把cwnd值设为10个报文段替换原来的4,然后在跑一遍 图 2-5。你应该会看大一个完整的RTT延迟消失了 -- 性能提升了22%!
拥塞避免
带宽延迟乘积(Bandwith-Delay Product)
队头阻塞 (Head-of-line blocking)
TCP的优化
- TCP三次握手引入一个完整的RTT延迟
- 每一个新的TCP连接都要经历慢启动
- 所有的TCP连接通过TCP流控制和拥塞控制来调节吞吐量
- TCP吞吐量由当前拥塞窗口大小决定
调整服务器配置
升级你的服务器版本,表面上,这看起来像个微不足道的建议。然而,实际中,这可能阻力重重:很多现行的服务器都针对特定内核版本做了优化,而且系统管理员也懒得去升级。公平而言,每一次升级都有风险,但为了获得最好的性能,这可能也是你能做的最好的投资。
调整应用程序行为
- 不发送数据才是最快的;尽量少发数据
- 我们不能使数据传输的更快,但我们可以使数据更近
- TCP连接重用是提升性能的关键
性能清单(checklist)
- 升级服务器内核到最新的版本
- 保证cwnd被设置为10
- 关闭空闲后慢启动
- 保证窗口伸缩选项是打开的
- 消除冗余数据传输
- 对传输数据进行压缩
- 把服务器部署在离用户近的地方以减少往返时间
- 尽可能重用TCP连接