On Wed, 6 Dec 2017 18:02:21 +0400
Ilya Matveychikov <matvejchi...@gmail.com> wrote:

> Hello all,
> 
> 
> My question is about neighbor packet matching algorithm for TCP. Is it
> correct to expect that IP packets should have continuous ID enumeration
> (i.e. iph-next.id = iph-prev.id + 1)?


No.

> ~~~
> lib/librte_gro/gro_tcp4.c:check_seq_option()
>       ...
>       /* check if the two packets are neighbors */
>       tcp_dl0 = pkt0->pkt_len - pkt0->l2_len - pkt0->l3_len - tcp_hl0;
>       if ((sent_seq == (item->sent_seq + tcp_dl0)) &&
>                       (ip_id == (item->ip_id + 1)))
>               /* append the new packet */
>               return 1;
>       else if (((sent_seq + tcp_dl) == item->sent_seq) &&
>                       ((ip_id + item->nb_merged) == item->ip_id))
>               /* pre-pend the new packet */
>               return -1;
>       else
>               return 0;
> ~~~
> 
> As per RFC791:
> 
>   Identification:  16 bits
> 
>     An identifying value assigned by the sender to aid in assembling the
>     fragments of a datagram.

The IP header id is meaningless in most TCP sessions.
Good TCP implementations use PMTU discovery which sets the Don't Fragment bit.
With DF, the IP id is unused (since no fragmentation).
Many implementations just send 0 since generating unique IP id requires an
atomic operation which is potential bottleneck.

Reply via email to