一、奇怪现象:

三次握手时,前两次syn|syn+ack中的window size明明很大,但是第三次握手的时候window size却突然变得很小,

并且后续的数据传输的过程中,window size仍然很小,和syn|syn+ack中的不符,对于我们初探tcp的学习者来说,

会一头雾水,其实是我们只关注了tcp的重要点,而没有了解到tcp的小细节。

二、tcp option:

tcp报文除了标准的20字节,其实还可以最大到达60字节,由HL(4位,最大15*32 / 8 = 60字节),多出来的字节是tcp option,

即tcp可选字段,格式为:

| type(1-byte) | length(1-byte) | values(length - 2 byte) |

而上面的奇怪现象是由于tcp在syn|syn+ack中使用了window scale factor这个可拓展值进行了拓展,

在该阶段(syn|syn+ack)的window size不受window scale factor影响,即window size是多少,那么就是多少,

但是后续的数据传输包括第三次握手的window size均要向左移动该window scale factor,

即window size * (2 ** scale_factor) or window size << scale_factor才是实际的window size

三、例子:

访问百度为例子:

sudo tcpdump -i eth0 host www.baidu.com -S -xx -n

12:15:02.145424 IP 172.18.192.125.36028 > 115.239.210.27.80: Flags [S], seq 4200731336, win 29200, options [mss 1460,sackOK,TS val 105544669 ecr 0,nop,wscale 7], length 00x0000:  eeff ffff ffff 0016 3e08 b134 0800 45000x0010:  003c 6915 4000 4006 1f0c ac12 c07d 73ef0x0020:  d21b 8cbc 0050 fa62 12c8 0000 0000 a0020x0030:  7210 b2c9 0000 0204 05b4 0402 080a 064a0x0040:  7bdd 0000 0000 0103 0307

syn:

以太网报文:eeff ffff ffff 0016 3e08 b134 0800

ip报文:4500 003c 6915 4000 4006 1f0c ac12 c07d 73ef d21b

tcp报文:8cbc 0050 fa62 12c8 0000 0000 a002 7210 b2c9 0000 0204 05b4 0402 080a 064a 7bdd 0000 0000 0103 0307
a002中的a为HL(10个32位长度的头部),所以tcp头部40字节,标准20字节,所以多余的20字节为tcp option,

其中03 0307为window scale factor, 07为其值

0x7210=29200,为window size,此时不会受window scale factor的影响

12:15:02.172269 IP 115.239.210.27.80 > 172.18.192.125.36028: Flags [S.], seq 439811744, ack 4200731337, win 8192, options [mss 1452,sackOK,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,wscale 5], length 00x0000:  0016 3e08 b134 eeff ffff ffff 0800 45140x0010:  003c 6915 4000 3606 28f8 73ef d21b ac120x0020:  c07d 0050 8cbc 1a36 fea0 fa62 12c9 a0120x0030:  2000 c554 0000 0204 05ac 0402 0101 01010x0040:  0101 0101 0101 0103 0305

syn+ack:

以太网报文:0016 3e08 b134 eeff ffff ffff 0800

ip报文:4514  003c 6915 4000 3606 28f8 73ef d21b ac12  c07d

tcp报文:0050 8cbc 1a36 fea0 fa62 12c9 a012 2000 c554 0000 0204 05ac 0402 0101 0101  0101 0101 0101 0103 0305
a012中的a为HL(10个32位长度的头部),所以tcp头部40字节,标准20字节,所以多余的20字节为tcp option,

其中03 0305为window scale factor, 05为其值

0x2000=8192,为window size,此时不会受window scale factor的影响

12:15:02.172312 IP 172.18.192.125.36028 > 115.239.210.27.80: Flags [.], ack 439811745, win 229, length 00x0000:  eeff ffff ffff 0016 3e08 b134 0800 45000x0010:  0028 6916 4000 4006 1f1f ac12 c07d 73ef0x0020:  d21b 8cbc 0050 fa62 12c9 1a36 fea1 50100x0030:  00e5 b2b5 0000

ack:

以太网报文:eeff ffff ffff 0016 3e08 b134 0800

ip报文:4500  0028 6916 4000 4006 1f1f ac12 c07d 73ef  d21b
tcp报文:8cbc 0050 fa62 12c9 1a36 fea1 5010  00e5 b2b5 0000

5010中的5为HL,标准报文20字节,没有tcp option,

0x00e5=229,当前传输的window size为229,但是由于前面的syn中有window scale factor(7),

因此实际的窗口为229 << 7 = 29312,

另一个验证方式,因为syn的窗口为29200,在传输过程中,那么需要右移7位,29200 >> 7 = 228(上移一位),229

所以这就解释了为什么在syn的window size为什么是29200,而在后续的返送中才仅仅只有229这几百的window size,(同理syn+ack的情况)

其实是我们不了解有tcp option,里面有个tcp window scale factor这个东西

tcp option相关推荐

  1. TOA - TCP Option Address

    使用Haproxy转发TCP到业务服务器端,后端报文看到的源 IP 地址是代理服务器的IP . 为了让后端能够获取到用户端实际的 IP 地址,有三个方案: 1. http 请求记录标识: 在客户端和服 ...

  2. tcp option 结构体_基于 Kotlin 实现一个简单的 TCP 自定义协议

    一. 开发背景 想要成为一名优秀的Android开发,你需要一份完备的 知识体系,在这里,让我们一起成长为自己所想的那样~. 我们的项目需要开发一款智能硬件.它由 Web 后台发送指令到一款桌面端应用 ...

  3. TOA(tcp option adress)安装

    1.说明 1.1.场景说明 TOA 属于 4层转发系统的一个功能模块,缺省情况下服务经过 4层转发系统,服务源站查看到的请求IP为NAT的回源地址,这对于一些特殊业务来说(比如游戏),是无法满足的,T ...

  4. 《TCP/IP图解》读书笔记

    看这本书的目的: 了解计算机之间是怎么通信的 熟悉TCP/IP协议 后面就这两个目的进行展开,要达到这两个目的,读这本书,学到了哪些知识. 一.计算机之间是怎么通信的 先来了解下面几个概念,中继器,二 ...

  5. TCP的三个接收队列

    TCP的三个接收队列 之前对于TCP接收过程中的三个队列的关系之前没搞清楚. 这几天,在同事邱的帮助下,终于把关系理清了,故特此做个笔记. 一.在软中断中加入数据包 tcp_v4_rcv()函数是tc ...

  6. TCP连接的建立(二)

    被动打开 SYN cookies TCP协议开辟了一个比較大的内存空间请求连接队列来存储连接请求块,当SYN请求不断添加,请求连接数目到达上限时,会致使系统丢弃SYN连接请求.SYN cookies技 ...

  7. 深度思考|TCP协议存在那些缺陷?

    作者:dog250 https://www.zhihu.com/question/47560918/answer/2302296292 TCP如何优化吞吐率,我很直接说优化不了,这让我甩开了很多令人尴 ...

  8. 会动的图解 | 既然IP层会分片,为什么TCP层也还要分段?

    什么是TCP分段和IP分片 我们知道网络就像一根管子,而管子吧,就会有粗细. 一个数据包想从管子的一端到另一端,得过这个管子.(废话) 但数据包的量有大有小,想过管子,数据包不能大于这根管子的粗细. ...

  9. linux内核对TCP的连接状态管理

    TCP协议实例连接状态存放在struct sock数据结构的state数据域中. 当TCP协议实例连接处于不同状态时,对数据包的处理不一样,所以每个输入的数据包都要来查询TCP状态机,整个状态机制划分 ...

最新文章

  1. JavaScript之Unspecified error或无法设置selected属性。未指明的错误。解决方案
  2. C++线性序列容器vector简单总结
  3. electron 解压zip_如何将Node.js中的.zip/.rar文件解压缩到文件夹中
  4. (*长期更新)软考网络工程师学习笔记——Section 16 磁盘存储技术和网络规划设计
  5. JavaScript逻辑运算符的使用技巧
  6. 国际空间站20年花掉超千亿美金,一些人开始觉得它“没啥用”了
  7. [转载] java如何实现一个字符串的反转和替换
  8. 人工智能的安全问题与差分隐私【笔记】
  9. SQL必知必会-创建表和操纵表
  10. stm32 断路功能和互补输出
  11. linux 5.5 外接usb2.0硬盘,RHEL5 使用pam_usb
  12. 深入理解javascript函数定义与函数作用域
  13. Atitit.用户权限服务 登录退出功能
  14. USGS批量下载影像(Sentinel2/哨兵2/Landsat)数据、bda程序安装-(史上最全讲解)
  15. 虚拟机NAT模式无法上网
  16. Ubutu 12.04LTS 安装搜狗拼音输入法+搜狗皮肤 步骤详解
  17. CentOS 6.x 使用包管理器安装配置Apache+PHP+MySql
  18. purifier 常用配置 保留 id 和 iframe
  19. 怎么在WPS表格中绘制二次函数曲线图
  20. 黑马python培训_要一张纯黑的图片。纯黑的。

热门文章

  1. 什么是DSK、EVM、DDK
  2. 用lavaan包进行验证性因子分析
  3. 特斯拉柏林超级工厂又突发火灾;多模态人工智能产业联合体第二次大会召开;奇瑞汽车战略投资AI芯片公司 | 每日大事件...
  4. 小鹏汽车吴新宙:要做全国第一 | 专访
  5. 字段太长,无法录入数据库
  6. matlab中SVD和EIG的区别?
  7. 23.生产与消费模型
  8. Programming Paradigms
  9. 如何使用excel制作工作表目录
  10. python辅助开发模块(非官方)如pil,mysqldb,openpyxl,xlrd,xlwd