1

在研究计算机网络作为课程主题时,我的概念是操作系统根据目标端口区分数据包并将其传递给在该端口上运行的应用程序。

后来我才知道我们可以使用同一个源(SourceIP:SourcePort)连接到两个不同的目的地(DestinationIP:DestinationPort)。

tcp        0      0 192.168.1.5:60000       199.7.57.72:80          ESTABLISHED 1000       196102      10179/firefox
tcp        0      0 192.168.1.5:60000       69.192.3.67:443         ESTABLISHED 1000       200361      10179/firefox
tcp        0      0 192.168.1.5:60000       69.171.234.18:80        ESTABLISHED 1000       196107      10179/firefox
tcp        0      0 192.168.1.5:60000       107.21.19.182:22        ESTABLISHED 1000       196399      10722/ssh
tcp        0      0 192.168.1.5:60000       69.171.234.18:443       ESTABLISHED 1000       201792      10179/firefox
tcp        0      0 192.168.1.5:60000       69.192.3.34:443         ESTABLISHED 1000       200349      10179/firefox
tcp        0      0 127.0.0.1:4369          127.0.0.1:51889         ESTABLISHED 129        12036       1649/epmd
tcp        0      0 192.168.1.5:60000       69.192.3.58:443         ESTABLISHED 1000       200352      10179/firefox
tcp        0      0 192.168.1.5:60000       74.125.236.88:80        ESTABLISHED 1000       200143      10179/firefox
tcp        0      0 192.168.1.5:60000       174.122.92.78:80        ESTABLISHED 1000       202935      10500/telnet
tcp        0      0 192.168.1.5:60000       74.125.236.87:80        ESTABLISHED 1000       201600      10179/firefox

再深入一点,我开始知道如果应用程序使用 bind() 系统调用将套接字描述符与特定的 IP 和端口组合绑定,那么我们就不能再次使用相同的端口。否则,如果端口未绑定到任何套接字描述符,我们可以再次使用相同的端口和 IP 组合连接到不同的目标。

我在 bind() 系统调用的手册页中读到

   bind() assigns the address specified to by addr to the socket referred to by the file descriptor sockfd.

我的问题是:

  1. 当我们在编写客户端程序时通常不调用 bind() 系统调用时,操作系统如何自动选择端口号。

  2. 当两个不同的应用程序使用相同的端口和 IP 组合连接到两个不同的服务器时,当这些服务器回复时,操作系统如何找出需要将哪个数据包重定向到哪个应用程序。

4

3 回答 3

2

当我们在编写客户端程序时通常不调用 bind() 系统调用时,操作系统如何自动选择端口号

操作系统会随机选择一个未使用的端口(不一定是“下一个”端口)。

操作系统如何找出哪个数据包需要重定向到哪个应用程序

每个 TCP 连接由一个 4 元组标识:(src_addr, src_port, dst_addr, dst_port),它是唯一的,因此足以识别每个段所属的位置。

编辑

当我们在编写客户端程序时通常不调用 bind() 系统调用时,操作系统如何自动选择端口号。

在 TCP 套接字的情况下,在“连接”之前的某个时间。例如,Linux 具有inet_csk_get_port获取未使用端口号的功能。inet_hash_connect在 中寻找tcp_v4_connect

于 2013-01-20T12:14:44.793 回答
0

对于 1:操作系统只选择下一个可用端口。
对于 2:它是基于 dst 端口完成的。客户端应用程序将通过不同的客户端端口连接到同一服务器

于 2013-01-20T12:12:22.177 回答
0

我认为对于客户端程序,操作系统在建立 TCP 连接后维护一个带有套接字 fd(由客户端打开)和服务器 IP+端口的表。因此,每当服务器回复时,操作系统可以针对特定服务器 IP+PORT 获取套接字 fd 和数据被写入套接字 fd。因此,在这个特定的套接字 fd 上,客户端可以使用服务器回复。

于 2013-09-15T16:20:19.583 回答