Unix TCP-серверы и UDP-серверы - PullRequest
1 голос
/ 20 февраля 2010

Почему конструкция TCP-серверов в основном такова, что всякий раз, когда он принимает соединение, вызывается новый процесс для его обработки. Но почему в случае серверов UDP в основном есть только один процесс, который обрабатывает все клиентские запросы?

Ответы [ 5 ]

3 голосов
/ 20 февраля 2010

Основное различие между TCP и UDP заключается в том, что, как указывалось ранее, UDP не использует соединение.

Программа, использующая UDP, имеет только один сокет, в который она получает сообщения. Так что нет проблем, если вы просто заблокируете и дождетесь сообщения.

При использовании TCP вы получаете один сокет для каждого клиента, который подключается. Тогда вы не можете просто заблокировать и ждать, пока ОДИН сокет получит что-то, потому что есть другие сокеты, которые должны обрабатываться одновременно.
Таким образом, у вас есть два варианта: либо использовать неблокирующие методы, либо использовать потоки. Код обычно намного проще, когда у вас нет одного цикла while, который должен обрабатывать каждый клиент, поэтому потоки часто предпочтительнее. Вы также можете сэкономить некоторое время процессора, если используете методы блокировки.

1 голос
/ 20 февраля 2010

Прежде всего, классическая парадигма Unix-сервера основана на фильтрах.Например, различные сетевые службы могут быть настроены в / etc / services, и программа, подобная inetd, прослушивает все сокеты TCP и UDP для входящих соединений и дейтаграмм.Когда соединение / DG приходит, оно разветвляется, перенаправляет stdin, stdout и stderr в сокет с помощью системного вызова dup2, а затем исполняет процесс сервера. Вы можете взять любую программу, которая читает из stdin и записывает в stdout, и превращает ее в сетевой сервис, такой как grep .

Согласно Стивену в " Сетевое программирование Unix", существует пять видов серверных моделей ввода / вывода (стр. 154):

  1. блокирование
  2. неблокирование
  3. мультиплексирование (выбор и опрос)
  4. Управляемый сигналом
  5. асинхронный (функции POSIX aio_)

Кроме того, серверы могут быть итеративными или параллельными.

Вы спрашиваете, почемуTCP-серверы обычно работают одновременно, а UDP-серверы - итеративные.

На стороне UDP легче ответить.Обычно приложения UDP следуют простой модели ответа на запрос, когда клиент отправляет короткий запрос с последующим ответом, причем каждая пара представляет собой отдельную транзакцию.UDP-серверы - единственные, которые используют ввод-вывод Signal Drive, и очень редко.

TCP немного сложнее.Итеративные серверы могут использовать любую из моделей ввода-вывода, указанных выше, кроме # 4.Самые быстрые серверы на одном процессоре - это итеративные серверы, использующие неблокирующий ввод-вывод.Тем не менее, они считаются относительно сложными для реализации, и это плюс идиома фильтра Unix, где традиционно первичные причины для использования параллельной модели с блокирующим вводом / выводом, будь то многопроцессный или многопоточный.Теперь, с появлением обычных многоядерных систем, параллельная модель также имеет преимущество в производительности.

1 голос
/ 20 февраля 2010

Когда вы общаетесь с клиентом через TCP-соединение, вы поддерживаете TCP-сессию. Поэтому, когда новое соединение установлено, вам нужен отдельный процесс (или поток, независимо от того, как он реализован и какая ОС используется) и поддерживать диалог. Но когда вы используете UDP-соединение, вы можете получить дейтаграмму (и вам сообщат об IP-адресе и порте отправителя), но в общем случае вы не можете ответить на него.

0 голосов
/ 01 марта 2010

Программы, которые могут продолжать выполнять полезную работу, ожидая ввода-вывода часто будет многопоточным. Программы, которые делают много вычислений, которые можно аккуратно разделить на отдельные разделы многопоточность, если есть несколько процессоров. Программы, которые обслуживают многие сетевые запросы иногда могут принести пользу доступные темы для обслуживания запросов. Программы с графическим интерфейсом, которые также должны выполнять вычисления могут извлечь выгоду из многопоточности, потому что это позволяет Основной поток для продолжения обслуживания событий графического интерфейса.

Вот почему мы используем TCP в качестве интернет-протокола.

0 голосов
/ 20 февраля 2010

Ваше обобщение слишком общее. Это шаблон, который вы можете увидеть на Unix-сервере, где создание процесса стоит недорого. Служба на основе .NET будет использовать новый поток из пула потоков вместо создания нового процесса.

...