1. 使用场景
在一大流量网络中心旁路抓包,不能完全排除乱序或丢包的可能
2. Review代码
2.1 窗口检验部分代码
if (
! ( !datalen && ntohl(this_tcphdr->th_seq) == rcv->ack_seq )
&& /* zero window handle */
( !before(ntohl(this_tcphdr->th_seq), rcv->ack_seq + rcv->window*rcv->wscale) ||
before(ntohl(this_tcphdr->th_seq) + datalen, rcv->ack_seq)
)
) {
return;
}
上面的这串代码有很大问题,如果TCP正常交互可能会没太大的问题,但一旦有异常就会造成重组后的流不完整,甚至无法重组。
2.2 四次挥手部分代码
if ((this_tcphdr->th_flags & TH_ACK)) {
handle_ack(snd, ntohl(this_tcphdr->th_ack));