2014-12-16 7 views
0

Я отправляю данные 1k с использованием TCP/IP (используя FreeRTOS + LwiP). Из документов я понял, что протокол TCP/IP имеет управление потоком внутри самого его стека, но это управление потоком зависит от сетевых буферов. Я не уверен, как это можно обработать в моем сценарии, который описан ниже.управление потоком - как

  1. Получение данных о 1k размера с помощью TCP/IP с WiFi (эта скорость передачи данных будет в 20Мб/с)

  2. Полученные данные Wi-Fi помещается в очередь 10k size10 блока, каждый блок имеющие размер 1К

  3. из очереди, каждый блок берется и отправить на другой интерфейс на более низкой скорости 1Mb/s

Таким образом, в этом случае, я должен я осуществлять управление потоком вручную между данными из wifi < -> queue? Как я могу это достичь?

ответ

0

Нет, вам не нужно самостоятельно управлять потоком, алгоритм TCP заботится о нем внутренне.

В основном происходит то, что при приеме сегмента TCP от вашего отправителя LwIP отправит обратно ACK, который содержит доступное пространство, оставшееся в его буферах (размер окна). Поскольку данные поступают быстрее, чем вы можете обработать, стек в конечном итоге отправит обратно ACK с размером окна, равным нулю. Это говорит стеку отправителя отступить и повторить попытку позже, что будет автоматически. Когда вы переходите к извлечению большего количества данных из сетевых буферов, стек должен повторно активировать последний сегмент, который он получил, только на этот раз он открывает окно, чтобы сказать, что он может получать больше данных.

То, что вы хотите избежать, это то, что называется silly window syndrome, потому что оно может оказать существенное влияние на использование и производительность вашей сети. Попробуйте прочитать данные из сети в больших кусках, если сможете. Избегайте плотных петель, которые заполняют буфер по 1 байту за раз.