서버는 어떤 클라이언트 포트로 보낼지 어떻게 알아내나요?

서버는 어떤 클라이언트 포트로 보낼지 어떻게 알아내나요?

내가 이해한 바로는 클라이언트가 연결 요청을 하면 다음과 같은 일이 발생합니다.

  1. 서버는 특정 포트 번호에 바인딩됩니다. 포트 번호는 항상 수신 프로세스와 연결되어 있습니다. 서버만 들어오는 연결을 수신하고 있으므로 클라이언트 측에서 바인딩할 필요가 없습니다.
  2. 서버는 계속해서 이 포트 번호를 수신합니다.
  3. connect()클라이언트가 요청을 보냅니다 .
  4. 서버는 승인 요청을 사용합니다 accept(). 서버가 클라이언트 요청을 수락하면 커널은 추가 작업을 위해 서버에 임의의 포트 번호를 할당합니다. send()서버 receive()의 동일한 포트 번호를 전송 및 수신에 사용할 수 없고 이전 포트가 여전히 새 연결을 수신하고 있기 때문입니다.

이 모든 것을 고려할 때 서버는 클라이언트가 어느 포트에서 데이터를 수신하고 있는지 어떻게 알 수 있습니까? 클라이언트가 소스 포트와 대상 포트가 포함된 TCP 세그먼트를 보낼 것이라는 것을 알고 있으므로 서버는 해당 세그먼트의 소스 포트를 대상 포트로 사용하지만 서버는 해당 포트를 찾기 위해 어떤 함수를 호출합니까? 응 accept()?

답변1

이는 패킷의 TCP(또는 UDP 등) 헤더의 일부입니다. 따라서 클라이언트가 지시하기 때문에 서버는 알아냅니다. 이는 클라이언트 IP 주소(IP 헤더의 일부)를 찾는 방법과 유사합니다.

예를 들어 모든 TCP 패킷에는 IP 헤더(최소 소스 IP, 대상 IP 및 프로토콜[TCP] 포함)가 포함되어 있습니다. 그런 다음 TCP 헤더(소스 및 대상 포트 등 포함)가 옵니다.

커널이 원격 IP가 10.11.12.13(IP 헤더에서)이고 원격 포트가 12345(TCP 헤더에서)인 SYN 패킷(TCP 연결의 시작)을 수신하면 원격 IP와 포트를 알게 됩니다. SYN|ACK를 다시 보냅니다. ACK가 수신되면 listen호출은 연결에 설정된 새 소켓을 반환합니다.

TCP 소켓은 4가지 값(원격 IP, 로컬 IP, 원격 포트, 로컬 포트)으로 고유하게 식별됩니다. 적어도 하나가 다른 한 여러 개의 연결/소켓을 가질 수 있습니다.

일반적으로 로컬 포트와 로컬 IP는 서버 프로세스에 대한 모든 연결에 대해 동일합니다(예: sshd에 대한 모든 연결은 local-ip:22에 있음). 원격 컴퓨터가 여러 연결을 만드는 경우 각 연결은 서로 다른 원격 포트를 사용합니다. 따라서 원격 포트를 제외한 모든 것은 동일하지만 괜찮습니다. 4개의 포트 중 하나만 달라야 합니다.

예를 들어, wirehsark를 사용하여 패킷을 볼 수 있으며 모든 데이터에 태그가 지정됩니다. 다음은 강조 표시된 소스 포트입니다(디코딩된 패킷에서 강조 표시되고 하단의 16진수 덤프에 유의하세요).

Wireshark는 TCP SYN 패킷을 표시합니다.

답변2

"연결 요청( connect()보통 클라이언트 프로그램의 시스템 호출)으로 인해세 번의 악수. 3방향 핸드셰이크(클라이언트에서 서버로)의 첫 번째 패킷에는 SYN 플래그가 설정되어 있으며 클라이언트 프로그램 커널에서 할당한 TCP 포트 번호가 포함되어 있습니다.

당신은 할 수 있습니다Nmap 및 자연 SYN 패킷에 대한 기사. Nmap SYN 패킷 디코딩에는 "source.60058 > dest.22"라는 문구가 있습니다. 디코딩된 "적법한 SYN 패킷"에는 "source.35970 > dest.80"이라는 문구가 포함되어 있습니다. 이 두 개의 SYN 패킷은 이 패킷이 각각 TCP 포트 60058과 35970에서 왔다는 것을 원격 커널에 알려줍니다.

답변3

TCP 소켓은 스트림 지향 소켓입니다. 두 개의 소켓 설명자(귀하와 동료가 소유함)가 안정적으로 연결됩니다. 따라서 클라이언트 포트에 대해 걱정할 필요가 없습니다. 소켓 설명자를 작성하기만 하면 됩니다!

또한, 정말로 알고 싶다면(아마도 기록을 위해), 자유롭게 getsockname(2)을 사용하세요.

답변4

연결은 튜플(소스 IP, 소스 포트, 대상 IP, 대상 포트)로 정의됩니다. 대답은 정반대입니다.

관련 정보