[Network] TCP & UDP & 3,4 Way Handshake

박세건·2024년 4월 29일
0

CS 학습

목록 보기
18/25

TCP(Transmission Control Protocol)

TCP란, 인터넷 상에서 데이터를 메시지 형태(세그먼트)로 전달하기 위해 IP와 함께 사용하는 프로토콜 입니다. TCP는 애플리케이션에게 신뢰적이고 연결지향적인 서비스를 제공합니다.
일반적으로 IP와 함께 사용되며 IP는 배달(주소지정)TCP는 패킷의 추적 및 관리(데이터 전송)를 합니다.

특징

  • 3 Way Handshaking으로 연결, 4 Way Handshaking으로 **해제
  • 높은 신뢰성을 보장
  • UDP에 비하면 속도가 느리다
  • Full-Duplex, Point to Point 방식 사용
    • Full-Duplex : 전이중 : 전송이 양방향에서 동시에 발생할 수 있음 : 전송 효율 좋음
    • Point to Point : 점대점 : 1 : 1로 직접 연결 : 안정적

흐름 제어 및 혼잡 제어

흐름 제어

송신과 수신의 속도차이를 조절하여 수신자의 Overflow를 방지

  • 주로 수신자의 처리 속도가 느려서 발생하는 문제
  • 수신자가 "나 지금 이정도의 윈도우만 받을 수 있어" 라고 알려줌
  • 이를 송신자가 확인하고 과하지 않도록 제어

종류

  • Stop and Wait : 전송한 패킷에 대하여 응답이 와야만 다음 패킷 전송

  • Sliding Window (Go Back N ARQ) : 수신자가 원하는 윈도우 크기만큼의 패킷데이터를 한번에 전송, 응답에 따라서 윈도우를 옆으로 이동

    _그림에서는 data0, data1 처럼 하나씩 보내고 있는데 이는 이해를 위한 것이고 원래는 7의 윈도우 크기만큼의 패킷을 한번에 보내고 응답에 따라서 윈도우를 옆으로 미뤄준다(응답값 + 윈도우 크기 -1)

  • 위 그림처럼 ACK(2)를 받으면 1까지의 데이터는 잘 받았으니 2부터 보내라는 뜻.

혼잡 제어

네트워크 내의 패킷 수가 넘치지 않도록 방지

  • 송신자가 현재 네트워크의 혼잡도를 확인하고 속도를 제어

종류

  • AIMD(Additive Increase, Multiplicative Decrease) : 윈도우 크기를 조절해서 네트워크 혼잡을 방지
  1. 시작 : Slow Start
  • 처음 윈도우 크기를 1로 설정하고 제대로된 응답 받을때마다 *2씩 윈도우 크기 증가
    _기존에는 원래 1씩 증가시켰는데 이 과정에서 시간이 오래걸리는 상황이 발생해서 Slow Start 방식으로 개선
  1. 혼잡 회피(AI 부분)
  • *2씩 증가시키다가 ssthresh(설정된 임계값)에 도달하면 응답마다 1씩 증가(조금씩 올림)

    초기에 ssthresh는 가장 높은 값으로 설정

  1. 혼잡 감지(MD 부분)
  • 혼잡을 감지(타임 아웃, 중복 ACK 3번(Fast Retransmit))

    ACK 3번인 이유는 Fast Retrasmit 방식을 적용했기 때문, 기존에는 패킷 손실을 감지하기 위해 타임아웃을 사용했지만 이것을 감지하는 것이 너무 느렸다. 떄문에, 같은 ACK가 3번, 즉 아직 해당 값을 받지 못했다는 알림이 3번 중복해서 발생하면 진짜로 사라졌다고 판단하고, 타임아웃을 기다리지 않고 재전송 진행

  • sstresh = 현재 윈도우 크기의 절반으로 설정
  • 윈도우 크기도 절반으로 진행
  1. 이후 반복 -> 천천히 속도는 높이고, 혼잡이 생기면 속도를 줄여주는 안정성 확보

세그먼트 단위를 사용하고 TCP 세그먼트는 header와 body로 나눠지고 각각은 정보와 데이터를 의미한다.

Port 상태 정보

  • CLOSED : 포트 닫힘
  • LESTEN : 포트가 열린 상태로 요청 대기중
  • SYN_SENT : SYNC 요청을 보낸 상태
  • SYN_RECEIVED : SYNC 요청에 응답하고 상대방의 확인을 기다림
  • ESTABLISHED : 포트 연결 상태
  • FIN-WAIT : FIN을 보내고 응답을 기다림

플래그 정보

TCP 헤더에는 서로의 요청에 대한 상태를 확인하기위한 플래그 비트가 존재합니다.
중요한 3가지 플래그 비트를 알아보자

  • SYN : 000010 : 연결 설정
  • ACK : 010000 : 응답 확인
  • FIN : 000001 : 연결 해제

UDP(User DataGram Protocol)

UDP란, 데이터를 데이터그램(독릭접인 관계를 지니는 패킷) 단위로 처리하는 프로토콜입니다.
512바이트의 작은 데이터그램 단위를 사용하기 때문에, 512바이트를 넘게되면 TCP를 사용해야함

특징

  • 비연결형 프로토콜(데이터를 서로 다른 경로로 처리)
  • 연결과 해제의 과정이 존재하지 않는다
  • 흐름제어, 혼잡제어와 같은 과정이 없어 빠르고 부하가 적다
  • 신뢰성이 낮다
  • UDP 헤더의 CheckSum을 통해 최소한의 오류만 검출
    • 때문에 오류를 해결하고 신뢰성을 높이기 위해서 따로 응용계층에서 처리해준다
  • 예시) 스트리밍

비교

TCP와 UDP는 같은 포트 공간에서도 다른 공간을 관리하기 때문에 서로 같은 포트번호를 사용해도 다른 포트로 간주합니다.


TCP 3 Way HandShake

TCP 통신을 통해 데이터를 전송하기 위해서 네트워크 연결을 설정하는 과정입니다.
양쪽 모두가 데이터를 주고 받을 준비가 되었다는 것을 보장하는 과정입니다.
데이터 전달이 시작되기전에 사전에 세션을 수립하는 과정입니다.

동작 과정


1. 클라이언트가 서버에게 접속을 요청하는 SYN 패킷을 전송합니다. SYN 패킷은 세션을 설정하는 데 사용되며 초기에 시퀀스 번호를 보냅니다.
시퀀스 번호 : TCP 세그먼트의 데이터 순서 번호
2. SYN 요청을 받은 Server는 Client에게 요청을 수락한다는 ACK과 접속을 요청하는 SYN 패킷을 전송합니다.
받은 시퀀스 번호에 1을 더해서 ACK로 돌려줍니다.
3. Client는 Server에게 ACK 패킷을 전송하고 이후 부터는 연결이 이루졌음을 의미하고 데이터를 교환하게 된다. 이상태를 ESTABLISHED 라고 한다.

TCP 4 Way Handshake

TCP 연결을 해제하기위해 사용합니다.

동작 과정

  1. Client 가 Server에게 연결을 종료하겠다는 FIN 패킷을 전송합니다.
  • 이 과정에서 FIN을 보내면서 모든 연결을 종료한다면 안전하지 않다 때문에 Half-Close 기법을 사용해서 안전하게 종료합니다.
  1. Server는 이를 확인하고 ACK 패킷을 보내고 통신이 끝나는 것을 기다립니다.
  • 서버는 클라이언트의 FIN(이제 연결 끝낼게!)을 확인하고 CLOSE_WAIT 상태를 갖습니다.
    CLOSE_WAIT : 클라이언트로부터 FIN 신호를 받고, 연결을 정리하기 위해 나머지 데이터를 보내는 시간
  1. 통신이 끝나는 것을 확인하고 Client 에게 FIN 패킷을 전송합니다.
  • 이 과정에서 이전에 사용했던 Half-Close 기법으로 완전히 종료합니다.
  1. Client는 Server에게 확인했다는 ACK 패킷을 보냅니다. 연결이 종료되었다는 패킷을 확인했지만 받지 못한 여분의 데이터가 있을 수 있으므로 Client는 TIME_WAIT 상태로 기다립니다(대략 240초) 240 초 후 종료

Half Close

  • 클라이언트 측에서 수신(읽기)은 열어두고, 송신(쓰기)를 닫은 상태
    연결을 종료하는 과정에서 바로 연결을 종료한다면 문제가 발생할 수 있기때문에 반정도 종료해놓고 상대의 응답을 기다립니다. 상대로부터 FIN 패킷 응답이 온다면 나머지 반을 종료하고 ACK 패킷으로 응답합니다.
    이 과정으로 좀 더 안정적인 종료과정을 수행할 수 있습니다.
profile
멋있는 사람 - 일단 하자

0개의 댓글