-
포트란? (쉽게 설명, 쉽게 비유)AWS 2024. 11. 30. 17:44
포트는 컴퓨터가 인터넷에서 서로 다른 프로그램과 소통하기 위해 사용하는 문(창문처럼 생각해도 좋아요)입니다.
비유를 활용한 설명
1. 컴퓨터는 집
- 컴퓨터는 하나의 집이라고 생각해보세요.
- 집에는 많은 **창문(포트)**이 있는데, 각 창문은 특정한 일을 맡고 있어요.
2. 포트 번호는 창문의 주소
- 각 창문 위에 숫자가 적혀 있어요. 예를 들어, 80번 창문, 443번 창문처럼요.
- 포트 번호는 그 창문이 어떤 종류의 데이터를 받을지 알려줘요.
3. 데이터는 배달 물건
- 인터넷으로 오는 데이터는 배달 물건과 같아요.
- 배달부는 이 물건을 적힌 창문 번호에 맞게 전달해요. 예를 들어:
- HTTP (웹페이지): 80번 창문.
- FTP (파일 전송): 21번 창문.
- SMTP (이메일): 25번 창문.
깊이 있는 설명
- 기본 포트
- 잘 알려진 프로그램들은 항상 같은 포트를 사용해요. 이를 표준 포트라고 해요.
- 예: 80번 (웹), 443번 (보안 웹), 25번 (이메일).
- 동적 포트
- 컴퓨터가 임시로 사용하는 포트들도 있어요. 프로그램끼리 소통하려고 할 때 사용하는 포트는 임의의 번호로 할당돼요.
- 방화벽
- 집에 문지기(방화벽)를 두어 어떤 창문은 잠가버릴 수도 있어요. 이렇게 하면 외부에서 그 창문으로 접근하지 못하도록 막을 수 있어요.
1. 왜 전송 계층(Transport Layer)이 필요한가?
- 네트워크 계층(IP 주소를 기반으로 통신)은 두 컴퓨터 간 데이터를 전달할 수는 있지만, 컴퓨터 내 어떤 프로그램으로 데이터를 보낼지는 모릅니다.
- 전송 계층에서는 포트 번호를 사용해 컴퓨터 내 프로그램들을 구별합니다.
- 예: 클라이언트의 웹 브라우저(동적 포트)가 웹 서버의 HTTP 서비스(표준 포트 80)와 연결.
2. 동적 포트를 사용하는 이유
- 동적 포트는 클라이언트 측에서 임시로 생성되며, 이를 통해 여러 프로그램이 동시에 인터넷을 사용할 수 있습니다.
- 표준 포트는 서버가 고정된 주소로 서비스를 제공하도록 하기 위해 필요합니다.
- 예: 여러 클라이언트가 웹 서버의 HTTP(80번) 서비스에 접속하지만, 클라이언트는 각각 다른 동적 포트를 통해 응답을 받을 수 있습니다.
3. 과정 설명
1) 클라이언트가 요청을 시작
- 클라이언트는 임의의 동적 포트(49152~65535 사이)를 생성하고, 웹 서버의 IP 주소와 표준 포트 번호(80번)를 사용해 요청을 보냅니다.
- 예: 클라이언트 동적 포트 52341 → 서버 IP 192.168.1.1:80.
2) 네트워크 계층(IP 주소를 기반으로 전송)
- 요청은 네트워크 계층을 통해 목적지 서버의 IP 주소로 전달됩니다.
3) 전송 계층에서 포트 번호 확인
- 서버는 80번 포트를 보고 어떤 프로그램(예: 웹 서버 소프트웨어)으로 데이터를 전달할지 결정합니다.
4) 서버가 응답
- 서버는 응답 데이터를 전송 계층으로 전달하고, 클라이언트의 동적 포트 번호를 보고 해당 포트로 데이터를 되돌려 보냅니다.
- 서버 80번 포트 → 클라이언트 동적 포트 52341.
5) 클라이언트가 응답 수신
- 클라이언트는 동적 포트를 통해 정확히 자신의 요청에 대한 응답을 수신합니다.
4. 이 계층과 과정의 필요성
1) 포트 번호를 통한 다중화
- 같은 컴퓨터에서 여러 프로그램이 인터넷에 접속하더라도, 각 요청을 구별할 수 있습니다.
- 예: 클라이언트에서 웹 브라우저(52341)와 이메일 클라이언트(52342)가 동시에 동작.
2) 신뢰성 보장
- 전송 계층(TCP)의 순서 보장과 데이터 확인 기능으로 요청과 응답이 손실되지 않도록 합니다.
3) 확장성
- 동적 포트를 사용하면 클라이언트 측에서 포트 번호를 고정할 필요 없이, 동시에 많은 요청을 처리할 수 있습니다.
5. 추가적인 기술적 특징
- NAT(Network Address Translation): 내부 네트워크에서 공유 IP를 사용하는 경우, 클라이언트의 동적 포트와 서버의 표준 포트를 매핑해 데이터를 주고받습니다.
- 방화벽과 보안: 특정 표준 포트를 개방하거나 클라이언트의 동적 포트를 관리하여 외부 접근을 제어할 수 있습니다.
예시로 이해하기
비유:
- 클라이언트의 동적 포트는 택배 상자에 적힌 임시 송신자 주소입니다.
- 서버의 표준 포트는 **항상 같은 장소(예: 웹 서버의 접수 창구)**입니다.
- 요청한 송신자 주소를 기준으로 서버는 정확한 응답을 돌려보냅니다.
>>고정 포트를 사용하는 서버는 약간 우체국 같은거라고 생각하고 클라이언트는 우리라고 생각하자.
여기서 질문!
🤔클라이언트의 동적 포트가 변경되면?
클라이언트와 서버의 통신 중에 클라이언트의 동적 포트가 변경되는 경우는 일반적으로 문제가 발생할 가능성이 높습니다. 하지만 대부분의 네트워크 환경과 프로토콜은 이를 방지하거나 문제를 최소화하기 위해 설계되어 있습니다.
답변
1. 클라이언트 포트 변경이 발생하는 이유
- 네트워크 재설정: 클라이언트 장치가 네트워크에서 잠시 끊겼다가 다시 연결될 때.
- NAT 재매핑: NAT 장비가 세션 정보를 잃거나 새로운 포트를 재할당할 때.
- 응용 프로그램의 동작: 클라이언트 소프트웨어가 재시작되거나 세션을 갱신할 때.
2. 포트 변경이 통신에 미치는 영향
TCP 통신의 경우
- TCP 연결은 클라이언트의 IP 주소와 동적 포트, 서버의 IP 주소와 표준 포트로 정의됩니다. 이를 **소켓(4튜플)**이라고 합니다.
- 예: (클라이언트 IP, 동적 포트, 서버 IP, 서버 포트)
- 클라이언트 동적 포트가 변경되면 기존 소켓이 유효하지 않으므로, 기존 연결이 끊어지고 통신이 중단됩니다.
- 서버는 클라이언트의 새로운 포트를 알 수 없기 때문에, 새로운 연결을 수립해야 합니다.
UDP 통신의 경우
- UDP는 비연결 지향적이기 때문에 포트가 변경되더라도 직접적으로 연결에 영향을 미치지 않습니다.
- 하지만 서버는 기존 포트를 통해 응답을 보내려고 하기 때문에, 응답이 잘못된 포트로 전달되거나 클라이언트가 응답을 수신하지 못할 수 있습니다.
3. NAT에서의 포트 변경
- NAT는 내부 IP와 포트를 외부 IP와 포트로 매핑하는 장비입니다.
- 포트가 변경되는 이유:
- NAT는 일반적으로 Idle Timeout 설정이 있습니다. 클라이언트와 서버 간 활동이 없으면 NAT 매핑이 제거될 수 있습니다.
- 네트워크가 끊겼다가 다시 연결되면 NAT가 새로운 포트를 재할당할 수 있습니다.
- 문제: 클라이언트와 서버 간 세션이 계속 유지되어야 하는 경우, 포트 변경으로 인해 연결이 끊길 수 있습니다.
4. 해결 방안
TCP 연결 유지
- Keep-Alive:
- TCP의 Keep-Alive 옵션을 사용하면 주기적으로 패킷을 전송하여 세션이 유지됩니다.
- 이를 통해 NAT의 매핑이 만료되지 않도록 방지할 수 있습니다.
- 세션 재수립:
- 클라이언트의 포트가 변경되면 새롭게 TCP 연결을 수립해야 합니다.
- 일반적으로 애플리케이션 수준에서 이 작업을 처리합니다.
UDP 연결 유지
- STUN/TURN 서버 사용:
- NAT 환경에서 클라이언트가 자신의 외부 포트를 알 수 있도록 STUN/TURN 서버를 사용합니다.
- 이를 통해 클라이언트는 외부 포트가 변경되었는지 감지할 수 있습니다.
- 애플리케이션 레벨 재전송:
- 애플리케이션은 패킷 전송 실패를 감지하고, 새로운 포트로 데이터를 재전송할 수 있도록 설계됩니다.
NAT Timeout 방지
- 주기적인 데이터 전송:
- 일정 간격으로 패킷을 전송하여 NAT의 매핑이 유지되도록 합니다.
- NAT 테이블 크기 조정:
- NAT 장비의 설정을 통해 매핑 타임아웃을 늘리거나, 매핑 정보를 더 오래 유지하도록 구성합니다.
5. 실제 사례
- VoIP(Voice over IP):
- VoIP 애플리케이션은 UDP 기반으로 작동하며, NAT 환경에서 포트가 변경될 가능성이 큽니다.
- 이를 해결하기 위해 STUN/TURN 및 ICE(Interactive Connectivity Establishment) 프로토콜을 사용해 연결 안정성을 확보합니다.
- 웹 브라우저:
- TCP 기반의 HTTP/HTTPS는 세션이 끊어질 경우 새 연결을 자동으로 수립합니다.
- 대부분의 경우 포트 변경은 사용자가 인식하지 못할 정도로 빠르게 복구됩니다.
결론
- 포트 변경은 연결에 영향을 미치지만, 이를 방지하거나 복구하는 다양한 기술이 존재합니다.
- 프로토콜(TCP/UDP)과 네트워크 장치(NAT)의 설정에 따라 문제를 최소화할 수 있으며, 애플리케이션 수준에서 재연결 로직을 구현해 안정성을 높일 수 있습니다.
🤔 내가 80번에서 진행하던건 모두 날라가고 서버는 다시 첫 80포트의 첫화면을 전달하는거야?
1. TCP 연결에서 포트 변경의 결과
- TCP는 연결 지향적이기 때문에, 포트 변경은 연결 종료와 같아요.
- 만약 클라이언트와 서버 간의 연결이 끊기면 서버는 클라이언트의 상태 정보를 잃어버립니다.
- 이 경우, 서버는 새로운 연결 요청을 받았다고 판단하고 **처음 화면(초기 상태)**을 전달하게 됩니다.
2. 웹 서버에서 일반적으로 발생하는 상황
1) 상태가 없는 HTTP
- HTTP는 기본적으로 상태 비저장(stateless) 프로토콜이에요.
- 서버는 매번 클라이언트의 요청을 독립적으로 처리하며, 이전 요청의 상태를 기억하지 않습니다.
- 클라이언트가 새로운 동적 포트로 다시 요청을 보내면, 서버는 이를 새로운 사용자로 간주하고 처음부터 응답합니다.
2) 상태가 있는 세션 관리
- 웹 애플리케이션에서는 보통 세션 관리 기술을 사용해 사용자의 상태를 유지합니다.
- 예: 쇼핑몰에서 장바구니 상태 유지.
- 세션 관리 방법:
- 쿠키: 클라이언트에 상태 정보를 저장.
- 세션 스토리지: 서버에서 세션 ID를 통해 상태를 유지.
- JWT: 클라이언트에 상태를 인코딩하여 전달.
3. 포트 변경 시의 처리 방식
1) 클라이언트가 새 연결을 수립
- 클라이언트는 새로운 포트로 서버의 80번 포트에 연결을 요청합니다.
- 만약 서버가 상태를 저장하지 않았다면, 클라이언트는 새로운 세션을 시작하게 됩니다.
2) 서버가 세션 정보를 유지하는 경우
- 서버는 세션 ID(쿠키 또는 URL에 포함된 값)를 통해 클라이언트를 식별합니다.
- 새로운 연결이 수립되더라도 클라이언트가 이전 세션을 이어서 작업할 수 있도록 도와줍니다.
- 예: 로그인 유지, 쇼핑몰 장바구니 데이터 복구.
3) 포트 변경 후 데이터 복구
- HTTP/HTTPS 기반의 웹 애플리케이션에서는 클라이언트의 요청마다 상태 정보를 함께 전달하기 때문에, 기존 데이터를 잃어버리지 않습니다.
- 예: 클라이언트가 쿠키를 통해 로그인 정보를 서버로 전달.
4. 결론적으로 어떤 일이 발생하나요?
- 서버가 세션을 유지하지 않는다면:
- 클라이언트의 포트 변경으로 인해 기존 상태를 잃고, 서버는 첫 화면을 전달합니다.
- 서버가 세션을 유지한다면:
- 클라이언트가 새로운 포트를 사용하더라도 서버는 클라이언트의 상태를 복구하여 이전 작업을 이어갈 수 있습니다.
5. 포트 변경을 처리하는 방법
- HTTP의 상태 관리 방법:
- 쿠키: 클라이언트에 세션 ID 저장.
- URL 리다이렉션: 세션 ID를 URL에 포함시켜 클라이언트의 상태를 추적.
- JWT: 클라이언트에 상태 정보를 인코딩하여 전달.
- 실시간 애플리케이션(TCP 기반):
- 연결이 끊어지면 클라이언트가 재연결을 시도하고, 서버는 상태를 복구할 수 있도록 설계해야 합니다.
- 예: 온라인 게임이나 채팅 애플리케이션에서는 연결 끊김 후 상태 동기화 로직이 필요.
예시로 이해하기
상황:
- 사용자가 80번 포트에서 쇼핑몰의 장바구니에 물건을 추가하고 있다가 포트가 변경되었다고 가정.
- 세션이 없는 서버:
- 클라이언트가 다시 연결했을 때, 서버는 클라이언트를 새로운 사용자로 간주하고 초기 화면(홈페이지)을 전달.
- 세션이 있는 서버:
- 클라이언트가 쿠키나 세션 ID를 통해 자신의 상태를 전달.
- 서버는 클라이언트를 식별하고 장바구니에 물건이 추가된 상태를 복구.
'AWS' 카테고리의 다른 글
(route 53) 도메인 구매 및 ssl 인증서 받고 연결하기+한글 도메인 (1) 2024.12.13 https://example.com/ 이 실제로 있네?! (0) 2024.12.04