2015-04-05 323 views

回答

0

是的,在连接建立期间协商完成后,我无法更改窗口比例。 我要发布的一段代码,我写了获得TCP选项(MSS和窗口缩放):

typedef struct { 
    unsigned char kind; 
    unsigned char size; 
} tcp_option_t; 
unsigned char* tmp = tcp_header;  
if (tcp_header->doff > 5) { 
    unsigned char* opt = tmp + sizeof(struct tcphdr); 
    while(*opt != 0) { 
     tcp_option_t* _opt = (tcp_option_t*)opt; 
     if(_opt->kind == 1) { //NOP 
         ++opt; // NOP is one byte; 
         continue; 
       } 
     if(_opt->kind == 2) { //MSS 
      unsigned int* mss_opt = (unsigned int*)(opt + sizeof(tcp_option_t)); 
      unsigned int mss = htons(*mss_opt); 
      f->mss = mss; 
     } 
     if(_opt->kind == 3) { //wnd_scale 
      integer24* wnd_opt = (integer24*)(opt + sizeof(tcp_option_t)); 
      integer24 wnd_scale = *wnd_opt; 
      f->wnd_scale = wnd_scale.data; 
     } 
     opt += _opt->size; 

     if (_opt->size == 0) { 
      //pr_info("Very strange situation: zero size\n"); 
      break; 
     }  
    } 
0

在连接建立期间协商完成后,无法更改窗口比例。在连接之前,您需要在套接字上设置一个大的接收缓冲区。在服务器的情况下,您需要在侦听套接字上设置接收缓冲区大小,从接收套接字继承它。

+0

欧凯,但如果我需要在代理更改窗口大小。无论如何,我怎么读窗口缩放选项? – luminousmen 2015-04-05 12:43:23

+0

您只能读取构成连接握手的初始SYN,SYN-ACK和ACK数据包的窗口缩放选项。我不明白你的第一句话。 – EJP 2015-04-07 23:21:39