두 개의 소켓 사이에 TCP 연결이 설정되면 컴퓨터에 여러 개의 NIC가 있으므로 통신이 설정되기 전에 소켓이 어떤 IP 주소에 바인드할 것인지[또는 - 어떤 IP 주소가 바인드() 함수에 전달될 것인지] 가정합니다. OS에 따라 결정되나요?
기본적으로 몇 가지 의심이 있습니다.
- 소켓(), 바인드(), 연결() 함수가 OS에 의해 호출됩니까? 그렇다면 머신에 여러 NIC가 있는 경우 바인딩() 함수에 어떤 IP 주소가 전달됩니까? 제가 어떤 부분에서 틀렸을 수도 있다는 것을 알고 있습니다. 정정해 주십시오.
답변1
소켓(), 바인드(), 연결() 함수가 OS에 의해 호출됩니까?
그들은 호출되지 않았습니다~에 의해OS - 그들은부분의OS이므로 프로그램에서 호출합니다.
그렇다면 머신에 여러 NIC가 있는 경우 바인딩() 함수에 어떤 IP 주소가 전달됩니까?
대부분의 프로그램은 주소를 지정하지 않습니다.
프로그램이 인바운드 연결을 허용하기 위해 로컬 포트를 선택하기 위해 바인딩()을 호출할 때 다음 연결을 허용함을 나타내는 특수 값
[::]
(IN6ADDR_ANY_INIT라고도 함) 및 INADDR_ANY라고도 함 을 사용할 수 있습니다.0.0.0.0
모두모든 로컬 NIC의 주소(현재 및 미래).아웃바운드 연결을 만들 때 프로그램은 일반적으로 바인딩()을 호출하지 않습니다.조금도, OS가 로컬 주소와 로컬 포트를 모두 결정하도록 합니다.
각 OS에는 소스 주소 선택에 대한 논리가 약간 다릅니다. (예를 들어, Windows 7/Srv2008부터 OS는 아웃바운드 인터페이스에서 숫자상 가장 낮은 주소를 선택합니다. Linux에서 개별 라우팅 테이블 항목은 프로그램이 하나를 선택하지 않는 경우 사용할 "선호" 소스 주소를 가질 수 있습니다. .)
프로그램이 있을 때하다로컬 주소를 지정하면 프로그램이 아닌 사용자가 선택하는 경우가 많습니다. (예를 들어 대부분의 서비스에는 구성에 "수신 주소" 설정이 있습니다.)