在以下两种场景需要确定端口(不考虑reuse和time_wait):
1.bind调用时
2.connect时
需要注意的是,1和2是不一样的,在调用bind时,目的ip和目的端口并不知道,因此需要严格和本机其它的ip/端口对区别开来,在绑定地址或者设备的情况下,两个绑定不同本地地址或者绑定不同设备的socket可以使用同一端口,如果选定了一个端口,只要使用该端口的socket中(包括它自己)有一个不绑定ip或者设备,这个端口就不能被再次使用。
     在2的情况下,由于已经确定了目的ip和端口,因此“一个连接-虚拟链路”已经确定,因此只要对端ip/port不一样,即使本机使用相同的ip/port对都无所谓。本质上socket在connect之前属于游离的,connect之后就是确定的了,为了通信需要明确两个端点,只要这两个端点构造的虚拟链路能和其它的虚拟链路区分出来即可。因此我们不妨将下面的第一个参数改小一些,从而使本机可以连接更多的机器:
sysctl net.ipv4.ip_local_port_range="X 61000"