
이것은 TCP 포트의 작동 방식을 더 잘 이해하는 데 도움이 되는 가상의 질문입니다.
내 컴퓨터에 여러 개의 이더넷 카드가 있고 서로 다른 서브넷에 연결되어 있다고 가정합니다. 이제 로컬 주소/포트를 바인딩하지 않고 TCP를 통해 원격 시스템에 연결하려는 경우 커널이 IP 주소와 포트를 결정합니다.
내가 이해하는 바는 커널이 인터페이스의 기본 IP를 기반으로 IP 주소를 선택하고 인터페이스는 라우팅 테이블에 따라 선택된다는 것입니다.
TCP 포트 부분의 경우 커널은 사용되지 않은(임시) 포트를 찾아줍니다. 질문은 커널이 사용된 TCP 포트를 IP 주소로 유지합니까, 아니면 그렇지 않습니까?입니다. 즉, 포트(인터페이스 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
해시 키용으로 포트 번호만 사용하는 테이블을 스캔합니다 . 이는 임시 포트가 전역적으로 고유하다는 것을 의미합니까? 이것이 사실이라면 .NET에 여러 네트워크 카드가 있는 시스템의 경우 리소스 낭비처럼 들립니다. 여기서 몇 가지 중요한 사실을 놓쳤습니까? 누군가가 이것을 명확히하는 데 도움을 줄 수 있기를 바랍니다. 감사해요!