시리즈
👉 CS 네트워크 스터디 1주차
👉 CS 네트워크 스터디 2주차
TCP
TCP 프로토콜은 UDP와 마찬가지로 전송 계층에 속하며, 데이터 전송의 신뢰성을 보장하기 위한 프로토콜입니다. 신뢰성이 보장되는 것은 송신자와 수신자가 서로 정상적으로 데이터를 받았는지를 확인할 수 있다는 의미입니다.
TCP 헤더 형식
RFC 783 - TCP Header Format
TCP는 신뢰성 있는 데이터 전송을 위해 시퀀스 번호(Sequence Number)
와 ACK 번호(Acknowledge Number)
를 사용합니다. 시퀀스 번호는 전송하는 데이터의 순서를 나타내며, ACK 번호를 통해 데이터를 올바르게 수신하였는지 알 수 있습니다.
TCP 전송 절차
TCP 전송은 TCP 커넥션 맺기 → 애플리케이션 간 데이터 송수신 → TCP 커넥션 끊기 절차로 이루어져 있습니다. 데이터를 신뢰성 있게 송수신하기 위해 애플리케이션 간 데이터 송신/수신 확인 프로세스가 존재합니다. 이를 3-Way Handshake라고 합니다.
-
TCP 커넥션 맺기
상대방 애플리케이션이 정상적으로 데이터를 송수신할 수 있는 상태인지 확인 후 애플리케이션끼리 가상으로 접속하는 단계 입니다. 이 과정에서3-Way Handshake
를 사용합니다. -
애플리케이션 간 데이터 송수신
TCP 통신을 수행하기 위해 애플리케이션에서 전송할 데이터에 프로토콜 헤더와 TCP 헤더를 추가하여 전송하는데 이를 TCP 세그먼트라고 합니다. 이 때, 세그먼트의 크기가 크면 분할하여 여러 개의 TCP 세그먼트로 나누어 전송합니다. -
TCP 커넥션 끊기
애플리케이션의 데이터 전송이 완료되면, TCP 커넥션을 끊습니다. 이 과정에서4-Way Handshake
를 사용합니다.
3-Way Handshake
Cloudflare - TCP 3-Way Handshake
우선 3-Way Handshake를 수행하기 위해 TCP 헤더에 정의된 SYN
과 ACK
플래그를 사용합니다.
- 클라이언트에서 서버와의 연결을 수행하기 위해
SYN
플래그가 포함된 세그먼트를 서버에 전송합니다. 이 플래그는 세그먼트를 시작할 때 사용할 시퀀스 번호와 연결 요청이 가능하다는 의미를 가지고 있습니다. - 서버는
SYN
요청을 받고, 수신이 잘 되었음을 알리는ACK
플래그가 포함된 세그먼트를 다시 클라이언트에게 응답합니다. - 클라이언트는 서버로부터 응답을 확인하고, 다시
ACK
플래그가 포함된 세그먼트를 전송하여 웹 서버와 클라이언트(웹 브라우저 등) 모두 정상적인 연결을 확인을 합니다.
이 절차들을 모두 수행해야 TCP 통신을 위한 연결 확인 과정이 완료되며, 이후에는 TCP 내의 여러 프로토콜(HTTP 등)을 사용하여 데이터를 서로 송수신할 수 있습니다.
4-Way Handshake
Quora.com - 4-Way Handshake
TCP 통신을 끝내기 위해서 클라이언트와 서버는 4-Way Handshake
방식으로 세그먼트를 통신합니다.
- 클라이언트에서 서버 종료를 요청하기 위해
FIN
플래그가 포함된 세그먼트를 서버에 전송합니다. - 서버는
FIN
요청을 받고, 다시ACK
플래그가 포함된 세그먼트를 클라이언트에게 응답합니다. - 서버는 (2) 응답이 완료되면 연결 종료 신호인
FIN
플래그가 포함된 세그먼트를 다시 전송합니다. - 클라이언트는 종료에 대한 최종 승인으로
ACK
플래그를 전송하고, 이후에 TCP 연결이 완전히 닫히게 됩니다.
Fast Retransmit
TCP 통신에서 송신자가 중복 ACK 플래그를 3번 송신하면, 손실된 데이터로 간주하고 재전송 타이머를 만료시키지 않고 해당 데이터를 바로 재전송하는 TCP 프로토콜에서 제공하는 기능 입니다. TCP에서는 세그먼트를 전송할 때 재전송을 위해 재전송 타이머를 가동합니다. 간략한 과정을 설명드리면 아래와 같습니다.
- 세 번째 중복
ACK
가 수신되면 송신 윈도우(cwnd)와 수신자의 수용 가능한 윈도우 중 작은 값의 절반으로 임계 값(ssthresh)을 설정합니다. - 누락된 세그먼트를 재전송하고
cwnd
크기를 임계 값 + 세그먼트 크기의 3배 합계로 설정합니다. - 추가로 중복 ACK가 도착하면 세그먼트 크기만큼
cwnd
크기를 증가시키고, 새 cwnd 값이 허용하는 경우 패킷을 전송합니다. - 새 데이터를 수신한 다음
ACK
가 도착하면cwnd
를 임계 값으로 설정합니다. 이 ACK 값은 1단계에서 재전송한 후 한 번의 왕복 시간이 지난 후에 도착해야 하는 ACK입니다.
Flow Control
TCP 프로토콜을 사용한 데이터 송수신시, 특정 대역폭을 보장하여 데이터 통신을 수행할 수 있도록 수행하는 기능입니다. 이 기능에서 슬라이딩 윈도우
방식 또는 전송 후 대기(Stop and Wait Protocol)
방식을 사용합니다. 구체적인 내용은 지난 주 스터디에 공부한 내용이라 스터디 링크만 남겨두도록 하겠습니다!
슬라이딩 윈도우란?
educative - Sliding Window Protocol 슬라이딩 윈도우 프로토콜이란 패킷을 연속적이고 안정적으로 전송하기 위해 사용되는 프로토콜 방식 입니다.(주로 전송 계층 TCP 또는 Data Link 계층에서 사용) 발신자와 수신자 간 연결을 설정 할 때 두 개의 버퍼가 생성되고 각각 발신 윈도우(Sending Window), 수신 윈도우(Receiving Window)라고 불립니다.
마치 실제 창문의 움직임처럼, 일정한 패킷들을 담은 윈도우를 수신자에게 전송하고 올바르게 수신하면 ACK
플래그 값을 통해 다음 윈도우 크기의 패킷들을 전송합니다. 이미 전송된 패킷은 다시 수신되지 않도록 일정한 윈도우 사이즈를 기반으로 반복적으로 전송하므로써 순서대로 패킷을 전송해야하는 TCP 프로토콜에서 핵심적인 부분이라고 볼 수 있습니다.