A. 在以太网属性中microsoft网络适配器多路传送协议打钩后点
在以太网属性中,当您在 Microsoft 网络适配器多路传送协议设置选项中打钩后,点确认,电脑之间的通讯机制会发生微妙的改变。电脑接收的数据会暂时存储在接收缓冲区Recv-Q中,等待相应应用程序的取用。那么,如何让正确的应用程序取出数据呢?这便是传输层端口的作用。
在操作系统中,每个正在运行的应用程序被称作进程,拥有独一无二的进程号PID(Process ID),它如同应用程序的身份证,确保每个进程的唯一性。然而,尽管报文中的数据被发送给特定的IP地址,如何告知正确的应用程序获取数据?答案在于传输层的端口概念。
传输层首部包含了源端口号和目的端口号,这两个字段分别标识了源主机的源应用程序和目的主机的目的应用程序。当应用程序希望与其他应用通信时,首先需要调用Bind(address, port)函数,将进程与本机IP地址及端口号绑定。以进程A为例,假设其PID为4088,欲进行通信,首先创建一个socket套接字(TCP或UDP),并用此套接字调用Bind('1.1.1.1',50001),系统将记录这一绑定。
若主机接收到报文,通过解析网络层首部获取目的IP地址,再解析传输层首部提取目的端口号,若两者组合(1.1.1.1,50001)与绑定信息匹配,操作系统便能精准地将数据传递给PID为4088的应用程序。然而,同一目的端口号(50001)只能被一个进程绑定,若需另一进程通信,要么先解绑原进程,关闭socket;或使用socket的端口重用参数,允许(1.1.1.1,50001)被其他应用绑定,但旧绑定将被新绑定替代;再或改用不同端口或IP地址。
若进程B希望与进程A通信,其可以尝试Bind('1.1.1.1',60001)或Bind('2.2.2.2',50001)。若代码需要在不同机器上运行,且目标机器IP地址未知,可采用Bind('',60001),表示接收任意IP地址的连接。TC8测试启动UpperTester时,仅指定端口号并未指定IP地址,使连接更加灵活,避免在每台机器上分别创建UDPSocket。
至于进程B是否可以与已绑定(1.1.1.1,50001)的进程A同时绑定('1.1.1.1',50001),答案是否定的。因为(1.1.1.1,50001)只能被一个进程绑定,('1.1.1.1',50001)的组合包含了所有可能的IP地址和端口号组合,这意味着B进程必须选择不同的IP地址或端口号,以避免与进程A共享同一端口。