동일한 포트가 클라이언트와 서버 역할을 모두 수행합니까?

동일한 포트가 클라이언트와 서버 역할을 모두 수행합니까?

이 netstat 출력에서 ​​이상한 점을 발견했습니다. 출력은 netstat -a -n -o -p TCPwin 7의 명령을 사용하여 수행됩니다.

 Proto  Local Address          Foreign Address        State           PID
 TCP    127.0.0.1:55486        127.0.0.1:55487        ESTABLISHED     5808
 TCP    127.0.0.1:55487        127.0.0.1:55486        ESTABLISHED     5808

이 두 줄을 참고하세요. 로컬 주소와 외국 주소는 모두 localhost입니다. 그런데 포트는 어떻게 페어링되나요? 두 개의 포트 중 어느 것이 서버 포트이고 어느 것이 클라이언트 포트입니까 55486?55487

내가 이해하는 바에 따르면 local-address열은 TCP 연결의 클라이언트 측을 나타내고 foreign-adress열은 서버 측을 나타냅니다. 이 출력에서 ​​동일한 포트가 두 클라이언트로 작동하는 것으로 보입니다.그리고섬기는 사람.

TCP로 이것이 어떻게 가능한지 모르겠습니다.

포트 쌍이 있는 netstat

답변1

선:TCP 127.0.0.1:55486 127.0.0.1:55487 ESTABLISHED 5808

클라이언트가 포트 55486을 사용하는 동안 클라이언트가 서버의 포트 55487에 연결하고 있음을 나타냅니다.

선: TCP 127.0.0.1:55487 127.0.0.1:55486 ESTABLISHED 5808

서버가 55487에서 포트 55486을 통해 클라이언트에 다시 연결되고 있음을 나타냅니다.

TCP는 클라이언트와 서버 간의 연결을 설정하기 위해 "3방향 핸드셰이크"가 필요합니다.

클라이언트는 서버에 연결합니다(3방향 핸드셰이크의 1부). 서버는 연결을 승인하여 응답합니다(2부). 클라이언트는 자체 승인으로 승인에 응답합니다(3부).

TL;DR - 클라이언트는 일반적으로 임의의 포트를 사용하여 특정 포트가 있는 서버에 연결합니다. 서버는 무작위 포트를 사용하여 해당 시스템에 다시 응답합니다. 클라이언트와 서버는아니다같은 포트에.

답변2

지금은 당신이 이 내용을 얼마나 이해하고 있는지 잘 모르겠습니다. 그러니 조금 현학적으로 말씀드리겠습니다.

Local Address당신은 클라이언트와 서버의 개념을 분명히 이해하고 있으므로 " 열은 TCP 연결의 클라이언트 측을 나타내고 열 Foreign Address은 서버 측을 나타냅니다." 라고 적는 것이 놀랍습니다. 그건 틀렸어요; 열 Local Address현지의TCP 연결의 측면과 Foreign Address열은 다음을 나타냅니다.외국의(또는원격) 옆. 즉, Local Address열은 프로세스가 수행하는 (TCP) 소켓을 나타냅니다.당신의 컴퓨터에서사용 중입니다(예: 컴퓨터가 사용하는 소켓).소유하다), Foreign Address열은 로컬 소켓이 연결된 소켓을 나타냅니다. 이해하신 것처럼 컴퓨터의 프로세스는 서버로 작동할 수 있으므로 로컬 소켓은 서버 소켓이 될 수 있습니다. 그러면 해당 클라이언트 소켓은 "외부"로 나열됩니다.

컴퓨터의 클라이언트 프로세스가 컴퓨터의 서버 프로세스에 연결되면 상황이 혼란스러워지기 시작합니다. 이제 이 하나의 연결은 두 개의 로컬 소켓을 나타내며 netstat각각에 대해 한 줄씩 보고합니다. 하나는 클라이언트를 로컬로 표시하고 서버는 외부로 표시합니다(실제로는 로컬 소켓임에도 불구하고). 다른 하나는 그 반대입니다.

귀하의 상황은 조금 더 혼란 스럽습니다. 물론 부두 서버(프로세스 5808)는 소켓을 생성하고 이에 대한 연결을 수락합니다. 이것이 바로 서버가 수행하는 작업입니다. 그러나 한 번에 많은 소켓을 생성하고 있습니다. (필요에 따라 서로 다른 포트 번호에 있습니다. OS에서는 동일한 프로토콜과 포트 번호를 가진 여러 소켓이 공존하는 것을 허용하지 않습니다.) 그리고 임의의(OS 할당) 포트 번호를 사용하는 것 같습니다. 예를 들어 지적하신 대로 포트 55484에서 수신 대기 중입니다. 저는 jetty에 익숙하지 않아서 이것이 정상인지는 모르겠습니다.

출력을 자세히 살펴보면 netstat포트 8081의 소켓을 사용하는 로컬 프로세스 184가 프로세스 5808/포트 55482에 연결되어 있음을 알 수 있습니다.

정말 이상하다고 생각되는 부분은 프로세스 5808이 연결되었다는 것입니다.그 자체로이 소켓 중 여러 개에. 따라서 동일한 호스트뿐만 아니라 두 소켓이 모두 유지되는 여러 TCP 연결이 있습니다.같은 과정에서. 어느 쪽이 클라이언트이고 어느 쪽이 서버인지 확실히 알 수는 없을 것 같습니다. 실제로 낮은 포트 번호가 서버일 가능성이 더 높다고 추측하지만 이는 단지 추측일 뿐입니다.

답변3

특이한 상황은 아닙니다. 127.0.0.1프로그램이 수신하는 유효한 IP 주소입니다. 프로그램은 이 주소에서 수신할 수 있습니다. 프로그램도 이 주소에 연결할 수 있습니다. 이는 클라이언트-서버 아키텍처를 준수합니다. 클라이언트가 있고 서버가 있습니다. 그들은 서로 다른 컴퓨터에 있을 수 있지만 동시에 둘 다 하나의 컴퓨터에 있을 수 있습니다.

예를 들어, Google 웹 사이트를 사용할 때 귀하의 컴퓨터는 클라이언트이고 Google의 웹 서버는 서버입니다. 귀하의 컴퓨터와 Google 서버가 연결되어 있습니다.

컴퓨터에서 실행되고 인터페이스에서 수신되는 자체 웹 서버를 가질 수 있습니다 127.0.0.1. 브라우저를 열고 입력 127.0.0.1하면 웹 서버의 웹 페이지가 표시됩니다. 이 상황에서는 netstat같은 내용이 표시됩니다.

귀하의 질문에 답변하려면:

이 출력에서 ​​동일한 포트가 클라이언트와 서버로 작동하는 것으로 보입니다.

아니요. 한 포트는 클라이언트이고 다른 포트는 서버입니다. 공지 - 그것하지 않습니다말하다

 TCP    127.0.0.1:55486        127.0.0.1:55486        ESTABLISHED     5808

그것은 말한다:

 TCP    127.0.0.1:55486        127.0.0.1:55487        ESTABLISHED     5808
 TCP    127.0.0.1:55487        127.0.0.1:55486        ESTABLISHED     5808

말이 되네요.

관련 정보