본문 바로가기

개발자 강화/CS 개념

TCP와 UDP부터 출발하는 컴퓨터 네트워크의 생활

근본 문제다

컴퓨터 네트워크를 배운지는 1년이 훌쩍 넘었지만 기억해내야 한다

 

TCP

  • 연결지향적: 데이터 전송 전 송신자와 수신자 간의 연결 설정
  • 신뢰성 보장: 데이터가 손실되거나 순서가 어긋나면 재전송
  • 패킷의 순서를 보장하며, 모든 데이터가 정확히 도착하도록 확인
  • 네트워크 상태를 고려해 데이터 전송 속도 조정
  • 데이터 신뢰성 보장 때문에 헤더가 크고, 추가적인 처리 과정이 있음
  • 예시: 웹 브라우징(HTTP, HTTPS), 이메일(SMTP), 파일전송(FTP)

UDP

  • 연결 없이 데이터 전송
  • 데이터가 손실되거나 순서가 바뀌어도 이를 감지하거나 수정하지 않음
  • 헤더 크기가 작고, 추가적인 확인 과정 없이 전송 속도가 빠름
  • 예시: 실시간 스트리밍, 온라인 게임

 

TCP는 데이터를 순서대로 보장할 수 있는 이유가 뭘까?

  • 시퀀스 번호
    • TCP는 데이터를 작은 청크로 분할하고, 청크에 고유한 시퀀스 번호를 부여함
    • 시퀀스 번호는 각 패킷의 첫 번째 바이트의 위치를 나타낸다
    • 수신자는 시퀀스 번호를 기준으로 데이터를 올바르게 조립한다
  • ACK Acknowledgment
    • 수신자는 데이터를 받을 때마다 수신 확인 응답 ACK를 송신자에게 보낸다
    • ACK에는 수신자가 다음으로 받을 것으로 기대하는 시퀀스 번호가 포함 됨
    • 만약, 시퀀스 번호가 100에서 시작하고 데이터 길이가 50이라면 ACK 번호는 150이 됨<- 여기부터 보내달라
    • 송신자는 ACK를 확인해 데이터가 성공적으로 전달되었는지 확인한다
  • 재전송 Retransmission
    • 만약 송신된 데이터가 손실되거나 순서가 어긋난 경우, 재전송 타이머가 만료되면 해당 패킷을 다시 보낸다
    • 중복 ACK - 수신자가 특정 패킷이 누락되었음을 감지하면 동일한 ACK 번호를 반복해서 보낸다
    • 송신자는 중복 ACK를 보고 누락된 패킷을 재전송한다
  • 버퍼링 Buffering
    • 수신자는 순서가 맞지 않는 패킷을 버퍼에 임시 저장한다
    • 누락된 데이터가 도착하면 버퍼에 저장된 데이터를 재조합해 순서를 맞춘다
  • 흐름 제어 Flow Control
    • Window Size - TCP는 수신자가 처리 가능한 데이터 양(윈도우 크기)를 송신자에게 알려준다
    • 송신자는 윈도우 크기를 초과하지 않도록 데이터를 전송해 패킷 손실을 줄이고 순서 문제를 방지한다
  • 혼잡 제어 Congestion Control
    • 네트워크가 혼잡한 상황에서는 패킷 손실이 발생할 가능성이 높아 순서가 어긋날 수 있다
    • TCP는 혼잡 제어 알고리즘(Slow Start, Congestion, Avoidance)를 사용해 전송 속도를 조정하고 손실을 줄인다
    • Slow Start
      • TCP 연결이 처음 시작되거나, 혼잡이 발생한 후, 송신자는 네트워크 상태를 알지 못한다
      • 초기에는 천천히 데이터를 전송해 네트워크 혼잡 수준을 탐색한다
      • 초기값 설정 - Congestion Window - 송신자가 전송 가능한 데이터의 크기 설정
      • 송신자는 매 Round Trip Time에서 ACK를 수신할 때마다 전송 가능 데이터 크기를 2배로 늘린다
      • 임계값에 도달하면 Congestion Avoidance 상태로 전환된다
    • Congestion Avoidance
      • 네트워크 혼잡을 방지하기 위해 송신 속도를 조정, 점진적으로 데이터 전송 속도를 증가시킨다
      • 매 RTT마다 1 MSS만큼만 증가시킨다
      • 혼잡 발생(패킷 손실)이 감지되면 현재 전송 크기의 절반으로 줄이고 다시 Slow Start로 돌아간다
  • 연결 설정과 종료
    • TCP는 데이터를 송수신 하기 전에 3 way handshake를 통해 연결을 설정한다
      • 3 way handshake
        • SYN: 클라이언트는 서버에 클라이언트의 ISN을 담아 SYN 보냄.
        • SYN+ACK: 서버는 클라이언트의 SYN을 수신하고 서버의 ISN을 보냄. 승인번호는 클라이언트 ISN+1
        • ACK: 클라이언트는 서버의 ISN+1한 값인 승인번호를 담아 ACK 서버에 보냄
    • 이 과정에서 초기 시퀀스 번호 Initial Sequence Number가 협상된다
    • 양측은 서로의 시퀀스 번호를 기반으로 데이터 전송을 관리한다
    • TCP가 연결을 해제할 때 4 way handshake 발생
      • 4 way handshake
        • 클라이언트가 연결을 닫으려고 할 때 FIN으로 설정된 세그먼트 보냄. 클라이언트는 FIN_WAIT_1 상태로 들어가고 서버의 응답 기다림
        • 서버는 클라이언트로 ACK라는 승인 세그먼트 보냄. CLOSE_WAIT 상태에 들어감. 클라이언트가 세그먼트 받으면 FIN_WAIT_2 상태에 들어감
        • 서버는 ACK 보내고 일정 시간 이후에 클라이언트에 FIN이라는 세그먼트 보냄
        • 클라이언트는 TIME_WAIT 상태가 되고 다시 서버 ACK를 보내서 서버는 CLOSED 상태가 됨. 이후 클라이언트는 어느 정도의 시간을 대기한 후 연결이 닫히고 클라이언트와 서버의 모든 자원의 연결 해제 됨.
  • 요약
    • 송신자는 데이터 청크에 시퀀스 번호를 부여해 순서를 식별한다
    • 수신자는 시퀀스 번호를 기반으로 데이터를 올바르게 조합
    • 누락된 데이터가 있으면 ACK나 재전송 요청을 통해 복구
    • 수신 측 버퍼와 송신 측 흐름 제어로 데이터 흐름을 조율