Кто заботится о порядке передачи сообщений - PullRequest
0 голосов
/ 29 марта 2020

Я слушаю tcp сокет в linux с recv или recvfrom.

Кто заботится о том, чтобы я получал tcp-пакеты в правильном порядке?

Это Ядро заботится о том, чтобы, если пакет 1 пришел после пакета 2, ядро ​​пропало оба / сохранить пакет 2, пока не придет пакет 1?

Или, может быть, мне нужно позаботиться о пространстве пользователя до порядка tcp пакет

Ответы [ 2 ]

1 голос
/ 29 марта 2020

По словам Википедии,

На нижних уровнях стека протоколов, из-за перегрузки сети, балансировки нагрузки c трафика или непредсказуемого поведения сети, IP-пакеты могут быть потеряны, дублированы, или доставлен из заказа. TCP обнаруживает эти проблемы, запрашивает повторную передачу потерянных данных, переупорядочивает неупорядоченные данные , [...]

Это неотъемлемое свойство протокола, которое вы получит данные в правильном порядке (или вообще не будет).

Обратите внимание, что TCP - это потоковый протокол, поэтому вы даже не можете определить границы пакетов. Вызов recv / recvfrom может вернуть часть пакета и может вернуть байты, полученные из более чем одного пакета.

0 голосов
/ 29 марта 2020

В системах на основе Linux в любом нормальном сценарии это обрабатывается ядром.

Вы можете найти исходный код здесь , а вот сокращенная версия:

/*  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);

вместе с фактической реализацией , которая выполняет переупорядочение с использованием деревьев RB:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...