套接字编程:bind()系统调用

时间:2013-01-20 12:09:44

标签: sockets networking

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

后来我发现我们可以使用相同的源(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组合连接到两个不同的服务器时,当这些服务器回复时,操作系统如何找出哪个数据包需要重定向到哪个应用程序。

3 个答案:

答案 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上使用服务器回复。