我需要更改TCP标头中的窗口大小,但是当我更改它并重新计算校验和时,最终窗口将乘以窗口缩放选项。我可以在哪里和在哪个结构中找到并更改?如何更改linux中TCP数据包的窗口大小?
0
A
回答
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
在连接建立期间协商完成后,无法更改窗口比例。在连接之前,您需要在套接字上设置一个大的接收缓冲区。在服务器的情况下,您需要在侦听套接字上设置接收缓冲区大小,从接收套接字继承它。
欧凯,但如果我需要在代理更改窗口大小。无论如何,我怎么读窗口缩放选项? – luminousmen 2015-04-05 12:43:23
您只能读取构成连接握手的初始SYN,SYN-ACK和ACK数据包的窗口缩放选项。我不明白你的第一句话。 – EJP 2015-04-07 23:21:39