Какие протоколы связи подходят для этой работы?
Это зависит от того, насколько ваше приложение допускает потерю пакетов по сравнению с дрожанием задержки (изменчивость задержки),В вашей локальной конфигурации с одним коммутатором вы, вероятно, не столкнетесь ни с одной из этих проблем, независимо от того, какой транспорт вы используете, но если ваша сеть становится шумной или вы можете когда-нибудь решить распространить ее на более крупную сеть, вам придется решитьчто важнее.Если предотвращение потери пакетов является вашим наивысшим приоритетом, вам следует использовать транспорт на основе сеанса (TCP, WebSockets).Если предотвращение джиттера задержек имеет первостепенное значение, вы, вероятно, захотите использовать транспорт UDP.Например, большинство онлайн-игр FPS используют UDP, потому что случайная потеря пакетов или переупорядочение допустимы, но дрожание задержки не является.
это задержка, которую я пытаюсь достичь реалистичной?
Да, см. Следующий ответ.
Какова минимальная задержка, которую я теоретически мог бы достичь?
В локальной сети с одним коммутатором это определенно возможночтобы получить среднюю задержку менее 10 миллисекунд.Если вы используете сквозную сеть Gigabit Ethernet, вы, вероятно, сможете достичь средней односторонней задержки менее 0,1 миллисекунды (100 микросекунд).
Будет ли задержка существенно зависеть от используемого коммутатора?Или подойдет любой дешевый потребительский коммутатор?
Переключатель определенно повлияет на вашу задержку.Однако даже дешевый потребительский коммутатор со скоростью 100 Мбит / с должен получить менее 10 мс (возможно, даже менее 1 мс).
на случай, если мне понадобится внезапно отправить больше данных, каков оптимальный пакетразмеры, чтобы минимизировать издержки?
Как правило, самые низкие издержки будут достигнуты при использовании максимальной полезной нагрузки, которая не будет фрагментирована.Но вы должны рассмотреть фрагментацию от начала до конца.Например, все ли сетевые карты и коммутаторы поддерживают джамбо-кадры (больше 1500 байт)?У всех ли они одинаковые настройки MTU?Имеет ли ваша транспортная библиотека произвольный размер буферизации?
Каков наилучший / правильный способ измерения задержки?
Я бы предложил создать тестовое приложение задержки, которое включает в себяреальное оборудование и весь программный стек, который вы намереваетесь использовать и создать тестовое приложение с задержкой для проверки фактической практической задержки (не только теоретической).Вы захотите проверить задержку прохождения сигнала в оба конца, а затем разделить на два (в противном случае вы будете тратить все свое время на синхронизацию времени с высокой точностью).Кроме того, вы захотите легко настроить размер полезной нагрузки, особенно если вы хотите ответить на предыдущий вопрос о наиболее эффективном размере пакета / сообщения.Если вы рассматриваете UDP, то я также рекомендую добавить порядковые номера к вашей полезной нагрузке и проверить их, чтобы убедиться, что вы не испытываете неожиданную потерю пакетов или переупорядочение (переупорядочение не должно происходить в сети с одним коммутатором).1037 *
Если вы собираетесь использовать большие полезные нагрузки / пакеты, тогда я также настоятельно рекомендую использовать wireshark , чтобы увидеть, что на самом деле происходит в сети.Вы должны быть в состоянии легко идентифицировать любую происходящую фрагментацию (и это отличный способ получить новое понимание того, как работают сетевые протоколы).
насколько задержка будет зависеть отязык программирования используется?(Я рассматриваю Java, C, Python)
Выбор языка, безусловно, может иметь нетривиальное значение. Тем не менее, в вашем случае локальной сети с одним коммутатором, я подозреваю, что python будет достаточно, поскольку он должен быть значительно ниже допустимого предела. В Java и Python код сокетов реализован на C / C ++, поэтому до тех пор, пока не будет много предварительной или последующей обработки данных, дополнительные издержки не должны быть слишком заметными. На мой взгляд, больший риск использования Python или Java, если ваше приложение чувствительно к дрожанию задержки. Java и python - это языки для сборки мусора, и в зависимости от природы вашего приложения это может привести к неожиданному дрожанию в эффективной задержке (т. Е. Вы время от времени получаете паузы во время сбора мусора во время выполнения).
Я бы лично начал с python, потому что разработка идет очень быстро (но начните с того, что наиболее эффективно для вас), а затем переключился бы на C, если производительность оказывается проблемой. Кроме того, если есть вероятность, что ваш проект будет включен в более крупную экосистему, вам, вероятно, следует выбрать предпочтительный язык в этой экосистеме.
Каковы плюсы и минусы использования TCP?
Плюсы: Гарантированная доставка всех данных в порядке.
Минусы: требуется больше начальной настройки. В сложной или шумной сетевой среде может возникать дрожание задержки из-за повторных попыток и повторного заказа.
Каковы плюсы и минусы использования UDP?
Плюсы: низкая задержка.
Минусы: только лучшие усилия. Пакеты могут быть отброшены и / или переупорядочены. Может быть сложнее пересекать межсетевые экраны.
Каковы плюсы и минусы использования веб-сокетов?
Плюсы: позволяет браузеру быть одной из ваших конечных точек, в остальном те же плюсы, что и TCP (это транспортный уровень на TCP). Это транспорт на основе сообщений, поэтому повторная сборка данных не требуется (например, вы получаете целые сообщения в том виде, в котором они были отправлены).
Минусы: HTTP-рукопожатие и минимальное кадрирование для каждого сообщения.