关于计算机网络中端口号的问题

时间:2010-12-19 09:54:18

标签: networking network-programming network-protocols

根据我的理解,端口号就像电话分机一样。正如商务电话总机可以使用主电话号码并为每个员工分配分机号码(如x100,x101等),因此计算机有一个主地址和一组端口号来处理传入和传出连接。 / p>

但问题是:

  • 分配的端口号是基于什么的?流程或申请?

根据我对防火墙的经验,我通常会为特定应用程序打开一个端口。因此,应根据应用程序分配端口号。 但是,如果在一台计算机上运行同一个应用程序的多个实例,该怎么办呢?每个实例使用相同的端口号。因此,如果消息到达该端口号,系统如何判断消息应该到哪个实例?

另一个问题也与港口有关。

如果Web服务器设置为侦听端口80,则客户端浏览器应始终联系80端口。我不确定以下Web浏览器和Web服务器之间的通信是否正确。

  • 客户端浏览器向服务器发送了请求,该消息应包含以下信息:

    To:< ServerAddress:80>

    来自:< ClientAddress:XXX>

  • 服务器向客户端浏览器发送响应,如下所示:

    To:< ClientAddress:XXX>

    来自:< ServerAddress:80>

所以问题是,服务器是否会选择其他端口号来向客户端发送消息?因为我认为单个80端口看起来不够。

Add - 1 - 21:16 2010/12/19

在上面的帖子中,“应用程序”一词代表系统知道的静态程序文件。可以启动此应用程序的多个实例,这是多个“进程

6 个答案:

答案 0 :(得分:3)

每个客户端连接将由服务器上的套接字表示。套接字由以下4条信息的组合唯一表示:

  • 对等IP地址
  • Peer port
  • 本地IP地址
  • 本地端口

客户端选择一个随机端口,因此如果从一个客户端到同一服务器/端口有多个连接,则客户端端口的连接仍然不同。

如果在同一台服务器上运行多个Web服务器应用程序,则必须在不同的端口上侦听,否则服务器将需要多个IP地址。

答案 1 :(得分:1)

在计算机上,只有一个进程可以侦听特定的端口号。例如,如果Apache进程正在侦听端口80,则其他任何应用程序也无法侦听端口80。

Apache通常会预先分配几个进程,其中只有一个正在侦听端口80.该进程的工作是将处理任何连接到其他Apache进程池之一的处理快速有效地进行处理。可以。

端口80的许多并发连接中的每一个都通过它的源IP地址和源TCP端口号(客户端计算机从未使用的集合中随机选择)来区分。


(编辑)

我很确定网络服务器有一个进程(或线程)监听,它接受传入的连接并将相应的文件句柄传递给工作进程(或线程)。 EJP建议事实并非如此。

Apache似乎有几个不同的multi-processing modules会影响它如何传播响应多个并发请求的负载。例如:MPM PreforkMPM Worker

Jeff Pozkaner编写了一个overview HTTP服务器设计,我觉得很有趣:

  

Web服务器的基本操作是接受请求并发回响应。第一个Web服务器可能就是为了做到这一点。毫无疑问,他们的用户很快注意到,当服务器向其他人发送响应时,他们无法获得自己的服务请求。会有很长时间烦人的停顿。

     

第二代Web服务器通过为每个请求分离子进程来解决此问题。 ...

     

这种类型的服务器的一个小变体使用“轻量级进程”或“线程”而不是完整的Unix进程。 ...

     

第三代服务器称为“pre-forking”。他们没有为每个请求启动新的子流程,而是拥有一个子流程池,它们可以保留并重复使用。 ...

     

第四代。只有一个过程。没有非便携式线程/ LWP。使用非阻塞I / O同时发送多个文件,调用select()/ poll()/ kqueue()来告知哪些文件已准备好接收更多数据。 ...

答案 2 :(得分:0)

网络堆栈通过三重<源IP,源端口,目标端口>来区分TCP连接,因此了解客户端地址和端口就足以正常工作。

答案 3 :(得分:0)

如果申请不是流程,该申请是什么?在防火墙中,您可以打开可执行文件的端口。它可以被视为一个应用程序,它是一个运行的过程。

多个侦听器无法侦听同一端口。同一进程可以侦听多个端口。

将端口分配给侦听器。根据防火墙(及其配置),您可以允许进程(可执行文件)侦听多个端口,或者为侦听多个端口的同一进程创建多个例外。

答案 4 :(得分:0)

我不确定“过程”和“应用程序”之间的区别是什么意思。一切都只是在你的盒子上执行的代码。

无论如何,进程/应用程序将侦听/绑定应用程序的作者已配置的任何端口号。按照惯例,许多端口号保留用于特定类型的应用程序 - 即使用特定协议进行通信的应用程序。因此,例如,使用HTTP的Web服务器通常在端口80上运行.SMTP服务器在端口22上运行.HTTPS是443,依此类推。

当然,您可以将您的Web服务器(例如apache httpd)配置为在您喜欢的任何端口上运行 - 但您的客户端需要知道它将采用端口80。

两个进程/应用程序可能绑定到同一端口。如果您尝试在已使用的端口上启动另一个进程/应用程序,您将收到错误:无法绑定到端口或其他类似的东西。

答案 5 :(得分:0)

  

服务器会选择其他端口   发送消息的号码   客户端?

没有。所有接受的套接字使用与原始侦听套接字相同的服务器端端口号。上面提到的识别元组消除了歧义,以使每个连接唯一。