TCP 연결의 활성/수동 끝을 확인하는 방법

TCP 연결의 활성/수동 끝을 확인하는 방법

반환된 TCP 연결에 대한 정보를 확인하면sock_diag(7)(또는/proc/net/tcp), 주어진 연결이 연결을 소유한 로컬 측에서 발생했는지 확인하는 방법수동적인, 청취 소켓 또는 활성 연결 소켓?

고쳐 쓰다저는 API 수준에서 이 작업을 수행하는 데 관심이 있습니다. 즉, ss명령을 시작하거나 기다리지 않고 수행하는 것입니다 netstat.

답변1

동일한 로컬 IP + 로컬 포트 ​​조합을 사용하여 여러 연결을 감지하는 경우 이러한 연결이 형성될 때 시스템은 수동 엔드포인트입니다. 나가는 연결에 로컬 포트 ​​+ 로컬 IP 조합이 사용되는 경우 일반적으로 다른 프로세스는 동일한 로컬 IP와 동일한 로컬 포트를 다른 용도로 사용할 수 없습니다.

일단 설정되면 TCP 연결은 완전히 대칭적이어야 하므로 연결이 인바운드 또는 아웃바운드 방향으로 설정되었는지 여부를 알려주는 연결 자체와 관련된 속성이 없을 수 있습니다. 동일한 로컬 IP를 사용하는 청취 소켓이나 다른 연결을 감지하는 경우 + 포트 쌍을 사용하면 이러한 모든 연결이 들어오는 연결임을 확신할 수 있습니다.

그러나 연결이 하나만 표시되고 일치하는 청취 소켓이 없으면 확실하게 알 수 없습니다. 나가는 연결일 수도 있고, 현재 닫히고 새 연결 수신을 중지한 서비스에 대한 마지막 남은 수신 연결일 수도 있습니다.

일부 포트 번호 기반 휴리스틱이 적용될 수 있습니다. 로컬 포트 ​​번호가 지정된 범위 내에 있으면 /proc/sys/net/ipv4/ip_local_port_range나가는 연결일 가능성이 높으며, 이전 서비스를 사용하지 않는 한 1024 미만인 경우 들어오는 포트일 가능성이 높습니다. , 이 서비스는 나가는 연결이 루트 포트에서만 시작되어야 함을 요구합니다(일부 NIS 서비스나 유사한 서비스에는 이 요구 사항이 있다고 생각합니다).

관련 정보