浅谈TCP的窗口字段

该掸掸这里的灰尘了,写一篇关于TCP的文章吧。今天的主题是TCP的滑动窗口。在开始这个话题之前,我想先提几个关于TCP协议的常见误区。

误区1:TCP协议三次握手过程中后两个包都是[ACK]包。

解释:这种说法并不错,只是不严谨。首先,第一个包是[SYN],SYN位在TCP报头flag字段中,见上图TCP报头结构。第二个包更确切地说应该叫[SYN,ACK]包,因为除了ACK位被置位以外,SYN位也被置位了。第三个包才是单纯的ACK包,因为只有ACK位被置位。所以三次握手的过程为:

客户端----[SYN]------------------>>>服务器

客户端<<<-------------[SYN,ACK]---服务器

客户端----[ACK]------------------>>>服务器

有一种非常经典的攻击叫SYN Flood攻击,是DDOS攻击的一种,方法是客户端发送多个SYN包请求但是不回复第三个ACK包以占用服务器有限的资源。

误区2:TCP数据传输过程中,序列号增长的单元是包的个数。

解释:这是初学者最常犯的一个错误,原因是绝大多数老师为了方便学生理解,刚开始举例子时序列号都是+1地往上增。其实不然。序列号增长的单元是包应用层数据(也叫Payload)的字节数。

举个栗子:

假如某一个数据包序列号:1000,Payload长度500。那么下一个包的序列号就是1500。

误区3:对于TCP连接的收发双方,序列号都会增长。

解释:对于多数应用(HTTP,Telnet),收发双方都存在数据的发送,那么收发双方的序列号都会增长,而对于FTP这样的应用,在数据通道中,只是某一方在传输数据(上传或下载),那么另一方只是在扮演简单确认的角色,在这种情况下,另一方的序列号并不会增长。

说了这么多,现在开始进入正题,来聊聊TCP的窗口机制,这是理解TCP协议的一个关键点。

1. 大家都知道TCP和UDP的区别是,TCP是基于连接的(三次握手),而且TCP数据的传输是可靠的,所谓可靠是依托序列号及确认号机制让TCP的传输过程中即使出现丢包也会重传。

2. 但是TCP的确认机制也让TCP连接双方的数据传输速度变慢,也就是说,一方发送数据需要等待对方的确认才继续发送后续数据。这就体现的窗口机制的作用,所谓窗口,也就是充分利用双方的带宽及缓冲区(Buffer)。举个栗子,发送方不必等待对方的确认,可以连续发送多个数据包给对方,而对方可以暂时把这些数据包存放在缓冲区,这样,可以大大增加数据传输的速度。

3. 这样做的问题是一旦当接收方的缓冲区填满或即将填满时,就会产生不堪重负的情况,那么这就需要TCP窗口的实时更新机制,举个栗子,接收方窗口大小设置的是50000,也就是说发送方可以不必等待确认而一次性发送50000字节的数据,一旦接收方意识到不看重负的情况,可以发送窗口更新通知告诉发送方,现在的窗口大小是30000,请减少一次性发送数据的字节数。某些极端情况,接收方的Buffer完全填满,这时,会发送ZeroWindowSize通知,让发送方暂时停止数据传输,并等待下一个确认通知。

下面我们来看看抓包中是如何体现窗口的特征的:

上图是抓包工具抓到的一个ACK包的头部信息,可以看出其windowsize的值是最大值,因为16bit的字段最大取值就是65535。红框中下面那一行可能会让大家疑惑。为什么会有一个Calculatedwindow size呢?下面我们就来看一个TCP的选项:TCP Windows Size Scaling。

1. 既然是选项,那么毫无疑问需要体现在上图TCP报头的选项(Options)字段。

2. 接下来我们再看一张抓包的截图:

这张图中我们可以看到,windows size的值是114,但是CalculatedWindows Size的值却是14572,这是怎么回事呢?

3. 在TCP三次握手过程中,可以通过SYN包开启TCP选项Window Size Scaling,设计出这个选项是因为如今的带宽已经大规模提升,千兆到桌面也是一件常事儿,因此,65535长度的窗口大小已经显得有些小了,为了突破这个限制,便有了WindowSize Scaling选项,看下图SYN包截图:

可以看到这个字段的值为7,也就是要将WindowSize的左移七位,即乘以128,因此,上图中我们看到windowsize值是114,但是真正选用的值却是14572(114*128)。

时间: 2024-08-24 13:26:03

浅谈TCP的窗口字段的相关文章

( 转)浅谈QT中窗口刷新事件

浅谈QT中窗口刷新事件 [日期:2011-06-25] 来源:Linux社区  作者:袁硕 [字体:大 中 小] 经过一个星期的项目初步开发,写此文就开发时遇到的一些常见问题,给出些资料和自己的观点,希望能给其他的初学者或者参赛的选手一点帮助,当然,也算是一种抛砖引玉,大家有什么好的技巧经验什么的,也能多多分享,借助这次比赛,我们共同进步~ 如果大家都是跟我一样,刚刚开始接触QT,开始开发QT的程序,肯定也会有很多不习惯的地方,今天我重点想谈的就是这么一个不习惯的地方——QT中窗口刷新事件. 对

浅谈TCP/IP网络编程中socket的行为

我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: . TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) . Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为. . 编写Performant, Scalable的服务器程序.包括多线程.IO Multiplexing.非阻塞.异步等各种技术. 关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illust

浅谈TCP协议(建立与断开连接)

TCP是面向连接的,可靠的进程到进程通信的协议.TCP提供全双工服务,即数据可在同一时间双向传输,每一个TCP都有发送缓存,用来临时存储数据.TCP将若干个字节构成一个分组,成为报文段(segment)TCP报文段封装在IP数据报中:TCP报文段的首部格式如图:首部长度为20--60字节,源端口号:他是16位字段,为发送方进程对应的端口号.目标端口号:他是16位字段,对应的是接收端的进程,接收端收到数据段后,根据这个端口号来确定把数据送给那个应用程序的进程.序号:当TCP从进程接收数据字节时,就

浅谈TCP/IP协议

一.简介 TCP/IP协议是供已连接因特网的计算机进行通信的通信协议.TCP/IP协议,并不是指单TCP.IP协议两个.而是一个协议栈.包含了诸如:TCP.IP.UDP.ICMP.RIP.TELNETFTP.SMTP.ARP.TFTP等许多协议. 二.参考模型 TCP/IP参考模型 应用层 传输层 网络层 链路层 三.工作机制 TCP/IP 意味着 TCP 和 IP 在一起协同工作. TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信. IP 负责计算机之间的通信. TCP 负责将数据分

浅谈TCP拥塞控制算法

TCP通过维护一个拥塞窗口来进行拥塞控制,拥塞控制的原则是,只要网络中没有出现拥塞,拥塞窗口的值就可以再增大一些,以便把更多的数据包发送出去,但只要网络出现拥塞,拥塞窗口的值就应该减小一些,以减少注入到网络中的数据包数. TCP拥塞控制算法发展的过程中出现了如下几种不同的思路: 基于丢包的拥塞控制:将丢包视为出现拥塞,采取缓慢探测的方式,逐渐增大拥塞窗口,当出现丢包时,将拥塞窗口减小,如Reno.Cubic等. 基于时延的拥塞控制:将时延增加视为出现拥塞,延时增加时增大拥塞窗口,延时减小时减小拥

浅谈TCP IP协议栈(四)IP协议解析

通过之前的网络层基础知识,IP地址以及路由器的简介,大家应该对于TCP/IP有一个大致的了解,在脑海里应该对于网络的几个基础概念有个大概的了解,简单点说整个协议栈就是在做一件事,规定网络报文(网络传输中的数据报)的发送和接收,而整个协议栈内的协议,也是可以分为之前介绍过的链路层->网络层->传输层->应用层,在这每一层中都有很多不同的协议,但是最常用的协议,每一层就是一到两种,所以想学协议,先从每一层最常见,最常用的开始学起: 链路层--以太网.VLAN 网络层--IP协议 传输层--T

浅谈 TCP 三次握手

三次握手(three times handshake:three-way handshake)所谓的"三次握手"即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送.接收完毕后何时撤消联系,并建立虚连接. 在 TCP/IP 协议中,TCP 协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服务器确认: 第二次握手:服务器

Linux网络编程——浅谈 TCP 三次握手和四次挥手

一.tcp协议格式 二.三次握手 在 TCP/IP 协议中.TCP 协议提供可靠的连接服务,採用三次握手建立一个连接. 第一次握手:建立连接时,client发送 syn 包(tcp协议中syn位置1.序号为J)到server,并进入 SYN_SEND 状态.等待server确认: 第二次握手:server收到 syn 包,必须确认客户的 SYN,同一时候自己也发送一个 SYN 包,即 SYN+ACK包(tcp协议中syn位置1,ack位置1.序号K,确定序号为J+1),此时server进入 SY

浅谈TCP socket

Socket,用来实现应用的通信,是应用非常广的一个api,今天就来揭开它的神秘面纱. 客户端 引入头文件 #include <winsock2.h> 初始化socket的DLL WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData 创建套接字 SOCKET socket(int domain, int type, int protocol); domain 是协议域,包括 AF_INET 对应 ipv4 AF_INET6 对应 ip