2017-12-27 10 views
2

TCP/IP 기본 사항을 배우고 있습니다. 서버가 1024 번 포트를 열고 클라이언트가 메시지를 보낼 수있는 서버 - 클라이언트 채팅 응용 프로그램을 만들었습니다. 나는 약간의 서버와 클라이언트에 의해 교환 된 TCP/IP 패킷의 내용에 대해 혼란 스럽다. 클라이언트가 서버에 메시지를 보내면 이더넷을 통해 패킷으로 이동합니다. 클라이언트의 이더넷 프레임에서 데이터 필드는 TCP/IP 형식으로 인코딩됩니다. TCP/IP 프레임에서 대상 포트는 1024가됩니다.하지만 소스 포트의 값은 무엇입니까? 클라이언트가 포트를 열지 않습니다. 서버 만 포트를 엽니 다. 또한 PC에서 보내고받은 TCP/IP 패킷을 모니터하는 방법이 있는지 알고 싶습니다.TCP/IP 패킷의 포트 번호

+0

"클라이언트가 포트를 열지 않습니다"라는 것은 아닙니다. 운영 체제는 클라이언트 프로세스를 사용 가능한 포트로 바인드합니다. 즉 클라이언트 측의 특정 포트와 운영 체제에 대해 특별히 요구하지 않는 것입니다 그 시간에 사용 가능한 포트에 클라이언트 프로세스를 바인딩합니다. – tkhurana96

+0

서버가 클라이언트에 정상적으로 응답 할 수 있어야하므로 클라이언트가 임의의 포트를 선택하고 서버에 응답을 보낼 수 있음을 알립니다. Wireshark는 적절하게 https://www.wireshark.org/ 모니터링을위한 최상의 도구입니다 –

답변

2

multiple layers involve here을 잊지 마세요. TCP, IP 및 이더넷은 종종 함께 사용 되더라도 서로 다른 것입니다. 분리를 염두에 두는 것이 중요합니다. 이더넷 (레이어 2)은 개별 컴퓨터를 연결하는 프로토콜이지만 IP 주소가 무엇인지는 신경 쓰지 않습니다. IP는 훨씬 더 큰 규모로 컴퓨터를 연결하기 때문에 이더넷이 그 중 하나 일뿐 아니라 다양한 "계층 2"네트워크 기술을 통해 라우팅되고 전송 될 수 있습니다.

IETF 인터넷 프로토콜의 장점은 모두 thoroughly documented이므로 내부적으로 어떻게 작동하는지 확인할 수 있습니다. IP의 최상위에서 작동하는 TCP의 경우 포트 번호가 TCP 계층에 있습니다. IP 자체는 그 (것)들에 관하여 걱정하지 않으며, 근원과 목적지 주소에 관하여서만 염려한다.

는 키는 TCP 헤더를 설명하는 다이어그램 바로 여기에 있습니다 :

0     1     2     3 
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |   Source Port   |  Destination Port  | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |      Sequence Number      | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |     Acknowledgment Number      | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    | Data |   |U|A|P|R|S|F|        | 
    | Offset| Reserved |R|C|S|S|Y|I|   Window    | 
    |  |   |G|K|H|T|N|N|        | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |   Checksum   |   Urgent Pointer  | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |     Options     | Padding | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |        data        | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

소스 및 대상 포트 모두가 채워야합니다. 이는 시스템의 IP 스택이 어떤 패킷이 어떤 연결과 관련되는지 추적하는 핵심 구성 요소입니다.

일반적으로 서버에 연결하는 코드를 작성할 때 연결은 (임의의) 임의의 원본 포트에서 시작됩니다. 포트에서 수신 대기하는 서버 프로세스를 생성하면 해당 포트를 자동으로 할당하거나 설정할 수 있습니다.

HTTP와 같은 서비스의 경우 다른 클라이언트가 해당 서비스에 연결하게하려면 해당 포트를 80으로 고정해야하므로 자동 할당이 도움이되지 않습니다. 경우에 따라 자동 할당이 바람직하기 때문에 충돌이 발생하지 않습니다.

tcpdump 또는 Wireshark과 같은 도구를 사용하여이 모든 것을 모니터링 할 수 있습니다. 그들은 다양한 계층을 파헤 치고 진행 상황을 보여줄 수 있습니다.

+0

감사. VB에서 TCP 서버 및 클라이언트 응용 프로그램을 만들고 클라이언트와 서버간에 성공적으로 데이터를 보내거나받습니다. 서버는 내 랩톱의 집 WiFi 네트워크에서 포트 1234를 사용 중입니다.그러나 Wireshark는 해당 포트에서 클라이언트와 서버간에 교환하는 프레임을 표시하지 않습니다. 내가 명령 프롬프트를 확인, 포트 1234 거기에 활성 표시됩니다. 그 이유는 무엇일까요? –

+0

올바른 인터페이스에서 "듣고"있는지 확인하십시오. WiFi를 사용할 때 실수로 이더넷 포트에서 청취하기 쉽고 그 반대의 경우도 마찬가지입니다. 그것들은 두 개의 서로 다른 하드웨어 인터페이스이며, "루프백"또는 localhost 인터페이스는 종종 세 번째 인터페이스입니다. – tadman

+0

둘 다 localhost 127.0.0.1에 있습니다. 그래서 내 와이파이와 아무 상관 없소? –

1

포트 번호는 server/client에서 실행중인 프로세스를 식별하는 데 사용되는 논리적 엔티티/번호입니다. 서버 애플리케이션에 포트 번호 (사용자가 결정한 포트 번호)가있는 것처럼 클라이언트 애플리케이션에도 OS에서 할당 한 포트 번호가 연결됩니다. cmd 프롬프트에 netstat -ab을 입력하면 프로세스 목록과 명령에서 제공하는 해당 포트 번호에서 클라이언트 응용 프로그램과 연결된 포트 번호를 볼 수 있습니다.