Unix TCP服务器和UDP服务器

时间:2010-02-20 08:33:22

标签: unix tcp network-programming udp client-server

为什么TCP服务器的设计主要是这样,无论何时接受连接,都会调用一个新进程来处理它。但是,为什么在UDP服务器的情况下,大多数只有一个进程来处理所有客户端请求?

5 个答案:

答案 0 :(得分:3)

如前所述,TCP和UDP之间的主要区别在于UDP是无连接的。

使用UDP的程序只有一个接收消息的套接字。所以如果你只是阻止并等待消息就没有问题。

如果使用TCP,则每个连接的客户端都会获得一个套接字。然后你不能阻止并等待一个套接字接收一些东西,因为还有其他套接字必须同时处理。
所以你有两个选择,要么使用非阻塞方法,要么使用线程。当你没有一个必须处理每个客户端的while循环时,代码通常要简单得多,因此通常首选线程。如果使用阻塞方法,还可以节省一些CPU时间。

答案 1 :(得分:1)

当您通过TCP连接与客户端通信时,您将维护TCP会话。因此,当建立新连接时,您需要单独的进程(或线程,无论它如何实现以及操作系统使用的是什么)并保持对话。但是当您使用UDP连接时,您可能会收到数据报(并且您将被告知发件人的IP和端口)但通常情况下您无法对其进行响应。

答案 2 :(得分:1)

首先,经典的Unix服务器范例是基于过滤器的。例如,可以在/ etc / services中配置各种网络服务,并且像inetd这样的程序在所有TCP和UDP套接字上侦听传入连接和数据报。当连接/ DG到达它时,使用dup2系统调用将stdin,stdout和stderr重定向到套接字,然后执行服务器进程。 You can take any program which reads from stdin and writes to stdout and turn it into a network service, such as grep

根据Steven在“Unix Network Programming”中的说法,有五种服务器I / O模型(第154页):

  1. 阻断
  2. 非阻塞
  3. 多路复用(选择并轮询)
  4. 信号驱动
  5. 异步(POSIX aio_ functions)
  6. 此外,服务器可以是迭代服务器,也可以是并发服务器。

    您问为什么TCP服务器通常是并发的,而UDP服务器通常是迭代的。

    UDP端更容易回答。通常,UDP应用遵循简单的请求响应模型,其中客户端发送短请求,然后回复,每对构成独立事务。 UDP服务器是唯一使用信号驱动I / O的服务器,而且非常少。

    TCP有点复杂。迭代服务器可以使用上面的任何I / O模型,除了#4。单个处理器上最快的服务器实际上是使用非阻塞I / O的迭代服务器。但是,这些被认为是相对复杂的实现,加上Unix过滤器习惯用法,传统上使用阻塞I / O的并发模型的主要原因,无论是多进程还是多线程。现在,随着通用多核系统的出现,并发模型也具有性能优势。

答案 3 :(得分:0)

你的概括过于笼统。这是您可能在基于Unix的服务器上看到的模式,其中流程创建成本低廉。基于.NET的服务将使用线程池中的新线程,而不是创建新进程。

答案 4 :(得分:0)

在等待I / O时可以继续执行有用工作的程序 通常是多线程的。进行大量计算的程序 可以整齐划分为单独的部分可以受益 多线程,如果有多个处理器。服务的程序 许多网络请求有时可以通过拥有一个池来获益 服务请求的可用线程。 GUI程序也需要 执行计算可以受益于多线程,因为它允许 主线程继续服务GUI事件。

这就是为什么我们使用TCP作为互联网协议。

相关问题