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共享同一埠。