TCP 개요
https://guhonga.tistory.com/260
UDP (User Datagram Protocol)
전송 계층 전송 계층은 프로세스 간 통신을 제공하고 흐름 및 오류 제어 메커니즘을 제공한다. 데이터 스트림을 application에서 전송 계층으로 전달하면연결을 생성하고 스트림을 전송 가능
guhonga.tistory.com
TCP는 UDP와 다르게
네트워크 상에서 신뢰할 수 있는 데이터 전송을 제공하는 연결형(connected) 통신 프로토콜이다.
데이터를 전송하기 전에 연결을 설정하여 안정적인 통신 환경을 제공한다.
또한 각 세그먼트의 순서, 크기, 오류를 관리하여 데이터의 일관성을 유지한다.
IP 프로토콜이 호스트 간 통신을 담당하여 IP 주소를 기준으로 데이터를 전달할 때
비연결형(비신뢰성)으로 패킷 손실 시 재전송을 하지 않는다면
TCP는 포트 번호를 사용하고, 프로세스 간 데이터를 신뢰성 있게 전달한다.
또한 클라이언트가 데이터를 서버로 보냄과 동시에 서버도 데이터를 클라이언트로 보낼 수 있는 양방향 데이터 전송(Full-Duplex)이 가능하다.
이를 위해 TCP는 송신 버퍼와 수신 버퍼를 각각 독립적으로 관리한다.
양쪽에서 데이터를 교환할 때, TCP는 각 패킷이 성공적으로 전송되었는지 확인하기 위해 ACK(확인 응답) 메시지를 정보를 데이터 패킷에 포함시켜 전송하는데
각각의 데이터 흐름(송신 및 수신)은 별도로 ACK를 주고받기 때문에 양방향 데이터 전송이 보장된다.
송신 측 TCP가 애플리케이션으로부터 문자 스트림을 수신받으면
데이터를 적절한 크기의 세그먼트로 나누고, 네트워크로 전송한다.
수신 측 TCP는 세그먼트를 수신하고 데이터 추출하여
순서가 어긋난 경우 세그먼트를 정렬시킨 후 데이터를 애플리케이션에 문자 스트림 형태로 전달한다.
이렇게 TCP는 데이터 흐름을 패킷(segment) 단위로 전송 및 수신하며, 애플리케이션 간 연속적인 데이터 스트림을 제공한다.
- 송신 측: 데이터를 세그먼트로 나누어 네트워크로 전송.
- 수신 측: 세그먼트를 원래 데이터 스트림으로 재조립.
또한 송수신 양측에서 데이터 버퍼를 사용하여 손실 및 순서 문제를 방지하고 효율적인 데이터 전송을 보장한다.
TCP 세그먼트 구성
UDP와 마찬가지로 헤더(Header)와 데이터(Data)로 구성되어있다.
다만, UDP의 데이터 단위는 데이터그램이었다면 TCP의 데이터 단위는 세그먼트 segment이다.
헤더 필드 세부사항
- 출발지 포트 번호 (16비트): 송신 애플리케이션의 포트 번호.
- 목적지 포트 번호 (16비트): 수신 애플리케이션의 포트 번호.
- 시퀀스 번호 (32비트): 세그먼트 내 첫 번째 바이트의 순서를 지정.
- 확인 번호 (32비트): 송신 측에서 수신한 데이터의 다음 예상 바이트를 표시.
- 헤더 길이 (4비트): TCP 헤더의 길이를 4바이트 단위로 표시.
- 예약 필드 (6비트): 향후 확장을 위한 예약 공간. (프로토콜이나 새로운 플래그 추가 목적)
- 플래그 (6비트):
- URG: 긴급 데이터 여부. 긴급 포인터와 함께 사용.
- ACK: 세그먼트 수신 확인.
- PSH: 데이터를 바로 애플리케이션으로 전달 요청.
- RST: 연결 재설정.
- SYN: 연결 초기화.
- FIN: 연결 종료.
- 윈도우 크기 (16비트): 송신자가 수신할 준비가 된 데이터 크기. (바이트 단위)
- 체크섬 (16비트): 데이터 오류 검출을 위한 필드. UDP에서 다룬 계산방식과 동일하다.
- 긴급 포인터 (16비트): 긴급 데이터를 포함한 마지막 바이트의 위치를 지정하여 수신자가 긴급 데이터부터 처리할 수 있도록 함.
데이터는 헤더 뒤에 위치하며, 실제 전송되는 페이로드(데이터)가 포함되어 있다.
그 외에 옵션 (Options) 필드는 TCP 연결의 추가적인 설정을 위해 사용한다.
TCP 옵션 필드
송신자가 수신자에게 추가 정보를 전달하거나 다른 옵션을 정렬하는 데 사용한다.
간단한 단일 바이트 옵션과 복잡한 설정인 다중 바이트 옵션으로 구성되어 있다.
End of Option
TCP 옵션 필드의 끝을 표시한다.
수신자는 이 옵션 이후 페이로드 데이터를 처리한다.
이 옵션은 32비트의 남은 공간이 없거나, 애플리케이션 데이터가 다음 32비트부터 시작한다는 의미를 갖는다.
MSS (Maximum Segment Size)
TCP 세그먼트에서 수신 가능한 데이터의 최대 크기이다. <0~65,535 바이트 (기본값 536 바이트) >
세그먼트 크기를 최적화하여 네트워크의 segment를 최소화한다.
윈도우 스케일 팩터 (Window Scale Factor)
슬라이딩 윈도우 크기를 확장하여 데이터 흐름을 최적화한다.
이 옵션을 통해 대규모 데이터 전송 환경에서 효율성을 증가시킬 수 있다.
타임스탬프 (Timestamp)
10 byte의 크기를 가지며 왕복 시간(RTT) 계산, 재전송 시간 초과(RTO)를 동적으로 설정한다.
세그먼트에 타임스탬프 값을 포함하여, 수신자는 해당 값을 다시 받아 RTT 계산 및 전송 효율성을 향상시킨다.
Flow Control - Sliding Window
송신자가 수신자의 처리 능력에 맞춰 데이터 전송 속도를 조절할 수 있도록 도와주는 것이다.
데이터가 전송되면서 ACK에 따라 윈도우가 점진적으로 이동하고
윈도우 크기는 수신자의 처리 능력과 버퍼 상태에 따라 바뀐다.
Sliding Window는 우선
송신자가 수신자로부터 수용 가능한 데이터 양(윈도우 크기)를 결정하고
수신자가 데이터 확인 응답(ACK)을 보내면 윈도우를 이동시킨다.
이런 동작은 송신 버퍼, 수신 버퍼, 윈도우 크기로 이루어져 있다.
송신 버퍼는 송신자가 보낼 데이터를 임시로 저장하고, 수신자의 ACK에 따라 데이터를 전송한다.
수신 버퍼는 수신된 데이터를 임시로 저장하여, 수신자가 데이터를 처리하지 않으면 송신자는 윈도우 크기를 줄인다.
윈도우 크기는 송신자가 보낼 수 있는 데이터의 최대량이다.
수신자가 데이터를 처리하지 못해 버퍼가 가득 찬 경우,
송신자는 더 이상 데이터를 전송하지 않도록 TCP 윈도우 크기 필드를 0으로 설정하여 윈도우 크기를 줄일 수 있다.
반대로 수신자가 데이터를 빠르게 처리하면 버퍼 공간이 늘어나 윈도우 크기를 증가시킬 수 있다.
TCP의 오류 감지 매커니즘은 3가지가 있다.
- 체크섬(Checksum):
- TCP 헤더와 데이터의 무결성을 확인.
- 송신자가 데이터를 전송하기 전에 체크섬을 계산하고, 수신자가 이를 비교하여 데이터 손상 여부를 판단.
- 확인 응답(ACK):
- 수신자가 성공적으로 수신한 데이터를 송신자에게 알림.
- 송신자는 ACK를 받으면 다음 데이터를 전송.
- 타임아웃(Time-out):
- 일정 시간 내 ACK를 받지 못하면 데이터가 손실되었다고 판단.
- 해당 세그먼트를 재전송.
이 그림은 ACK 신호를 통해 윈도우 크기를 동적으로 조정 하는 기본 예시이다.
손상된 세그먼트 오류 처리 방법
송신자는 세그먼트를 전송했으나, 수신자가 데이터 손상을 감지했다.
송신자는 타임아웃 후 손상된 세그먼트를 재전송한다.
분실된 세그먼트
송신된 세그먼트가 네트워크 상에서 유실된 경우이다.
수신자가 ACK를 보내지 않으면 송신자는 타임아웃 후 해당 세그먼트를 재전송한다.
중복 세그먼트
송신자가 ACK를 받지 못하고 동일한 세그먼트를 재전송하면 발생한다.
수신자는 중복된 데이터를 폐기한다.
순서가 바뀐 세그먼트
IP 경로상의 변동으로 인해 세그먼트가 순서대로 도착하지 않을 수 있다.
이런 경우, 수신자는 세그먼트를 올바른 순서로 재조합한다.
ACK 손실
수신자는 데이터를 올바르게 수신했지만 ACK가 송신자에게 도달하지 않는 경우이다.
송신자는 타임아웃 후 동일 데이터를 재전송하고,
수신자는 중복 데이터를 감지하여 폐기한다.
TCP 타이머
TCP는 데이터 전송과 흐름 제어의 신뢰성을 유지하기 위해 다음 네 가지 주요 타이머를 사용한다.
재전송 타이머 (Retransmission Timer)
송신된 세그먼트에 대한 확인 응답(ACK)이 일정 시간 내에 수신되지 않을 경우, 해당 세그먼트를 재전송한다.
작동 방식:
송신자는 세그먼트를 전송한 후 확인 응답을 기다리며 타이머를 시작.
타이머가 만료되면 해당 세그먼트를 손실된 것으로 간주하고 재전송.
타임-웨이트 타이머 (Time-Wait Timer)
연결 종료 후 잠재적인 세그먼트 충돌을 방지하기 위해 대기한다.
작동 방식:
연결이 종료된 후, 일정 시간 동안 세그먼트를 수신하지 않으면 타이머 만료.
이 시간은 두 배의 최대 세그먼트 생존 시간(MSL)로 설정.
유지 관리 타이머 (Keep-Alive Timer)
장기간 비활성 연결을 탐지하고 끊어진 연결을 감지한다.
작동 방식:
일정 시간이 지나도 데이터가 전송되지 않으면 Keep-Alive 프로브를 전송.
응답이 없을 경우 연결을 종료.
지속 타이머 (Persist Timer)
수신 창이 0으로 설정된 경우에도 송신자가 주기적으로 상태를 확인한다.
작동 방식:
수신 창 크기가 0일 때 지속적으로 프로브를 전송하여 상태를 확인.
상태가 회복되면 데이터 전송을 재개.
연결 설정 및 종료
TCP는 연결 지향 프로토콜로, 3-Way Handshake 와 4- Way Handshake 를 통해 안정적인 연결을 관리한다.
연결 설정 (3-Way Handshake)
시퀀스 넘버를 동기화하고 있다.
- SYN: 클라이언트가 서버에 연결 요청.
- SYN-ACK: 서버가 요청 확인 및 응답.
- ACK: 클라이언트가 응답을 확인하여 연결 완료.
연결 종료 (4-Way Handshake)
Receiver가 모든 데이터를 보낸 다음 FIN을 보내고 있다.
- FIN: 호스트 A가 연결 종료 요청.
- ACK: 호스트 B가 요청 확인.
- FIN: 호스트 B가 자신의 데이터 전송 완료 후 종료 요청.
- ACK: 호스트 A가 요청 확인.
TCP 연결의 상태 전이
주요 상태
- CLOSED: 연결이 설정되지 않은 초기 상태.
- LISTEN: 서버가 클라이언트로부터 연결 요청을 기다리는 상태.
- SYN-SENT: 클라이언트가 연결 요청 패킷(SYN)을 전송한 상태.
- SYN-RECEIVED: 서버가 SYN 패킷을 수신한 후 ACK와 SYN을 보내는 상태.
- ESTABLISHED: 연결이 성공적으로 설정된 상태로 데이터 전송이 가능.
- FIN-WAIT-1/2: 한쪽이 연결 종료를 요청한 상태로, 반대쪽의 응답을 기다림.
- CLOSING: 양쪽에서 동시에 연결 종료를 요청한 상태.
- TIME-WAIT: 모든 패킷이 소멸되기 위해 대기하는 상태.
- CLOSE-WAIT/ LAST-ACK: 한쪽이 FIN을 수신한 상태로, 남은 작업을 마무리 중.
위 도식을 기반으로 연결 종료 (4-Way Handshake) 과정을 살펴보면 다음과 같다.