8.2 窗口扩大(WScale)选项

本文探讨了TCP窗口扩大选项如何在Linux内核中提高数据传输效率。通过使用窗口扩大因子,发送端能在ACK到达前发送更多数据,减少等待时间,尤其在广域网的长肥管道现象中效果显著。然而,通告窗口大小受限于TCP序列号判断机制,最大值不能超过2**30。窗口扩大选项需在SYN或SYN|ACK包中携带,并且必须由双方启用才有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     TCP发送端在发送一个满窗口长度(最大65535字节)的数据后必须等待对端的ACK更新窗口后才能继续发送数据。在广域网中传输数据时,由于往返时间较长,发送端等待的时间也会较长,这样会使得TCP数据交互的速度大大降低(长肥管道现象)。使用窗口扩大选项可以使得发送端得到更大的通告窗口,这样就可以在ACK到来前发送更多的数据,减少了等待的时间,提高了数据传输效率。

     窗口扩大因子(shift.cnt)的大小是8bit,所以其值最大为255。使用窗口扩大选项后,真正的通告窗口大小 = TCP头中的窗口值*2**shift.cnt。但由于TCP判断数据是新是旧的方法是:数据的序列号是否位于sun.una到sun.una + 2**31的范围内,如果是,则为新,否则为旧。故通告窗口大小在最大值不能大于或等于2**31,即max_windows <= 2**30。所以shitr.cnt的最大值为30 - 16 = 14。

  窗口扩大选项只能在SYN包和SYN|ACK包中携带,但SYN和SYN|ACK包中通告的窗口不使用窗口扩大因子进行扩展。

  窗口扩大选项必须双方都开启才能生效。

  计算SYN包的窗口大小时

 2752 void tcp_connect_init(struct sock *sk)
2753 {
2754     const struct dst_entry *dst = __sk_dst_get(sk);
2755     struct tcp_sock *tp = tcp_sk(sk);
2756     __u8 rcv_wscale;
...
2789     tcp_select_initial_window(tcp_full_space(sk),
2790                   tp->advmss - (tp->rx_opt.ts_recent_stamp ? tp->tcp_header_len - sizeof(struct tcphdr) : 0),
2791                   &tp->rcv_wnd,                  
2792                   &tp->window_clamp,             
2793                   sysctl_tcp_window_scaling,     //内核选项开启WScale功能
2794                   &rcv_wscale,
2795                   dst_metric(dst, RTAX_INITRWND));
2796
2797     tp->rx_opt.rcv_wscale = rcv_wscale;
...
   构建SYN|ACK时&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值