Давайте сначала разберемся с некоторыми основами:
Каждый сокет имеет буфер приема и отправки. Когда сетевое оборудование сообщает о прибытии нового пакета и , приемный буфер заполнен, пакет отбрасывается. Размеры буфера контролируются с помощью опций сокетов SO_RCVBUF
и SO_SNDBUF
, см. setsockopt(3)
. ОС устанавливает некоторые значения по умолчанию (и есть файл /etc/sysctl.conf
). Это в системе BSD:
~$ sysctl -a|grep space
net.inet.tcp.recvspace=16384
net.inet.tcp.sendspace=16384
net.inet.udp.recvspace=41600
net.inet.udp.sendspace=9216
Разница между TCP и UDP заключается в том, что первый обеспечивает упорядочение данных и повторную передачу отброшенных пакетов, а также управление потоком (медленное чтение замедляет быструю запись), в то время как последний не делает.
Так что да, использование UDP для передачи файлов - не лучший вариант, , но работоспособный , вариант. Нужно просто заново изобрести часть TCP и сравнить издержки этого изобретения с TCP. С другой стороны, общая мудрость заключается в том, что UDP лучше всего подходит для приложений, которые могут допустить переупорядочение / потерю некоторых пакетов (например, потоков аудио / видео).
Тогда существует ошибочное мнение, что каждому сокету нужен отдельный поток для отправки / получения данных, что далеко от истины. Многие превосходные высокопроизводительные сетевые приложения были написаны без потоков, но с использованием неблокирующих сокетов и некоторого механизма опроса (см. select(2)
, poll(2)
, epoll(7)
).
К самому вопросу:
Да, ядро может отбрасывать пакеты, если приложение слишком занято, чтобы хранить достаточно свободного места в приемных буферах сокетов. Но так как каждый сокет имеет свой собственный, разделение потоков управления и данных поможет. Лично я хотел бы выполнить простую настройку TCP-сервера - прослушивать порт, принимать соединение для каждого клиента, реализовывать значимый протокол поверх потока TCP. Я согласен с тем, что играть с UDP-машинами и конечными автоматами низкого уровня очень весело, но это уже сделано, и десятилетия исследований были направлены на настройку производительности TCP. В конечном итоге важна надежность (во-первых) и производительность (во-вторых) вашего приложения.
Надеюсь, это поможет.