2015-04-05 48 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