【问题标题】:Implementing a WebServer实现一个 WebServer
【发布时间】:2013-10-07 17:05:26
【问题描述】:

我正在尝试创建自己的 Web 服务器,但对于我们今天使用的 Web 服务器的工作有几个问题。问题是:

  1. 从客户端通过 80 端口收到 HTTP 请求后,服务器是否使用相同的 80 端口响应?
  2. 如果是,那么在发送大文件时,比如 MB 的图片,网络服务器将无法接收来自其他客户端的请求?
  3. 计算机端口是双工还是单工? (可以同时发送和接收)?
  4. 如果服务器端的另一个端口用于向客户端发送响应,那么(如果使用 TCP,通常使用),将再次进行 3 次握手,这将是开销...

【问题讨论】:

    标签: http networking language-agnostic webserver


    【解决方案1】:

    http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html 这里是一个很好的关于网络服务器发生了什么的指南,虽然它是在 c 中,但概念都在那里。这将解释整个客户端服务器关系以及一些实现细节。

    我将简要介绍正在发生的事情: 通常发生的情况是,当您的服务器收到一个新请求时,它会创建一个处理它的分叉,这样您就不会被每个请求所困,当请求进入子进程时,子进程会收到一个要写入的新文件(这也是所有实现细节)。

    所以实际上你有一台服务器在等待请求,并且对于它收到的每个请求,它都会产生一个子进程来处理这个请求。我确信有比 c 更容易实现这些东西的语言(我过去必须同时为任何一个提供 ac 和 java 服务器)但是 c 真的让你了解正在发生的事情,我打赌这就是你在这里寻找的东西

    现在有几件事需要考虑: 您希望网络服务器如何工作。该示例解释了父子进程。 您是否想使用 tcp/UDP 传递有效载荷的方式有所不同。 您不必连接端口 80。这只是 web 的默认设置。

    希望指南对您有所帮助。

    【讨论】:

      【解决方案2】:
      1. 是的。服务器使用客户端建立的 TCP 连接发送响应,因此它也使用相同的端口进行响应。服务器可以使用同一端口处理来自多个客户端的连接,因为 TCP 连接由 (local-ip, local-port, remote-ip, remote-port) 标识,因此服务器甚至可以处理来自同一客户端的多个连接,前提是源端口不同。
      2. 您可以使用不同的技术同时为多个客户提供服务。其中包括

        • 使用多个进程或线程:当一个忙于为客户端提供服务时,其他人可以为其他客户端提供服务。
        • 使用事件:服务器侦听来自操作系统的事件:当它可以将数据块写入连接时,它会写入它,当新客户端连接时,它会接受连接,...

        这两种方法经常结合使用。

      3. TCP 连接是双工的:您可以同时发送和接收。不过,HTTP 协议基于简单的请求-响应模型:在任何给定时间,只有一方在“交谈”。

      【讨论】:

      • 我的重点是服务器端端口。该端口可以向客户端发送响应并同时侦听新的客户端请求吗?如果是,那么以编程方式如何?如果没有,那么使用什么技术来避免服务器必须发送大文件(比如图像文件)并同时随时可用于传入的客户端请求的这种情况......
      • 是的,它可以,并且在所有套接字 API 中这样做的方式是用于接受连接的套接字与用于与客户端通信的套接字是分开的。我建议你在你最喜欢的操作系统上找到一个关于你最喜欢的编程语言的网络编程教程,因为它将解释所有这些......
      • 您能否在 c 或 Java 代码上实现这一行:“用于接受连接的套接字与用于与客户端通信的套接字是分开的。” ?.因为当我查看任何 Java 教程时,它的完成方式(正如他们所说)是 ServerSocket welcomeSocket = new ServerSocket(6789); while(true) { 套接字连接套接字 = welcomeSocket.accept();现在在这里,如果我通过 tcpdump 或 netstat 监视我的网络活动或列出来自 nmap 等的开放端口。它没有显示任何其他端口(除了 onServer 正在侦听)用于向客户端发送数据。
      • 如您所见,您有一个ServerSocket 用于监听套接字,而一个普通的Socket 用于连接的客户端。如果您列出打开的网络连接,您应该会看到端口 80 上有一个处于 LISTEN 状态的套接字,对应于 ServerSocket,并且每个连接都有一个不同的套接字,处于其他状态。您会看到每个连接的本地端口都是 80,因为这是服务器使用的端口,但远程地址(IP、端口)将是不同的。
      • 这就是问题所在。在服务器端,当我监控网络连接时,它显示了通过其标准端口 80 与不同客户端完成的所有活动。(在我上面的代码中,端口号是 6789)。我已经用 tcpdump 对其进行了测试,仔细监控每个数据包。简而言之,按照上面的代码-“它不会在服务器上创建单独的本地端口来与接收到的客户端请求进行交互”。问题-那么在实际的 Web 服务器中是如何实现的?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 2021-07-21
      • 1970-01-01
      • 2019-01-07
      相关资源
      最近更新 更多