이것은 TCP 포트의 작동 방식을 더 잘 이해하는 데 도움이 되는 가상의 질문입니다.
내 컴퓨터에 여러 개의 이더넷 카드가 있고 서로 다른 서브넷에 연결되어 있다고 가정해 보겠습니다. 이제 로컬 주소/포트를 바인딩하지 않고 TCP를 통해 원격 시스템에 연결하려는 경우 커널이 IP 주소와 포트를 자동으로 결정합니다.
제가 이해한 바에 따르면 커널은 인터페이스의 기본 IP를 기반으로 IP 주소를 선택하고 인터페이스는 라우팅 테이블을 기반으로 선택됩니다.
TCP 포트 부분의 경우 커널은 사용되지 않은(임시) 포트를 찾아줍니다. 문제는 커널이 IP 주소에 사용되는 TCP 포트를 예약하는가입니다. 즉, 이미 포트(인터페이스 A의 IP라고 가정)를 사용했고 a.b.c.d:12345
이제 패킷이 인터페이스 B에서 나가야 하는 경우 해당 포트 e.f.g.h:12345
(인터페이스 B의 IP라고 가정)를 사용할 수 있습니까?
나는 어느 쪽이든 논쟁을 생각할 수 있습니다. 설정된 TCP 연결은 로컬/원격 IP/포트 4-튜플로 식별되므로 대답은 yes
'포트를 다시 사용할 수 있습니다' 인 것 같습니다 12345
. 그러나 TCP 계층을 준비할 때 커널은 라우팅 정보(즉, 인터페이스, 즉 소스 IP)를 알지 못하므로 커널이 TCP 계층에서 IP 종속 무료 TCP 포트를 할당하는 것은 불가능합니다. IP 계층까지 내려갑니다.
커널 함수inet_csk_get_port
hinfo->bhash
포트 번호만 해시 키로 사용하여 테이블을 스캔합니다 . 이는 임시 포트가 전역적으로 고유하다는 것을 의미합니까? 이것이 사실이라면 유용합니다. 여기서 몇 가지 중요한 사실을 놓치고 있습니까? 누군가가 이것을 명확히하는 데 도움을 줄 수 있기를 바랍니다. 감사해요!