Wireshark(五):TCP窗口与拥塞处理

原文出处: EMC中文支持论坛

TCP通过滑动窗口机制检测丢包,并在丢包发生时调整数据传输速率。滑动窗口机制利用数据接收端的接收窗口来控制数据流。

接收窗口值由数据接收端指定,以字节数形式存储于TCP报文头,并告知传输设备有多少数据将会存储在TCP缓冲区。缓冲区就是数据暂时放置的地方,
直至传递至应用层协议等待处理。因此,发送端每次只能发送Window
Size字段指定的数据量。为了使发送端继续传送数据,接收端必须发送确认信息:之前的数据接收到了。同时必须对占用缓冲区的数据进行处理以释放缓存空
间。下图显示了接收窗口是如何工作的:

上图中,客户端向服务器发送数据,服务器接收窗口是5000字节。客户端发送了2500字节,服务器缓冲区还剩2500字节,之后又发送了2000
字节,从而缓冲区只剩500字节。服务器发送确认信息。对缓存中数据进行处理并清空缓存。此过程重复进行,客户端又发送3000字节和1000字节,服务
器缓存减少至1000字节,客户端再次确认数据并处理缓存中内容。

更多信息

调整窗口大小:

当TCP堆
栈接收到数据的时候,生成一个确认信息并以回复的方式发送,但是放置在接收端缓存中的数据并不总是立即被处理。当服务器忙于处理从多个客户端接收的报文,

服务器很有可能因为清理缓存而变得缓慢,无法腾出空间接收新的数据,如果没有流控,则可能会造成丢包和数据损坏。好在,接收窗口所设定的速率无法使服务器
正常处理数据时,能够调整接收窗口大小。通过减小返回给发送端的ACK报文的TCP头窗口大小值来实现。如下图所示:

上图中,服务器初始窗口大小为5000字节。客户端发送2000字节,之后又发送了2000字节,缓冲区中只有1000字节可用。服务器意识到缓冲
区正在快速填满,它知道如果数据继续以此速率传输,很快会有报文丢失。为了防止报文丢失,服务器发送确认信息给客户端,更新窗口大小为1000字节。结
果,客户端减少数据发送,服务器以可以接受的速率处理缓存内容,即保持数据流以稳定的速率传输。

调整窗口大小在两个方向都是可行的。当服务器能够更加快速的处理报文时,它会发送一个较大窗口的ACK报文。

零窗口暂停数据流:

某些情况下,服务器无法再处理从客户端发送的数据。可能是由于内存不足,处理能力不够,或其他原因。这可能会造成数据被丢弃以及传输暂停,但接收窗口能够帮助减小负面影响。

当上述情况发生时,服务器会发送窗口为0的报文。当客户端接收到此报文时,它会暂停所有数据传输,但会保持与服务器的连接以传输探测(keep-
alive)报文。探测报文在客户端以稳定间隙发送,以查看服务器接收窗口状态。一旦服务器能够再次处理数据,将会返回非零值窗口大小,传输会恢复。下图
示例了零窗口通知过程。

服务器初始接收数据窗口为5000字节大小。从客户端接收4000字节数据之后,服务器负载变得非常繁重,无法继续处理客户端任何数据。服务器于是
发送窗口大小值为0的报文。客户端暂停数据传输并发送一个探测报文。探测报文之后,服务器回复以告知客户端现在可以接收数据的报文,以及窗口大小为
1000字节。客户端恢复传送数据。

TCP滑动窗口实战:

本例中,开始从192.168.0.20发送至192.168.0.30。我们关心的是窗口大小字段,可以从Packet List面板的Info栏以及Packet Details的TCP报文头看到。前三个报文后,可看到该值立刻减小,如下图所示:

窗口大小值从第一个报文的8760字节变成第二个报文的5840字节到第三个报文的2920字节①。窗口大小值的减小是主机延时的典型标志。在时间
栏注意到这一过程发生的非常迅速②。当窗口大小迅速减小的时候,通常就有可能下降为零。这就是第四个报文所发生的,如下图所示:

第四个报文从192.168.0.20发送至192.168.0.30,目的是告诉192.168.0.30它不再接收任何数据。0值见于TCP报
文头①,Wireshark的Packet List面板Info栏,以及TCP报文头的SEQ/ACK
Analysis字段②也告诉我们这是一个0窗口报文。

一旦发送了零窗口报文,192.168.0.30的设备不会再发送任何数据,直到收到从192.168.0.20的窗口更新,告知窗口大小已经增加了。本例中导致零窗口的问题是暂时的,所以在下一个报文中发送了窗口更新信息,如下图所示。

本例中,窗口大小增加到一个非常健康的数值64,240字节①。Wireshark再次在SEQ/ACK Analysis告诉我们这是一个窗口更新。

一旦收到更新报文,192.168.0.30的主机就再次开始发送数据,在报文6和报文7中。这一过程发生很快。如果它持续时间再长一点,就可能会导致网络的潜在中断,引起数据传输减慢或失败。

下一个关于滑动窗口的例子,第一个报文是正常HTTP,从195.81.202.68至172.31.136.85。此报文之后立刻跟随一个从172.31.136.85发送的零窗口报文,如下图所示:

这与上一个例子中的零窗口报文十分类似,但结果显著不同,172.31.136.85主机不是发送一个窗口更新并回复通讯,而是一个探测报文,如下图所示:

此报文被Wireshark标注为探测报文①。时间栏告诉我们这一报文发生于最后一个接收到的报文3.4秒之后。这一过程持续若干次,一端发送零窗口报文另一端发送探测报文,如下图所示:

探测报文发送间隙为3.4,6.8,13.5秒。这一过程可能会持续相当长一段时间,取决于通讯设备的操作系统。该情况下,把时间栏的值加起来,通讯暂停了25秒。

TCP差错控制和流控排查总结:

重传报文


传的发生是由于客户端检测到服务器没有接收到它所发送的数据。因此,取决于你所分析的是通讯的哪一端,有可能是看不见重传的。如果从服务器端抓取数据,并

且它确实没有接收到客户端所发送的和重传报文,可能会一无所获因为无法看见重传报文。如果怀疑并不是服务器端导致的报文丢失,可以考虑在客户端尝试抓取报
文,以查看实际是否有重传发生。

重复ACK

可以将重复ACK看作重传的“所谓相反面”,因为它是在服务器检测到客户端发送报文丢失的时候产生的。大多数情况下,在通讯两端抓取流量时都可以看
到重复ACK。需记住当接收报文乱序时会触发重复ACK。例如,如果服务器之接收到发送的第一个和第三个报文,就会导致发送重复ACK引起客户端对第二个
报文的快速重传,因为你已经收到了第一个和第三个报文,因此不管导致第二个报文丢弃的原因是什么,都很有可能是暂时的,因此大多数情况下重复ACK都会成
功发送和接收。当然,这种情形并不一定永远会发生,因此当你怀疑在服务器端丢失报文而又看不到任何重复ACK,考虑从通讯的客户端抓取报文。

零窗口和探测报文

滑动窗口直接与服务器无法接收和处理报文有关,任何窗口大小的缩小以及零值都是服务器问题的直接结果。所以如果你在哪里看到这两者之一发生,就应该在那里深入研究。通常应当在网络通讯两端一直主机窗口更新报文。

Wireshark(五):TCP窗口与拥塞处理,布布扣,bubuko.com

时间: 2024-08-03 13:40:28

Wireshark(五):TCP窗口与拥塞处理的相关文章

一站式学习Wireshark(五):TCP窗口与拥塞处理

TCP通过滑动窗口机制检测丢包,并在丢包发生时调整数据传输速率.滑动窗口机制利用数据接收端的接收窗口来控制数据流. 接收窗口值由数据接收端指定,以字节数形式存储于TCP报文头,并告知传输设备有多少数据将会存储在TCP缓冲区.缓冲区就是数据暂时放置的地方,直至传递至应用层协议等待处理.因此,发送端每次只能发送Window Size字段指定的数据量.为了使发送端继续传送数据,接收端必须发送确认信息:之前的数据接收到了.同时必须对占用缓冲区的数据进行处理以释放缓存空间.下图显示了接收窗口是如何工作的:

TCP数据量--滑动窗口、拥塞窗口、慢启动、Negle算法 经受时延的确认等

TCP的数据流大致可以分为两类,交互数据流与成块的数据流.交互数据流就是发送控制命令的数据流,比如relogin,telnet,ftp命令等等:成块数据流是用来发送数据的包,网络上大部分的TCP包都是这种包. 很明显,TCP在传输这两种类型的包时的效率是不一样的,因此为了提高TCP的传输效率,应该对这两种类型的包采用不同的算法. 总之,TCP的传输原则是尽量减少小分组传输的数量. TCP的交互式数据流 ?         经受时延的确认技术 TCP的交互式数据流通常使用"经过时延的确认"

TCP通过滑动窗口和拥塞窗口实现限流,能抵御ddos攻击吗

tcp可以通过滑动窗口和拥塞算法实现流量控制,限制上行和下行的流量,但是却不能抵御ddos攻击. 限流只是限制访问流量的大小,是无法区分正常流量和异常攻击流量的. 限流可以控制本软件或者应用的流量大小,从而减少对部署在相同物理机的其他应用的影响,减少物理网卡的流量占用. 如果部署在vm上的应用没有限流措施,那么这个应用有可能把整个物理机的网卡流量占满,这样部署在相同物理机的其他应用就不能服务了 参考: 1.https://www.zhihu.com/question/32255109 2.htt

如何利用wireshark对TCP消息进行分析

(1) 几个概念介绍 1 seq:数据段的序号,计算方法或者增长方式:seq2=seq1+len1(len仅仅是数据段的长度,不包括TCP头)(同一个发送方的tcp报文序号的计算方法) 2 ACK:确认号的计算方法,接收方的ACK号与发送方的SEQ和LEN之间的关系: 甲:发送"seq:x,len:y"给乙: 乙:回复的确认号,x+y,表示它收到了x+y之前的所有字节: 小结: 综合上面SEQ和ACK的计算,可以发现: (1)理论上,接收方回复的Ack恰好就等于发送方的下一个seq号:

[转]使用wireshark分析TCP/IP协议中TCP包头的格式

本文简单介绍了TCP面向连接理论知识,详细讲述了TCP报文各个字段含义,并从Wireshark俘获分组中选取TCP连接建立相关报文段进行分析. 一.概述 TCP是面向连接的可靠传输协议,两个进程互发数据之前需要建立连接,这里的连接只不过是端系统中分配的一些缓存和状态变量,中间的分组交换机不维护任何连接状态信息.连接建立整个过程如下(即三次握手协议): 首先,客户机发送一个特殊的TCP报文段: 其次,服务器用另一个特殊的TCP报文段来响应: 最后,客户机再用第三个特殊报文段作为响应. 图1 三次握

使用wireshark分析TCP/IP协议中TCP包头的格式

摘要:     本文简单介绍了TCP面向连接理论知识,详细讲述了TCP报文各个字段含义,并从Wireshark俘获分组中选取TCP连接建立相关报文段进行分析. 一.概述     TCP是面向连接的可靠传输协议,两个进程互发数据之前需要建立连接,这里的连接只不过是端系统中分配的一些缓存和状态变量,中间的分组交换机不维护任何连接状态信息.连接建立整个过程如下(即三次握手协议): 首先,客户机发送一个特殊的TCP报文段: 其次,服务器用另一个特殊的TCP报文段来响应: 最后,客户机再用第三个特殊报文段

TCP流量控制和拥塞避免

TCP的流量控制 所谓的流量控制就是让发送方的发送速率不要太快,让接收方来得及接受.利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制.TCP的窗口单位是字节,不是报文段,发送方的发送窗口不能超过接收方给出的接收窗口的数值. 如图所示,说明了利用可变窗口大小进行流量控制.设主机A向主机B发送数据.双方确定的窗口值是400.再设每一个报文段为100字节长,序号的初始值为seq=1,图中的箭头上面大写ACK,表示首部中的却认为为ACK,小写ack表示确认字段的值. 接收方的主机B进行了

从Wireshark看TCP连接的建立与断开

TCP是一种面向连接.可靠的协议.TCP连接的建立与断开,都是需要经过通信双方的协商.用一句话概括就是:三次握手say hello(建立连接):四次握手say goodbye(断开连接).要了解TCP连接的建立与断开,就不得不需要了解TCP头的内容.然而,TCP头及其复杂,概括而言,我们需要了解以下内容: Sequence Number(Seq):序号.表示一个TCP片段,用于保证数据没有丢失 Acknowledgment Number(Ack):确认号.用于表示希望从对方得到的下一个数据包的序

了不起的Node.js--之五 TCP连接

TCP连接 传输控制协议(TCP)是一个面向连接的协议,它保证了两台计算机之间数据传输的可靠性和顺序. TCP是一种传输层协议,它可以让你将数据从一台计算机完整有序地传输到另一台计算机. Node.js这个框架的出发点就是为了网络应用开发所设计的.如今,网络应用都是用TCP/IP协议进行通信的. Node Http服务器是构建于Node TCP服务器之上的.从编程角度来说,也就是Node中得http.Server继承自net.Server(net是TCP模块). TCP有哪些特性 TCP的首要特