yfr24493AzzrggAcom
yfr24493AzzrggAcom

Reputation: 309

Who take care tcp message order

I listen to tcp socket in linux with recv or recvfrom.

Who taking care that I will get the tcp packets on the right order?

Is that the kernel taking care so if packet 1 came after packet 2 the kernel will drop out both/save packet 2 until packet 1 will come?

Or maybe I need to take care on user-space to the order of tcp packet?

Upvotes: 1

Views: 558

Answers (2)

that other guy
that other guy

Reputation: 123650

On Linux based systems in any normal scenario, this is handled by the kernel.

You can find the source code here, and here's an abridged version:

/*  Queue data for delivery to the user.
 *  Packets in sequence go to the receive queue.
 *  Out of sequence packets to the out_of_order_queue.
 */
if (TCP_SKB_CB(skb)->seq == tp->rcv_nxt) {
   /* packet is in order */
}

if (!after(TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt)) {
   /* already received */
} 

if (!before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt + tcp_receive_window(tp)))
    goto out_of_window;

if (before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) {
    /* Partial packet, seq < rcv_next < end_seq */
}

/* append to out-of-order queue */
tcp_data_queue_ofo(sk, skb);

along with the actual implementation that does the reordering using RB trees:

Upvotes: 2

ikegami
ikegami

Reputation: 386561

To quote Wikipedia,

At the lower levels of the protocol stack, due to network congestion, traffic load balancing, or unpredictable network behaviour, IP packets may be lost, duplicated, or delivered out of order. TCP detects these problems, requests re-transmission of lost data, rearranges out-of-order data, [...]

It's an inherent property of the protocol that you will receive the data in the correct order (or not at all).

Note that TCP is a stream protocol, so you can't even detect packet boundaries. A call to recv/recvfrom may return a portion of a packet, and it may return bytes that came from more than one packet.

Upvotes: 1

Related Questions