[NET-001][입문] OSI와 TCP/IP로 통신 흐름 이해하기 > IT 기술 공유

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

IT 기술 공유

[NET-001][입문] OSI와 TCP/IP로 통신 흐름 이해하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 226회 작성일 26-08-29 03:33

본문

[이번 수업]

브라우저에서 보낸 글자가 다른 컴퓨터에 도착하려면 여러 통신 규칙이 협력해야 합니다. 이번에는 OSI와 TCP/IP 계층을 지도처럼 사용해 데이터가 내려가고 올라오는 과정을 이해하고, 내 컴퓨터 안에서만 작동하는 TCP 통신을 실행합니다.

[선수지식]

BACK-001의 서버·요청·응답과 OS-001의 사용자 프로그램·운영체제 관계를 알면 좋습니다. 네트워크 장비나 관리자 권한은 필요하지 않습니다.

[학습목표]

1. 계층을 나누는 이유와 각 계층의 책임을 설명할 수 있습니다.
2. OSI 7계층과 인터넷 TCP/IP 계층을 구분할 수 있습니다.
3. IP 주소와 포트를 이용해 로컬 TCP 클라이언트·서버를 실행할 수 있습니다.

[핵심개념]

계층(layer)은 복잡한 통신을 역할별로 나눈 경계입니다. 위 계층은 아래 계층의 세부 구현을 모두 알지 않아도 제공된 기능을 사용합니다.

OSI 기본 참조 모델은 물리·데이터 링크·네트워크·전송·세션·표현·응용의 7계층으로 통신 기능을 설명합니다. 실제 인터넷 프로토콜 모음은 흔히 링크·인터넷(IP)·전송·응용 계층으로 봅니다. OSI는 문제 위치와 책임을 설명하는 지도, TCP/IP는 인터넷에서 실제로 동작하는 프로토콜 묶음으로 이해하면 좋습니다.

응용 계층은 HTTP 같은 데이터 의미와 대화 규칙을 담당합니다. 전송 계층의 TCP는 애플리케이션 사이에 신뢰성 있는 바이트 흐름을 제공하고 포트 번호로 통신 대상을 구분합니다. 인터넷 계층의 IP는 출발지와 목적지 주소를 사용해 데이터그램이 갈 길을 정합니다. 링크 계층은 같은 링크에서 실제 전달을 맡습니다.

송신할 때 응용 데이터에 TCP, IP, 링크 계층 정보가 차례로 붙는 과정을 캡슐화라고 합니다. 수신 측에서는 반대 순서로 정보를 확인하고 벗겨 응용 데이터에 도달합니다. TCP 세그먼트는 IP 데이터그램 안에 실립니다.

[따라하기]

loopback_tcp.py 파일에 아래 코드를 저장합니다. 127.0.0.1은 자기 컴퓨터만 가리키는 IPv4 루프백 주소이고, 포트 0으로 bind하면 운영체제가 비어 있는 포트를 골라 줍니다.

import socket
import threading

def reply_once(listener):
    conn, address = listener.accept()
    with conn:
        data = conn.recv(1024)
        print("server received:", data.decode())
        conn.sendall(b"pong")

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as listener:
    listener.bind(("127.0.0.1", 0))
    listener.listen(1)
    host, port = listener.getsockname()

    worker = threading.Thread(target=reply_once, args=(listener,))
    worker.start()

    with socket.create_connection((host, port)) as client:
        client.sendall(b"ping")
        reply = client.recv(1024)
        print("client received:", reply.decode())

    worker.join()

Windows는 ‘py loopback_tcp.py’, macOS·Linux는 ‘python3 loopback_tcp.py’를 실행합니다. ‘server received: ping’과 ‘client received: pong’이 나오면 성공입니다. ping·pong은 응용 데이터, SOCK_STREAM은 TCP, 127.0.0.1은 IP 주소, 자동 선택된 숫자는 TCP 포트입니다.

[흔한 실수]

OSI와 TCP/IP 계층을 완전히 같은 것으로 외우지 마세요. IP 주소는 컴퓨터 쪽 위치를, 포트는 그 안의 통신 끝점을 구분합니다. TCP는 메시지 경계를 보존하지 않는 바이트 흐름이므로 실제 프로그램은 recv 한 번에 전체 메시지가 온다고 가정하면 안 됩니다. 길이 또는 구분자를 정하고 반복해서 읽어야 합니다.

[보안 주의]

실습 서버는 127.0.0.1에만 연결해 외부에서 접근할 수 없게 했습니다. 0.0.0.0에 bind하면 모든 네트워크 인터페이스에서 들을 수 있으므로 인증·입력 제한·방화벽 없이 바꾸지 마세요. 모르는 외부 주소를 스캔하거나 패킷을 보내지 말고 본인 소유의 로컬 환경에서만 실습합니다.

[직접 해볼 과제]

ping을 hello로, pong을 welcome으로 바꾸고 출력 결과를 확인하세요. 이어서 코드의 응용 데이터·TCP·IP 주소·포트에 해당하는 부분을 각각 표시하고, 캡슐화 순서를 한 줄로 적어 봅니다.

[확인문제]

1. 네트워크 기능을 계층으로 나누면 어떤 장점이 있나요?
2. IP 주소와 포트 번호는 각각 무엇을 구분하나요?
3. TCP의 recv 한 번이 응용 메시지 하나와 항상 같지 않은 이유는 무엇인가요?

[다음 학습]

다음 게시 과정은 CLOUD-001 ‘IaaS·PaaS·SaaS와 공동 책임’입니다. NET 트랙의 다음 단계는 NET-002 ‘IP 주소·서브넷·게이트웨이’입니다.

[공식 참고 자료]

ITU-T X.200 — OSI 기본 참조 모델
https://www.itu.int/rec/T-REC-X.200-199407-I/en

RFC 1122 — 인터넷 호스트 통신 계층
https://www.rfc-editor.org/rfc/rfc1122.html

RFC 9293 — TCP 표준
https://www.rfc-editor.org/rfc/rfc9293.html

Python 공식 문서 — socket 저수준 네트워크 인터페이스
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호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
4,232
어제
6,862
최대
16,772
전체
770,183
Copyright © 소유하신 도메인. All rights reserved.