내 컴퓨터의 개인 IP 주소는 192.168.44.182입니다. 다음을 사용하여 프로세스를 시작하면
nc -l localhost 20000
그러면 이 프로세스는 192.168.44.182로 전송된 요청을 처리하지 않습니다.
localhost:20000에서 수신 대기하는 프로세스는 실제로 LAN IP가 192.168.44.182인 물리적 시스템에서 실행되고 있으므로 프로세스가 192.168.44.182에 대한 요청을 어떻게 무시하는지 궁금합니다.
이러한 요청이 실제로 프로세스에서 무시되고 있습니까? 아니면 이러한 요청이 127.0.0.1의 네트워크 인터페이스로 전혀 전달되지 않습니까? 이것이 네트워크 계층 메커니즘입니까, 아니면 링크 계층 메커니즘입니까?
답변1
청취 소켓을 설정할 때 바인딩할 로컬 주소를 선택할 수 있습니다. 이는 바인딩(2) 시스템 호출을 통해 수행됩니다. (0.0.0.0으로 바인딩하도록 선택할 수도 있습니다. 이는 모든 로컬 주소를 수신한다는 의미입니다.)
netcat에게 localhost를 수신하라고 지시합니다. 따라서 소켓 주소로 127.0.0.1(또는 이와 유사한 것)을 사용하여 바인딩(2)을 호출합니다. 따라서 커널은 청취 소켓을 해당 주소에만 바인딩합니다.
192.168.44.182:20000에 연결 요청이 들어오면 커널은 청취 소켓 목록을 살펴보고 소켓을 찾지 못합니다. 그래서 커널은 연결을 거부했습니다.
요청이 127.0.0.1:20000에 오면 커널은 청취 소켓을 찾고 accept(2) 시스템 호출은 netcat에 이에 대해 알립니다.
netcat이 모든 인터페이스를 수신하도록 하려면 호스트:를 생략하거나 nc -l -p 20000
0.0.0.0:을 지정하십시오 nc -l 0.0.0.0 -p 20000
. 청취할 특정 IP 주소(192.168.44.182)를 지정할 수도 있지만 이는 nc localhost 20000
물론 거부됩니다.
(예를 들어 보안상의 이유로 동일한 시스템의 연결만 허용하려는 경우 localhost에 바인딩하는 경우가 많습니다.)
답변2
모든 소켓에는 2가지 특성이 연관되어 있습니다. 주소와 포트. 각 인터페이스에서 수신 대기 중인 소켓은 실제로 하나의 주소를 수신합니다 INADDR_ANY
. 즉 0.0.0.0
, 소켓에 수신 중임을 알리므로 127.0.0.1
컴퓨터의 다른 주소에 대한 모든 요청을 무시합니다.