如何在 linux 中更改 TCP 数据包中的 window 比例?

How to change window scale in TCP packet in linux?

我需要更改 TCP header 中的 window 大小,但是当我更改它并重新计算校验和时,最终的 window 乘以 window 比例选项。我可以在哪里以及在哪个结构中找到它并进行更改?

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

是的,window 比例在连接建立期间协商后无法更改。 我想 post 我写的一段代码来获取 tcp 选项(mss 和 window 比例):

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;
        }       
    }