[태그:] 프로토콜

  • TCP/IP와 네트워크 프로토콜 쉽게 이해하기: 개발자를 위한 네트워크 기초 완전정복

    안녕하세요, 성장하는 개발자 여러분!

    “네트워크는 어렵다”, “왜 인터넷이 안 될까?”라고 생각해본 적 있으신가요? 웹 애플리케이션을 만들면서도 HTTP 요청이 실제로 어떻게 전달되는지, 왜 가끔 timeout이 발생하는지 궁금했을 겁니다.

    오늘은 개발자로서 꼭 알아야 할 TCP/IP와 네트워크 프로토콜에 대해 쉽고 재미있게 알아보겠습니다. 복잡한 이론보다는 실무에서 바로 써먹을 수 있는 지식 위주로 설명드릴게요!

    1. 네트워크의 기본: 왜 프로토콜이 필요할까?

    프로토콜이란?

    프로토콜은 컴퓨터끼리 대화하는 약속입니다. 마치 한국어를 모르는 외국인과 대화하려면 영어라는 공통 언어가 필요한 것처럼, 컴퓨터들도 서로 통신하기 위한 공통 언어가 필요합니다.

    사람 간 대화: 한국어, 영어, 중국어...
    컴퓨터 간 대화: TCP/IP, HTTP, FTP...

    패킷 통신의 원리

    큰 데이터를 한 번에 보내지 않고 작은 조각(패킷)으로 나누어 보냅니다. 마치 긴 편지를 여러 장의 엽서로 나누어 보내는 것과 같죠.

    원본 데이터: "안녕하세요 반갑습니다"
    패킷 1: "안녕" + [1/3번째 조각]
    패킷 2: "하세요" + [2/3번째 조각]
    패킷 3: "반갑습니다" + [3/3번째 조각]

    각 패킷에는 헤더라는 주소록이 붙어있어서, 목적지에서 원래 순서대로 조립할 수 있습니다.

    2. OSI 7계층: 네트워크의 계층 구조

    왜 계층으로 나눌까?

    복잡한 네트워크 통신을 단계별로 나누어 각각의 역할을 명확히 하기 위해서입니다. 마치 택배 배송 시스템처럼 각 단계마다 담당자가 있는 것과 같습니다.

    7. 응용 계층 (Application)    - 브라우저, 이메일 앱
    6. 표현 계층 (Presentation)  - 데이터 암호화, 압축
    5. 세션 계층 (Session)       - 연결 관리
    4. 전송 계층 (Transport)     - TCP, UDP
    3. 네트워크 계층 (Network)    - IP, 라우팅
    2. 데이터링크 계층 (Data Link) - 이더넷, WiFi
    1. 물리 계층 (Physical)      - 케이블, 전파

    실무에서 중요한 계층들

    4계층 (전송 계층) – TCP/UDP

    # TCP 연결 확인
    netstat -an | grep ESTABLISHED
    
    # 특정 포트 리스닝 확인
    netstat -tulpn | grep :80

    3계층 (네트워크 계층) – IP

    # 라우팅 테이블 확인
    route -n
    ip route show
    
    # 네트워크 경로 추적
    traceroute google.com

    3. IP 주소: 인터넷의 주소 체계

    IP 주소의 구조

    IP 주소는 32비트의 이진수이지만, 사람이 읽기 쉽게 4개의 십진수로 표현합니다.

    이진수: 11000000.10101000.00000001.00000001
    십진수: 192.168.1.1

    IP 주소 클래스

    Class A (대규모 네트워크)

    • 범위: 1.0.0.0 ~ 126.255.255.255
    • 네트워크부: 첫 번째 옥텟
    • 호스트부: 나머지 3옥텟
    • 예: 대학교, 대기업

    Class B (중간 규모 네트워크)

    • 범위: 128.0.0.0 ~ 191.255.255.255
    • 네트워크부: 첫 번째, 두 번째 옥텟
    • 호스트부: 나머지 2옥텟

    Class C (소규모 네트워크)

    • 범위: 192.0.0.0 ~ 223.255.255.255
    • 네트워크부: 첫 번째~세 번째 옥텟
    • 호스트부: 마지막 옥텟
    • 예: 일반 가정, 소규모 사무실

    사설 IP vs 공인 IP

    사설 IP (Private IP)

    Class A: 10.0.0.0 ~ 10.255.255.255
    Class B: 172.16.0.0 ~ 172.31.255.255
    Class C: 192.168.0.0 ~ 192.168.255.255

    NAT(Network Address Translation)

    • 사설 IP를 공인 IP로 변환
    • IP 주소 부족 문제 해결
    • 보안 효과
    # 내부 IP 확인
    ip addr show
    ifconfig
    
    # 외부 IP 확인
    curl ifconfig.me

    서브넷 마스크

    네트워크부와 호스트부를 구분하는 역할을 합니다.

    IP: 192.168.1.100
    서브넷 마스크: 255.255.255.0 (/24)
    
    네트워크 주소: 192.168.1.0
    브로드캐스트 주소: 192.168.1.255
    사용 가능한 호스트: 192.168.1.1 ~ 192.168.1.254

    4. TCP vs UDP: 신뢰성 vs 속도

    TCP (Transmission Control Protocol)

    특징

    • 연결 지향적: 3-way handshake로 연결 확립
    • 신뢰성 보장: 데이터 손실 시 재전송
    • 순서 보장: 패킷이 순서대로 도착
    • 속도 상대적으로 느림

    3-way Handshake

    클라이언트 → 서버: SYN (연결 요청)
    서버 → 클라이언트: SYN+ACK (요청 수락)
    클라이언트 → 서버: ACK (연결 확립)

    사용 예시

    • HTTP/HTTPS (웹)
    • FTP (파일 전송)
    • SMTP (이메일)
    • SSH (원격 접속)

    UDP (User Datagram Protocol)

    특징

    • 비연결성: 사전 연결 과정 없음
    • 신뢰성 미보장: 데이터 손실 가능
    • 순서 미보장: 패킷 순서가 바뀔 수 있음
    • 속도 빠름

    사용 예시

    • DNS (도메인 조회)
    • DHCP (IP 자동 할당)
    • 실시간 스트리밍
    • 온라인 게임
    # TCP 포트 80 확인
    telnet google.com 80
    
    # UDP DNS 쿼리
    nslookup google.com

    5. 네트워크 장비: 데이터의 여행

    NIC (Network Interface Card)

    컴퓨터를 네트워크에 연결하는 관문 역할입니다.

    # 네트워크 인터페이스 정보 확인
    ip link show
    ethtool eth0  # 이더넷 정보

    허브 (Hub)

    • 리피터 역할: 신호를 그대로 증폭하여 재전송
    • 콜리전 도메인: 연결된 모든 장비가 하나의 충돌 영역
    • 단점: 대역폭 공유, 보안 취약
    • 현재: 거의 사용하지 않음 (스위치로 대체)

    스위치 (Switch)

    허브와의 차이점

    • MAC 주소 학습: 어떤 포트에 어떤 장비가 연결되어 있는지 기억
    • 콜리전 도메인 분리: 각 포트가 독립적인 충돌 영역
    • 전이중 통신: 동시에 송신과 수신 가능

    스위치의 동작 과정

    1. Learning: MAC 주소를 배우고 테이블에 저장
    2. Flooding: 모르는 주소면 모든 포트로 전송
    3. Forwarding: 아는 주소면 해당 포트로만 전송
    4. Filtering: 같은 세그먼트 내 통신은 차단
    # MAC 주소 테이블 확인 (스위치에서)
    show mac address-table
    
    # ARP 테이블 확인 (PC에서)
    arp -a
    ip neigh show

    라우터 (Router)

    역할

    • 브로드캐스트 도메인 분리: 네트워크를 논리적으로 분할
    • 경로 결정: 최적의 경로로 패킷 전송
    • 보안: 패킷 필터링, 방화벽 기능

    기본 게이트웨이 (Default Gateway)

    # 기본 게이트웨이 확인
    route -n | grep 0.0.0.0
    ip route | grep default
    
    # 게이트웨이 연결 테스트
    ping 192.168.1.1

    6. 실무 네트워크 진단 도구

    기본 연결성 테스트

    # 기본 ping 테스트
    ping google.com
    
    # 패킷 손실률과 RTT 확인
    ping -c 10 google.com
    
    # IPv6 ping
    ping6 google.com

    경로 추적

    # 경로 추적 (Linux/Mac)
    traceroute google.com
    
    # 경로 추적 (Windows)
    tracert google.com
    
    # MTR (지속적인 경로 추적)
    mtr google.com

    포트 연결 테스트

    # 특정 포트 연결 테스트
    telnet google.com 80
    nc -zv google.com 80
    
    # 여러 포트 스캔
    nmap -p 22,80,443 google.com

    DNS 조회

    # 기본 DNS 조회
    nslookup google.com
    dig google.com
    
    # 특정 레코드 타입 조회
    dig google.com MX
    dig google.com AAAA

    네트워크 상태 모니터링

    # 활성 연결 확인
    netstat -tuln
    ss -tuln
    
    # 대역폭 사용량 모니터링
    iftop
    nethogs
    
    # 실시간 네트워크 통계
    watch -n 1 cat /proc/net/dev

    7. 실무 문제 해결 가이드

    문제 1: “인터넷이 안 됩니다”

    진단 순서

    # 1. 로컬 인터페이스 확인
    ip addr show
    
    # 2. 게이트웨이 연결 확인
    ping 192.168.1.1
    
    # 3. DNS 서버 확인
    ping 8.8.8.8
    
    # 4. 도메인 해석 확인
    nslookup google.com
    
    # 5. 외부 연결 확인
    ping google.com

    문제 2: “서버에 연결이 안 됩니다”

    # 포트 열림 확인
    telnet server-ip 80
    
    # 방화벽 확인
    sudo iptables -L
    sudo firewall-cmd --list-all
    
    # 서비스 상태 확인
    sudo systemctl status nginx
    sudo netstat -tulpn | grep :80

    문제 3: “네트워크가 느립니다”

    # 대역폭 테스트
    speedtest-cli
    
    # 네트워크 지연 확인
    ping -c 100 google.com | tail -1
    
    # 경로상 병목 지점 확인
    mtr google.com

    8. 개발자를 위한 네트워크 최적화 팁

    HTTP 성능 최적화

    # Keep-Alive 연결 확인
    curl -I -H "Connection: keep-alive" http://example.com
    
    # 압축 확인
    curl -H "Accept-Encoding: gzip" -I http://example.com

    DNS 최적화

    # DNS 캐시 플러시
    sudo systemctl flush-dns  # Linux
    sudo dscacheutil -flushcache  # Mac
    
    # 빠른 DNS 서버 사용
    echo "nameserver 1.1.1.1" | sudo tee /etc/resolv.conf

    로드밸런싱과 CDN

    // Node.js에서 클러스터링
    const cluster = require("cluster");
    const numCPUs = require("os").cpus().length;
    
    if (cluster.isMaster) {
      for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
      }
    } else {
      // 워커 프로세스
      require("./app.js");
    }

    마치며: 네트워크 마스터로의 여정

    오늘 배운 내용을 정리하면:

    1. 프로토콜은 컴퓨터 간의 약속
    2. TCP는 신뢰성, UDP는 속도
    3. IP 주소는 인터넷의 주소
    4. 스위치는 MAC 주소, 라우터는 IP 주소로 동작
    5. 문제 발생 시 체계적인 진단이 중요

    실무에서 기억할 점

    • 단계별 진단: 물리 계층부터 응용 계층까지 순차적으로
    • 로그 확인: 모든 문제의 답은 로그에 있다
    • 모니터링: 평상시 네트워크 상태를 파악해두자
    • 백업 경로: 중요한 서비스는 이중화 구성

    네트워크는 한 번에 다 이해하기 어려운 분야입니다. 하지만 오늘 배운 기초를 바탕으로 실무에서 하나씩 경험해 나가다 보면, 어느새 네트워크 전문가가 되어 있을 거예요!

    기억하세요: 네트워크 문제의 80%는 기본기로 해결됩니다. 🌐