[NET-004][기초] TCP·UDP와 포트를 로컬에서 확인하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[NET-004][기초] TCP·UDP와 포트를 로컬에서 확인하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 240회 작성일 26-08-31 09:34

본문

[이번 수업]
TCP, UDP, 포트를 배우고 Python으로 내 컴퓨터 안에서만 메시지를 주고받습니다. 외부 서버에는 연결하지 않습니다.

[선수지식]
NET-001~003의 IP 주소, DNS, HTTP 기초를 알고 Python 3를 실행할 수 있으면 됩니다. 소켓(socket)은 운영체제가 제공하는 네트워크 통신 창구입니다.

[학습목표]
1. TCP와 UDP의 전달 방식 차이를 설명한다.
2. IP 주소와 포트가 함께 필요한 이유를 말한다.
3. 루프백 주소에서 두 종류의 소켓을 실행한다.

[핵심개념]
TCP는 연결을 맺고 신뢰할 수 있는 순서 보장 바이트 스트림을 제공합니다. 손실을 감지하면 재전송합니다. 단, 애플리케이션 메시지 경계를 보존하지 않으므로 받은 바이트를 어디까지 한 메시지로 볼지는 프로그램이 정해야 합니다.

UDP는 연결을 맺지 않고 데이터그램(경계가 있는 한 묶음)을 보냅니다. TCP 같은 전달·순서·중복 제거 보장은 없습니다. 실시간 음성, 게임 상태, DNS처럼 애플리케이션이 지연과 손실 정책을 선택할 때 쓰입니다. UDP가 항상 빠르거나 TCP가 항상 느리다는 뜻은 아닙니다.

IP 주소가 건물 주소라면 포트는 프로그램 창구 번호입니다. TCP와 UDP의 출발지·목적지 포트는 16비트이며 같은 숫자도 프로토콜별로 구분됩니다. 서버는 주소와 포트에 bind(묶기)하고 기다립니다. `127.0.0.1`은 루프백 주소라 통신이 내 컴퓨터 밖으로 나가지 않습니다. 포트 0으로 bind하면 운영체제가 비어 있는 임시 포트를 고릅니다.

[따라하기]
아래를 ports_demo.py로 저장합니다. TCP 서버는 스레드에서 한 번 응답하고 UDP는 데이터그램 하나를 받습니다.

```python
import socket
import threading

HOST = "127.0.0.1"
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server.bind((HOST, 0))
tcp_server.listen(1)
tcp_port = tcp_server.getsockname()[1]

def reply_once():
    connection, _ = tcp_server.accept()
    with connection:
        connection.sendall(b"TCP: " + connection.recv(100))

worker = threading.Thread(target=reply_once)
worker.start()
with socket.create_connection((HOST, tcp_port)) as tcp_client:
    tcp_client.sendall(b"hello")
    print(tcp_client.recv(100).decode())
worker.join()
tcp_server.close()

udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_server.bind((HOST, 0))
udp_port = udp_server.getsockname()[1]
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as udp_client:
    udp_client.sendto(b"ping", (HOST, udp_port))
    data, _ = udp_server.recvfrom(100)
    print("UDP:", data.decode())
udp_server.close()
print("TCP port:", tcp_port)
print("UDP port:", udp_port)
```

macOS/Linux는 `python3 ports_demo.py`, Windows는 `py ports_demo.py`를 실행합니다. `TCP: hello`, `UDP: ping`과 서로 다른 포트 번호가 나옵니다. 번호는 실행마다 달라도 정상입니다.

[흔한 실수]
TCP의 `send` 한 번과 `recv` 한 번이 항상 같은 메시지 경계라고 생각하면 안 됩니다. TCP 서버에서 `listen`·`accept`를 빠뜨리거나 UDP 서버에 `listen`을 쓰지 마세요. 포트가 사용 중이면 예제처럼 0을 쓰고, 작업 후 소켓을 닫습니다.

[보안 주의]
실습 주소를 `0.0.0.0`이나 외부 IP로 바꾸지 마세요. 다른 장치에서 접근 가능한 인터페이스까지 열 수 있습니다. 본인 소유의 로컬 환경에서 가짜 데이터만 사용하세요. 공개 서비스에는 방화벽, 인증, 암호화, 입력 길이·시간 제한이 필요합니다. 열린 포트가 안전한 서비스를 뜻하지는 않습니다.

[직접 해볼 과제]
1. TCP의 hello를 student로 바꾸고 응답을 확인하세요.
2. UDP 데이터그램을 두 번 보내고 두 번 `recvfrom`하도록 수정하세요.
3. TCP·UDP 포트가 왜 매번 달라질 수 있는지 설명하세요.

[확인문제]
1. TCP가 애플리케이션에 제공하는 데이터 형태는 무엇인가요?
2. 같은 IP 주소에서 여러 프로그램을 구분하는 값은 무엇인가요?
3. UDP 사용 시 애플리케이션이 고려할 전달 문제는 무엇인가요?

[다음 학습]
다음 순환은 CLOUD-004 VPC·서브넷·보안그룹입니다. 네트워크 트랙은 NET-005 HTTP·HTTPS·TLS로 이어집니다.

[공식 참고 자료]
https://datatracker.ietf.org/doc/html/rfc9293
https://datatracker.ietf.org/doc/html/rfc768
https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
https://docs.python.org/3/library/socket.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
2,059
어제
5,103
최대
16,772
전체
773,113
Copyright © 소유하신 도메인. All rights reserved.