TCP报文窗口字段介绍

在TCP报文头部,有一个16比特的窗口字段,用来表示接受方的缓冲区大小,发送方可以根据这个值的大小来调节发送的数据量,从而起到流控的目的。

443a143303a298c130b545dc84ab6fb9.png

TCP的流量控制由连接的每一端通过声明的窗口大小来提供 。窗口大小为字节数 ,起始于确认序号字段指明的值,这个值是接收端期望接收的字节。窗口大小是一个16 bit字段,因而窗口大小最大为65535字节。

窗口大小对性能的影响

TCP基于通告窗口大小的机制,运行发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。TCP传输速率和窗口大小成正相关,在某些情况下,提高窗口大小能够提高传输速率。但TCP窗口大小只有16bit,最大表示65535字节,对当前千兆接口已经是标配,在数据中心对服务器上开始部署10G接口的现实情况下,65535字节的窗口显然是不够的。

窗口扩大因子

TCP头部的最后一个选项字段(options)是可变长的可选信息。这部分最多包含40字节。RFC 7323 TCP Extension for High Performance中对相关选项进行了详细介绍,更详细信息可参考这个文档。

9e727dc51179d64cb57b91b1d185ec13.png

常见对TCP选项有7种,其中kind=3是窗口扩大因子选项。TCP连接初始化时,通信双方使用该选项来协商接收通过的窗口扩大因子。假设TCP头部中的通告窗口大小为N,窗口扩大因子(位移数)是M,那么TCP报文段的实际接收通告窗口大小为:N * (2 ** M)。M的取值范围为0 ~ 14。这样的话,通告窗口最大约为1GB,能够满足大部分应用的需求。

Linux下如何使能窗口扩大因子

从Linux内核2.6.8以后,TCP窗口扩大因子功能缺省是使能的。可以通过下面的命令来查看和设置:

cat /proc/sys/net/ipv4/tcp_window_scaling

echo "1" > /proc/sys/net/ipv4/tcp_window_scaling

参考资料

TCP/IP详解,卷一,第1版

RFC 7323 TCP Extension for High Performance

欢迎关注个人公众号

501639.html

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐