TCP滑动窗口协议_第1页
TCP滑动窗口协议_第2页
TCP滑动窗口协议_第3页
TCP滑动窗口协议_第4页
TCP滑动窗口协议_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、TCP 滑动窗口协议TCP 的首部中有一个很重要的字段就是 16 位长的窗口 大小,它出现在每一个 TCP 数据报中,配合 32 位的确认序 号,用于向对端通告本地 socket 的接收窗口大小。 也就是说, 如果本地 socket 发送一个 TCP 数据,其 32 位确认序号是 5, 窗口大小是 5840 ,则用于告诉对端,对端已经发出的4个字节的数据已经收到并确认, 接下来, 本地 socket 最多能 够接收从第 5 个字节开始的 5840 个字节长度的数据。这是 由接收方进行的一种流量控制,接收方通过告诉发送方自己 所能够接收数据的大小,达到控制发送方发送速度的目的。 结构体 stru

2、ct tcp_sock 中有很多成员数据跟滑动窗口协议相 关,需要注意的是这里讲的滑动窗口都是指本地 socket 的接 收窗口。 成员 window_clamp 表示滑动窗口的最大值, 滑动窗口的大小在变化的过程中不能超出这个值。 它在 TCP 连接建立的时候被初始化,被置为最大的 16 位整数左移窗 口的扩大因子,因为滑动窗口在 TCP 首部中以 16 位表示, window_clamp 太大会导致滑动窗口不能在 TCP 首部中表示。 成员 rx_opt 是一个 struct tcp_options_received 结构体,它 有两个成员 snd_wscale 和 rcv_wscale

3、,分别表示来自对端 通告的滑动窗口扩大因子 (本地发送数据报时需要遵守 ),和 本地接收滑动窗口的扩大因子。 snd_wscale 从来自对端的第 一个 SYN 中获取。 rcv_wscale 在本地 socket 建立连接时初 始化,它赋值的原则是使 16 位整数的最大值左移 rcv_wscale 后,至少可以达到整个接收缓存的最大值。接收缓存最大值 在协议栈中由全局变量 mysysctl_rmem_max 表示,它是 256*(256+sizeof(struct sk_buff) 后的值,为 107520 ,但 sysctl_tcp_rmem3 所表示的接收缓存的上限更大,为 174760

4、 ,所以,取后者,这样的话, rcv_wscale 的值几乎 可以说是固定的, 为 2 。所以 window_clamp 的值就是 65535 << 2 = 262140 。可见, window_clamp 的值超出了接收 缓存的最大值, 但这没有关系, 因为在滑动窗口增长的时候, 会考虑接收缓存的大小这个因素的。 rcv_wnd 表示当前 的接收窗口的大小,这个值在接收到来自对端的数据后,会 变动的。它的初始值取接收缓存大小的 3/4 跟 MAX_TCP_WINDOW 之间的最小值, MAX_TCP_WINDOW 在系统中的定义为 32767U 。然后,还要根据 mss 的值作一

5、 个调整,调整逻辑是:如果 mss 大于 3*1460 ,则如果当前 的 rcv_wnd 大于两倍的 mss ,就取两倍的 mss 作为 rcv_wnd 的值;如果 mss 大于 1460 ,则如果当前的 rcv_wnd 大于 3 倍的 mss ,就取 3 倍的 mss 作为 rcv_wnd 的新值;否则, 如果rcv_wnd大于4倍的 mss,就取4倍的 mss作为rcv_wnd 的新值,我们的实验环境的 mss 值为 1448( 因为 tcp 首部有 12 字节的时间戳选项 ),所以 rcv_wnd 最后被调整为一个阀值,其初始值就置为 rcv_wnd 。它跟 rcv_wnd 配合工 作,

6、当本地 socket 收到数据报,并满足一定条件时,增长 rcv_ssthresh 的值,在下一次发送数据报组建 TCP 首部时, 需要通告对端当前的接收窗口大小, 这时需要更新 rcv_wnd , 此时 rcv_wnd 的取值不能超过 rcv_ssthresh 的值。两者配合, 达到一个滑动窗口大小缓慢增长的效果。 rcv_wup 记录 滑动窗口的左边沿,即落在滑动窗口中的最小的一个序号。 这样的话, rcv_wup+rcv_wnd 即为滑动窗口的右边沿, rcv_wup+rcv_wnd-rcv_nxt 即为滑动窗口的空白部分。它的 初始值为 0 ,在移动滑动窗口时被更新。 以上是关于接 收

7、滑动窗口的几个相关数据,下面我们看看它们是如何运用 在 TCP 协议的通讯中的。 每次发送一个 TCP 数据报, 都要构建 TCP 首部,这时,会调用 mytcp_select_window 选择窗口大小,窗口大小选择的基本思想是接收缓存剩余空 间大小的 3/4 ,但是不能超过 rcv_ssthresh 的大小。但是, 如果这个新选择的窗口大小比当前窗口的剩余大小还小,则 以当前窗口的剩余大小作为新窗口的大小。同时右移左边沿, 令 rcv_wup=rcv_nxt 。这个新选择的窗口是受 rcv_ssthresh 限制的,一般不会有什么问题,但我们可以看到代码中还是 作了一些上限判断, 如果扩大

8、因子为 0, 则窗口大小不能超过 32767U ,否则不能超过 65535 左移扩大因子后的值。 每次接收到来自对端的一个 TCP 数据报,且数据报长度大于 128 字节时,我们需要调用 mytcp_grow_window ,增加 rcv_ssthresh 的值,一般每次为 rcv_ssthresh 增长两倍的 mss ,增加的条件是 rcv_ssthresh 小于 window_clamp, 并且 rcv_ssthresh 小于接收缓存剩余空间的 3/4 ,同时 mytcp_memory_pressure 没有被置位 ( 即接收缓存中的数据 量没有太大 )。 mytcp_grow_window 中对新收到的 skb 的长 度还有一些限制,并不总是增长 rcv_ssthresh 的值。具体见 函数代码。 以上是关于接收窗口,下面简单看一下发送 窗口。关于发送窗口,在 struct tcp_sock 中也有一些成员数 据相关。 snd_wl1 记录发送窗口更新时,造成窗口更新 的那个 ACK 数据报的第一个序号。它主要用于在下一次判 断是否需要更新发送窗口。 snd_wnd 是发送窗口的大小, 直

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论