C.S/Network

TCP/IP 송수신 과정

칼쵸쵸 2022. 11. 20. 18:29

 

📌 서버 → 클라이언트 데이터 송신 & 수신 과정 (자세한 설명)

🖥 서버 송신 과정

  1. 프로세스 메모리 준비
    • 예: 1.4MB짜리 이미지 파일을 전송한다고 하면, 서버 프로세스는 메모리에 해당 데이터를 적재합니다.
    • 이때 전송 단위는 64KB씩 잘라서 처리합니다.
  2. 소켓에 데이터 쓰기
    • 서버 프로세스는 OS가 제공하는 소켓(파일처럼 다루는 통신 엔드포인트)에 send()를 호출하여 데이터를 씁니다.
    • 이때 실제 데이터는 커널의 TCP 송신 버퍼에 복사됩니다.
  3. TCP 계층 처리 (커널 수준)
    • TCP는 받은 데이터를 세그먼트 단위(64KB보다 작을 수도 있음) 로 분할합니다.
    • 각 세그먼트에 순서 번호(Sequence Number) 를 붙여 수신자가 순서를 맞출 수 있도록 합니다.
    • 흐름 제어를 위해 현재 클라이언트가 받을 수 있는 윈도우 크기(Window Size) 를 확인합니다.
  4. IP 계층 → 패킷화
    • TCP 세그먼트를 IP 패킷으로 감쌉니다.
    • 여기에는 송신자 IP, 수신자 IP 같은 네트워크 주소 정보가 포함됩니다.
  5. L2 계층 → 프레임화
    • IP 패킷은 다시 프레임(Frame) 으로 감싸집니다.
    • 프레임에는 MAC 주소(출발지/도착지) 가 붙습니다.
  6. NIC(Network Interface Card) 전송
    • OS 커널은 이 프레임을 NIC로 전달합니다.
    • NIC는 이진 데이터를 실제 전기 신호 / 광 신호 로 변환해 물리 네트워크로 전송합니다.
    • 이 과정에서 NIC 드라이버가 소켓 버퍼 ↔ NIC 간 데이터 복사를 담당합니다.

 

💻 클라이언트 수신 과정

  1. NIC가 프레임 수신
    • 클라이언트의 NIC가 서버로부터 도착한 프레임을 물리 신호로 받아들여 디지털 데이터로 복원합니다.
    • NIC 드라이버가 이 데이터를 OS 커널에 전달합니다.
  2. L2 → L3 → L4 계층 처리
    • 프레임에서 IP 패킷을 꺼내고, 다시 TCP 세그먼트를 추출합니다.
    • TCP 계층은 세그먼트를 TCP 수신 버퍼에 저장합니다.
    • 동시에 서버에 ACK(다음에 받을 세그먼트 번호) 를 보냅니다.
      • ACK에는 현재 윈도우 크기(Window Size) 정보도 함께 담깁니다.
  3. 흐름 제어
    • 만약 클라이언트의 TCP 버퍼가 가득 차면, Window Size가 줄어들고 서버는 전송 속도를 줄이거나 잠시 대기(wait)합니다.
    • 이것이 TCP의 속도 저하 원인이 될 수 있습니다.
  4. 소켓 버퍼 전달
    • 커널의 TCP 수신 버퍼에 있던 데이터는 클라이언트 프로세스의 소켓 버퍼로 전달됩니다.
    • 애플리케이션이 read()를 호출하면 소켓 버퍼에서 데이터를 읽어 실제로 사용할 수 있습니다.

🔑 한 줄 요약

  • 서버: 데이터를 64KB씩 잘라서 소켓 → TCP 버퍼 → NIC → 네트워크
  • 클라이언트: NIC → TCP 버퍼 → 소켓 버퍼 → 애플리케이션
  • TCP 흐름 제어: 클라이언트의 윈도우 크기(Window Size)ACK 로 속도를 맞춰 과부하를 방지

 

📌 TCP vs UDP (송수신 과정 차이)

1. 연결 방식

  • TCP
    • 연결지향적 (3-way handshake 필요)
    • 데이터 전송 전 클라이언트-서버가 연결 상태를 확립해야 함
  • UDP
    • 비연결성 (handshake 없음)
    • 바로 데이터그램(datagram)을 전송

2. 데이터 단위

  • TCP
    • 데이터 → 세그먼트로 나누어 순서 번호(Sequence Number) 부여
    • 수신 측에서 순서대로 조립
  • UDP
    • 데이터 → 데이터그램 단위로 바로 전송
    • 번호나 순서 관리 없음 (보낸 순서 ≠ 받는 순서 보장 안 됨)

3. 신뢰성

  • TCP
    • ACK(응답) 필수 → 받았는지 확인
    • 손실 시 재전송 → 신뢰성 보장
  • UDP
    • ACK 없음 → 받았는지 확인 안 함
    • 손실, 중복, 순서 뒤바뀜 가능

4. 흐름 제어 / 혼잡 제어

  • TCP
    • 윈도우 크기(Window Size)로 수신 버퍼 상황을 알려주고 속도 조절
    • 혼잡 제어 알고리즘 (예: AIMD) 적용
  • UDP
    • 흐름 제어, 혼잡 제어 없음
    • 애플리케이션이 직접 구현해야 함

5. 속도 & 오버헤드

  • TCP
    • 헤더 크기: 최소 20바이트
    • 안정적이지만 상대적으로 느림
  • UDP
    • 헤더 크기: 8바이트
    • 빠르지만 신뢰성 낮음

6. 적합한 사용 사례

  • TCP: 신뢰성이 중요한 경우
    • 웹 브라우징(HTTP/HTTPS), 이메일(SMTP), 파일 전송(FTP)
  • UDP: 속도가 더 중요한 경우
    • 영상 스트리밍, 온라인 게임, VoIP
반응형