С UDP вы контролировать «состояние соединения», и это в значительной степени лучший способ сделать что-нибудь пиринговой связанные IF у вас есть большое количество узлов или заботиться о пропускной способности, память и нагрузки на процессор. Перемещая весь элемент управления в ваше приложение в отношении «состояния соединения» каждого узла, вы минимизируете количество ресурсов, потраченных впустую, что точно соответствует вашим потребностям.
Вы обойдете слишком много странностей, зависящих от операционной системы, что ограничивает эффективность TCP с большим количеством подключений. Существует размахивание TIME_WAIT и от десятков до сотен специальных настроек ОС, которые нуждаются в настройке для каждого пользователя вашего приложения P2P, если ему нужны эти высокие номера. Тестируемое приложение, которое я разрешил использовать UDP с помощью ack или TCP, показал только 10% -ную разницу в производительности, независимо от операционной системы, использующей UDP. Производительность TCP всегда была ниже, чем лучший UDP, и ее производительность сильно варьировалась более чем на 600% в зависимости от ОС. С помощью настроек вы можете сделать большинство ОС примерно одинаковыми с использованием TCP, но по умолчанию большинство из них неправильно настроены.
Так что, по моему мнению, сложнее создать надежную сеть UDP P2P по сравнению с TCP, но это часто необходимо. Однако я бы посоветовал только проложить маршрут, если бы у вас был опыт работы в сети, поскольку есть много «ошибок», с которыми нужно иметь дело. Есть библиотеки, которые помогают с этим, как Raknet или Enet. Они предоставляют способы сделать надежный UDP, но по-прежнему требуют большего количества сетевых знаний, чтобы знать, как все это объединяется, тогда как с TCP он в основном скрыт от вас.
В сети однорангового узла у вас часто появляются сообщения, такие как NODE PING, что вам может быть безразлично, если каждый из них всегда будет получен, вам просто все равно, если вы недавно его получили. т.е. вы можете отправлять ping каждые 10 секунд и отключать узел после 60 секунд без пинга. Это означало бы, что вам понадобится 6 ping-пакетов в строке, что очень маловероятно, если узел не будет работать. Если вы получили хотя бы один пинг в течение этого 60-секундного периода, то узел все еще активен. Реализация TCP в этом случае будет связана с большей задержкой и пропускной способностью, поскольку она гарантирует, что EACH ping-сообщение пройдет и заблокирует любые другие данные, выходящие до тех пор, пока это не произойдет. И поскольку вы не можете полагаться на TCP, чтобы надежно сказать вам, что соединение мертво, вы вынуждены добавлять аналогичные функции PING для TCP, помимо всего прочего, TCP уже делает дополнительные с вашими пакетами.
Игры также часто имеют данные, которые, если его не получил клиент, не имеет большого значения, потому что в течение нескольких миллисекунд поступает больше пакетов, что приведет к аннулированию любых пропущенных пакетов. т.е. игрок переходит от A к Z в течение 1 секунды, его клиент отправляет каждый пакет, примерно на расстоянии в 40 миллисекунд. ABCDEFG__I__KLMNOPQRSTUVWXYZ. Мы действительно заботимся, если мы пропустим «H и J», так как каждые 40 мс мы получаем обновления? На самом деле это не значит, что в него может входить предсказание, но обычно это не относится к большинству проектов P2P. Если это был TCP вместо UDP, тогда у него были бы повышенные требования к пропускной способности и добавлена латентность для остальных принимаемых пакетов, так как данные будут повторно отправляться до тех пор, пока они не появятся, в дополнение к дополнительной задержке, которую уже добавляет, вызывая все.
По существу, вы можете снизить латентность и сетевые издержки для многих сообщений в одноранговой сети с использованием UDP. Однако всегда будут какие-то сообщения, которые должны быть отправлены надежно, и это требует, чтобы вы в основном реализовали надежный способ получения пакетов на этот узел, аналогичный TCP. И здесь вам необходим определенный уровень знаний, если вы хотите иметь надежную одноранговую сеть. Некоторые вещи, на которые нужно обратить внимание, включают в себя последовательности пакетов с номером, сообщениями ACK и т. Д.
Если вы заботитесь об эффективности или действительно нуждаетесь в десятках тысяч подключений, то реализация вашего конкретного протокола в UDP всегда будет лучше, чем TCP. Но есть случаи, которые необходимо сделать для TCP, например, если время для решения проекта или если вы новичок в сетевом программировании.
Это не вопрос программирования. Это вопрос архитектурного дизайна и, возможно, сетевой вопрос. Он * может * быть в теме на программистах или в других местах, но в настоящее время он не входит в сферу действия, определенную нашим справочным центром. –
Рекомендуется сравнить [TCP vs UDP] (http://www.diffen.com/difference/TCP_vs_UDP) для сравнения. Сравните это с вашим списком характеристик и сделайте свой выбор. UDP, скорее всего, будет самым подходящим выбором. –