前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >TCP速度慢?注意WS窗口因子~

TCP速度慢?注意WS窗口因子~

原创
作者头像
陈佳
修改于 2019-06-30 13:10:11
修改于 2019-06-30 13:10:11
9.7K0
举报
文章被收录于专栏:佳爷的专栏佳爷的专栏

【写在前面的话】

本文介绍一下Window Scaling的概念,以及配套的例子运用。转载请标明出处~~


【目录】

1、窗口因子介绍

2、案例介绍


什么是WS(window scaling)?

tpc有两个窗口,一个是滑动窗口,一个是拥塞窗口。WS与滑动窗口相关。通过增加一个因子来扩大默认滑动窗口的值。

滑动窗口的定义:收到ACK之前可以连续发送的字节数。举个例子,某接收端的窗口值假设为10240字节,假设发送端发的包每次都是1024字节大小,那么发送端可以连续发送10个包,而不需要收到接收端的ACK确认。

窗口大小占TCP头部16位,也就是窗口值最大能有:2^16=65535bytes=64K

65535字节到底有多大?在以前网速没有那么快的情况下是足够使用的,但是随着网速的不断提升,65535字节不够用了。

有个比喻叫填满水管(填网络链路)。自己按照理解画了张图。满打满算,水管的最大限度就是下图的矩形面积

有个计算方法: bandwidth * delay。带宽乘以延迟。

假设有两台主机连接在10Mbps的网络上,单程耗时是80ms。统一换算成字节。水管的面积就是:10,000,000bps/8bit*0.08秒=100,000bytes/s,也就是发送端可以连续发送100,000字节的数据给接收端。问题是刚才说了TCP的窗口大小最大只有65,535字节。也就是发送端尽全力发,最多也只有65,535字节可以发。

水管绿色部分就被浪费掉了。因此引入了WS,在tcp的option中增加16位作为滑动窗口因子window scaling。窗口值*窗口因子=最终的窗口值。但是并不是所有的客户端、服务端都支持窗口因子的。

为了更直观的看窗口因子,拿了两台服务器抓包。

【场景一】两端都支持窗口因子

窗口因子是在TCP三次握手时,SYN包进行同步的。

如上图,TCP第一个包:

10.123.4.10告诉10.123.4.4自己的窗口大小是29200,窗口因子是128。因此总大小是29200*128=3,737,600bytes这个值就远远大过默认的65,535bytes。

最底下的tcp option说明了窗口因子是7,2^7=128。这个128是算好了的,而且告诉你直接multiple 128。

TCP第二个包:

10.123.4.4告诉10.123.4.10,自己的窗口是28960,窗口因子是128。

【场景二】只有一端支持窗口因子

接下来我把10.123.4.4的窗口因子支持功能关闭。抓包如下:

还是一样,第一个包,10.123.4.10告知10.123.4.4自己的窗口大小是29200,同时窗口因子是128

第二个包,10.123.4.4告诉10.123.4.10,自己的窗口大小是28960,并没有什么窗口因子

第三个包,10.123.4.10也没有继续使用窗口因子了,最后红框可以看出(no window scaling used)

总结一下:

1、两端都支持,窗口因子才会最终被启用。如有一端不支持,则因子不会被使用。

2、窗口因子是在TCP的SYN包协商的,而且只协商一次。也就是滑动窗口是根据实际情况进行变化的,但是因子是固定的。


【一个案例】

用户访问源站速度正常,用户通过代理访问源站则速度慢

原因就在窗口因子上,代理和客户端本身支持窗口因子,但源站没有开启窗口因子协商。

在客户端直接访问源站的情况下,TCP三次握手情况如下,

客户端得知源站不支持窗口因子,于是接下来数据包的发送,滑动窗口的值就直接了当了。该给多少给多少。举个例子,原本客户端告知源站自己的窗口是1024,因子是1,总数就是1024*2^1=2048

但是从源站发回来的包得知源站并不支持因子,于是,接下来的包客户端在告知源站的时候,直截了当,窗口是2048。

客户端通过代理再去访问源站的情况如下:

客户端和代理都支持窗口因子,因此在step1的协商中,使用了窗口因子。且step1是优先于step2的。毕竟代理是先和客户端建联,然后在和源站建联。

但是在step2中,源站是不支持因子的,代理和源站之间协商的结果,没有使用窗口因子。

举个例子:

step1中,客户端告知代理,自己的win是1024,因子是1,总量就是1024*2^1=2048

step2中,代理告知源站一样的情况,win是1024,因子是1。但是源站不支持因子,于是就变成了,总量是1024。

于是,情况就变成了,前面的水管大,后面的水管小。整条链路上看,水管变小了。

【解决办法】

源站打开窗口因子的支持功能。

vim /etc/sysctl.conf

添加

net.ipv4.tcp_window_scaling = 1 #写入配置文件,永久生效

sysctl -p #立刻生效

sysctl -a | grep tcp_window #查看生效结果

参考资料:https://packetlife.net/blog/2010/aug/4/tcp-windows-and-window-scaling/

【后记】

江湖人称佳爷~~专注于解决公有云各类问题,喜欢讨论,欢迎来撩~~

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
TCP 滑动窗口 与窗口缩放因子
说道TCP滑动窗口协议,相信大家都很熟悉,但是说道 Window Scaling参数或许知道的和用过的人却不多,本文我们来谈谈Window Scaling的由来
加多
2018/12/21
3.7K0
TCP报文头部(sip协议端口号是tcp还是udp)
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说TCP报文头部(sip协议端口号是tcp还是udp),希望能够帮助大家进步!!!
Java架构师必看
2022/04/11
2.3K0
TCP报文头部(sip协议端口号是tcp还是udp)
TCP 常见故障排查
TCP 协议相当复杂,并充斥着各种细节。然而 TCP 协议又是如此重要的一个协议,引领风骚三十年,可以说是互联网的奇迹。这些细节正是 TCP 协议成功的原因,并值得我们深入了解。
poslua
2019/08/19
1.5K0
TCP 常见故障排查
1万字30张图说清TCP协议
TCP(Transmission Control Protocol 传输控制协议)是一种基于IP的传输层协议,TCP协议面向连接、正面确认与重传、缓冲机制、流量控制、差错控制、拥塞控制,可保证高可靠性(数据无丢失、数据无失序、数据无错误、数据无重复到达)传输层协议。
网络工程师笔记
2021/05/17
1.5K0
1万字30张图说清TCP协议
Windows TCP: TCP接收窗口自动调谐(Auto-Tuning)原理介绍
TCP连接上的吞吐量可以通过发送和接收应用程序、TCP的发送和接收实现以及TCP对等体之间的传输路径来限制。在本文我将介绍TCP接收窗口及其对TCP吞吐量的影响、TCP窗口扩展的使用以及Windows Vista和Windows Server 2008中新的接收窗口自动调整功能,这些功能可优化接收数据的TCP吞吐量。
云语科技
2018/04/01
4.4K0
Windows TCP: TCP接收窗口自动调谐(Auto-Tuning)原理介绍
TCP 滑动窗口原理解析
前些日子,在分享网络编程知识文章的时候,有个网友私信给我留言了一条“能不能写一篇关于 TCP 滑动窗口原理的文章”。
Java极客技术
2023/09/02
3900
TCP 滑动窗口原理解析
linux网络编程之TCP/IP基础(四):TCP连接的建立和断开、滑动窗口
s1mba
2018/01/03
2.4K0
linux网络编程之TCP/IP基础(四):TCP连接的建立和断开、滑动窗口
面试必备!TCP协议经典十五连问!
TCP协议是大厂面试必问的知识点。整理了15道非常经典的TCP面试题,希望大家都找到理想的offer呀
捡田螺的小男孩
2021/07/19
1.3K0
TCP协议的滑动窗口具体是怎样控制流量的?
TCP协议是互联网中广泛使用的传输层协议之一,用于可靠地传输数据。其中,滑动窗口是TCP协议中用于控制流量和实现可靠传输的重要机制。本文将介绍TCP协议中滑动窗口的原理,并解释滑动窗口如何控制流量的机制。
海拥
2023/06/27
8290
TCP协议的滑动窗口具体是怎样控制流量的?
TCP
学习 TCP 协议,首先第一个要了解当然是 TCP 连接是如何建立的,下面给大家介绍一下三次握手和四次挥手的过程以及为什么要这样设计。
IT技术小咖
2019/11/24
1.4K0
TCP协议:超时重传、流量控制、keep-alive和端口号,你真的了解吗?
在之前的讲解中,我们已经介绍了TCP协议的一些面试内容,相信大家对于TCP也有了一些新的了解。今天,我们将继续深入探讨TCP的超时重传、流量控制、TCP的keepalive机制以及端口号等相关信息。这些内容对于理解TCP协议的工作原理和实际应用非常重要,希望可以加深大家对TCP协议的理解。
努力的小雨
2024/01/17
6140
TCP 协议面试灵魂 12 问,问到你怀疑人生!
TCP 作为传输层的协议,是一个软件工程师素养的体现,也是面试中经常被问到的知识点。在此,我将 TCP 核心的一些问题梳理了一下,希望能帮到各位。
Bug开发工程师
2020/08/11
1.2K0
计网 - TCP 的稳定性:滑动窗口和流速控制是怎么回事?
Internet - TCP 的封包格式:TCP 为什么要粘包和拆包? 中提到了 TCP 利用发送字节数和接收字节数,这个二元组的唯一性保证顺序。
小小工匠
2021/08/17
4070
计网 - TCP 的稳定性:滑动窗口和流速控制是怎么回事?
tcp 与 udp的区别
3)4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节),所以TCP头部最大长度是15*4=60。
用户8418197
2022/02/17
8420
TCP窗口调整与数据流控制以及病态窗口症状
TCP协议主要依赖不断调整窗口大小来保证数据收发吞吐率。在三次握手时,客户端会告诉服务器自己一次能接收数据量的大小,这就对应客户端的接收窗口以及服务器的发送端口。同理服务器也会告知客户端它一次能接收的数据量,这就成为客户端的发送窗口以及服务器端的接收窗口。
望月从良
2019/10/23
9690
TCP窗口调整与数据流控制以及病态窗口症状
TCP通信机制:三次握手、四次挥手、滑动窗口
TCP在建立连接的时候需要进行三次握手(TCP握手时一定有SYN标志,不带SYN标志的为建立连接后的正常数据传输)
mindtechnist
2024/12/06
5530
TCP通信机制:三次握手、四次挥手、滑动窗口
TCP之拥塞窗口
一个连接的TCP双端只是网络最边缘的两台主机,他们不知道整个网络是如何工作的,因此他们不知道彼此之间的有效吞吐量。因此,他们必须找到一种方法来确定它。我们称之为拥塞窗口 (CWND)。这是在我们必须停止并等待确认之前可以发送的字节数。
高性能架构探索
2021/08/06
4.1K0
Linux网络UDP与TCP
端口号(Port)标识了一个主机上进行通信的不同的应用程序; 在 TCP/IP 协议中, 用 “源 IP”, “源端口号”, “目的 IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过 netstat -n 查看);
有礼貌的灰绅士
2025/04/21
1830
Linux网络UDP与TCP
《编程千问》第十一问:TCP的窗口机制是什么?
TCP的窗口机制(Window Mechanism)是其实现流量控制和拥塞控制的重要机制之一,主要通过动态调整发送和接收双方的通信速率,确保数据传输的高效性和可靠性。窗口机制涉及的核心概念包括滑动窗口、接收窗口(rwnd)和拥塞窗口(cwnd)。
码事漫谈
2024/12/20
1300
《编程千问》第十一问:TCP的窗口机制是什么?
常见面试题:TCP的四次挥手和TCP的滑动窗口
挥手即终止 TCP 连接,所谓的四次挥手就是指断开一个 TCP 连接时。需要客户端和服务端总共发出四个包,已确认连接的断开在 socket 编程中,这一过程由客户端或服务端任意一方执行 close 来触发。这里我们假设由客户端主动触发 close。四次挥手的流程如图:
程序员波特
2024/02/20
2970
常见面试题:TCP的四次挥手和TCP的滑动窗口
相关推荐
TCP 滑动窗口 与窗口缩放因子
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档