Я перенес код синтаксиса ядра в пространство пользователя. Я использую его как прозрачный прокси между клиентом и веб-сервером.
Когда я запрашиваю веб-страницу, она работает нормально (веб-страница ниже 512 кбит). Однако, если я получу доступ к огромному файлу (4 Гбит или более), он не продолжит передачу после передачи 3Gbit.
Я настроил «подтверждение», отправленное сервером клиенту, и «seq», отправленное клиентом на сервер. В то же время параметр tcp «sack», отправляемый с клиента на сервер, также настраивается.
if(tcpinp->state == CONNTRACK_SYN_SENT){
if(tcphdr->tcp_flags == (TCP_SYN_FLAG|TCP_ACK_FLAG)){
synproxy_parse_options(tcphdr, &opts);
tcpinp->tsoff = opts.tsval - tcpinp->its;
}
swap(opts.tsval, opts.tsecr);
synproxy_send_server_ack(iphdr,tcphdr, &opts);
/* send client ack,update tcp window */
swap(opts.tsval, opts.tsecr);
/*
* update window to client
*
* dir:server -> client
*
* save isn_off = client.ISN1 - server.ISN2
*/
tcpinp->isn_off = tcpinp->isn - tcphdr->seq;
synproxy_send_client_ack(tcpinp, &opts);
tcpinp->state = CONNTRACK_ESTABLISHED;
return 0;
}
if(tcpinp->dir == IP_CT_DIR_REPLY){
tcphdr->sent_seq = htonl(ntohl(tcphdr->sent_seq) + tcpinp->isn_off);
}else if(tcpinp->dir == IP_CT_DIR_ORIGINAL){
tcphdr->recv_ack = htonl(ntohl(tcphdr->recv_ack) - tcpinp->isn_off);
nf_ct_sack_adjust(tcph, other_way);
}
Что мне следует настроить, кроме seq / ack и sack?