当两个套接字之间建立 TCP 连接时,假设计算机中有多个 NIC,那么在建立通信之前,套接字将绑定到哪个 IP 地址 [或 - 将哪个 IP 地址传递给 bind() 函数]。这是由操作系统决定的吗?
基本上我有几个疑问:
- socket()、bind()、connect() 函数是否由操作系统调用?如果是,那么如果机器中有多个网卡,bind() 函数中会传递哪个 IP 地址?我知道我可能在某些地方错了,请纠正我
答案1
socket()、bind()、connect()函数是否由操作系统调用?
他们不叫经过操作系统——它们部分操作系统,因此它们被程序调用。
如果是,那么如果机器中有多个 NIC,那么在 bind() 函数中传递哪个 IP 地址?
大多数程序不指定任何地址。
当程序调用 bind() 来选择本地端口以接受入站连接时,它们可以使用特殊值
[::]
(又名 IN6ADDR_ANY_INIT)和0.0.0.0
(又名 INADDR_ANY)表示它们将接受连接到全部所有本地 NIC 上的地址(当前和将来的)。建立出站连接时,程序通常不会调用 bind()根本,让操作系统决定本地地址和本地端口。
每个操作系统的源地址选择逻辑略有不同。(例如,从 Windows 7/Srv2008 开始,操作系统将从出站接口中选择数字最小的地址。在 Linux 中,如果程序未选择源地址,则各个路由表条目可以有一个“首选”源地址供使用。)
当程序做指定本地地址,通常由用户选择,而不是由程序选择。(例如,大多数服务在其配置中都有一个“监听地址”设置。)