在研究计算机网络作为课程主题时,我的概念是操作系统根据目标端口区分数据包并将其传递给在该端口上运行的应用程序。
后来我发现我们可以使用相同的源(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.
我的问题是:
当我们在编写客户端程序时一般不调用bind()系统调用时,操作系统如何自动选择端口号。
当两个不同的应用程序使用相同的端口和IP组合连接到两个不同的服务器时,当这些服务器回复时,操作系统如何找出哪个数据包需要重定向到哪个应用程序。
答案 0 :(得分: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
。
答案 1 :(得分:0)
对于1:操作系统只选择下一个可用端口 对于2:它基于dst端口完成。客户端应用程序将通过不同的客户端端口连接到同一服务器
答案 2 :(得分:0)
我认为对于客户端程序OS在建立TCP连接后维护一个带有套接字fd(由客户端打开)和服务器IP +端口的表。所以每当服务器回复时,OS都可以针对特定服务器IP获取套接字fd + PORT和数据写入套接字fd。因此,客户端可以在此特定套接字fd上使用服务器回复。