TCP란?

OSI 7 Layer 에서 L4 Transport Layer 에서 동작하는 프로토콜이다. 3 way-handshake 로 연결, 4 way-handshake 로 연결해제하는 과정을 거치므로 Connection-Oriented 연결지향형 프로토콜이다. 또한, 양방향통신이 가능한 full-duplex 를 지원하며 error 제어, flow 제어, congestion 제어 등의 기능을 제공한다. (신뢰성 있는 프로토콜)
 

 

TCP 세그먼트의 구조

전송 계층의 데이터 단위는 세그먼트라고 불리우며, 20 ~ 60 Bytes 의 가변적인 길이의 헤더와 Data 필드로 구성되어 있다.
 

1. HLEN
헤더의 길이는 4 bits 의 값에 15를 곱한 값이다. (1111 인 경우, 15 * 4 = 60)
 
2. Control Field
6bits 로 구성되어있는 필드로, 케이스별로 bit 마다 1 값을 세팅하여 TCP segment 가 전달된다.
 
1) URG : 긴급 데이터가 있을 경우에 사용하며, Urgent pointer 필드와 함께 사용된다.
2) ACK : ACK 응답을 전달하는 경우에 사용한다.
3) PSH : 버퍼가 다 찰 때까지 기다리지 않고 실시간성을 요구할 때 사용한다.
4) RST : TCP 연결 초기화 시에 사용한다.
5) SYN : TCP 연결 시에 사용한다.
6) FIN : TCP 연결 해제 시에 사용한다.
 
3. Window Size
Flow control 을 위해 사용되는 필드 ( Sliding Window ) 로, Receive Window Size (rwnd) 에 의해 Send Window Size 가 지정된다.

 

 

TCP 는 Connection Oriented 이고, 그 하위 계층인 IP 는 ConnectionLess 프로토콜인데 과연 어떻게 캡슐화가 가능한 것일까?

Source와 Destination 사이에 Virtual Path 가 설정되어, Segement 가 유실되거나 깨져도 재전송되어 순서를 맞춰주기 때문이다.
 
 

TCP  Numbering System

1. Byte Number
전송되는 Data 의 Byte Number 는 TCP 를 통해, 임의로 생성된 번호가 매겨진다.
 
2. Sequence Number 
Byte Numbering 후에 전달된 Segement 의 First Byte 가 Seqence Number 로 지정된다. (임의적으로 ISN, Initial Sequence Number 가 부여된다.)
 
3. Acknowledgement Number
다음으로 전달받기를 기대하는 Next Byte 를 전달하며, 누적 전송 (Go-back-N, Selective Repeat) 을 지원한다.
X byte 를 수신하면 X + 1 값을 ACK Number 로 전달한다. (Piggybacking)
 
 

 

TCP 연결 및 해제

1) 3 way-handshaking


- 연결 전, 초기 상태는 Client 와 Server 모두 Closed 상태이다. Passive 상태로, Server 는 Client 에서 보내올 SYN 를 수신하기 위한 대기 상태인 Listen 상태로 돌입한다.

- Client 는 연결하고자 하는 Server 에 SYN Segement 를 전송하고 SYN-SENT 상태가 된다.
- SYN Segement 의 Sequence Number 로 X 가 설정되며, 가상의 데이터를 함께 실어보낸다.

- SYN 를 수신한 Server 는 SYN-RCVD 상태가 되며, 상호 연결을 위한 SYN + 앞서 Client 에서 보내온 SYN 에 대한 응답으로 ACK 를 함께 Client 에게로 전송한다. 이때, SYN Segment 는 Sequence Number 를 소비므로 ISN 값 Y 의 Sequnce Number 와 X + 1 의  ACK 가 전송된다.

- Server 로부터 SYN + ACK 를 수신한 Client 는 SYN 에 대한 응답으로 ACK 를 Server 에게 전송한다. 단, ACK 는 Seqeunce Number 를 소비하지 않으므로 Sequence Number X 로 전송된다. 

- Server 가 ACK 를 수신하면 비로소 연결이 형성되고,  Client 와 Server 모두 ESTABLISHED 상태가 된다.

2) Data Transfer


- 앞선 연결 과정에서 Sequence Number 를 하나 소비했기 때문에 데이터 전송 시, X + 1 의  Sequence Number 를 사용하여 데이터 전송을 수행한다. ACK 는 연결 과정에서의 마지막 ACK 값 Y + 1 을 그대로 사용한다.

- 두번째 데이터 전송에서의 Sequence Number 는 실어보내는 데이터의 First Byte 로 설정한다. ACK 는 Y + 1 값 그대로 사용한다.

- 마찬가지로 서버 측도 앞선 연결 과정에서 Sequence Number 를 하나 소비했기 때문에 데이터 전송 시, Y + 1 의  Sequence Number 를 사용하고, 앞서 보내온 데이터를 무사히 수신했다는 의미로 전달받은 데이터의 Next Byte  Z + 1 을 ACK 로 전달한다.

- 데이터 송수신 과정에서는 ACK 에 데이터를 실어보내는 Piggybacking 방식을 사용한다.

- 마지막 부분에서는 별도의 데이터를 포함하지 않은 ACK 로 Sequence Number 를 소비하지 않으므로, Sequence Number 로 Z 값을 사용한다. Server 에서 보내온 데이터를 잘 수신했다는 의미로, 전달받은 데이터의 Next Byte W + 1 을 ACK 로 전달한다.

3) 4 way-handshaking

- Server 와의 연결을 끊고자 하는 Client 는 FIN 을 Server에게 전송하고 FIN-WAIT1 상태가 된다.

- 이에 대한 응답으로 Server 는 Client 에게 ACK 를 전송한다. 이때, Server 는 Closed-WAIT 상태가 된다.

- Server 로부터 ACK 를 수신한 Client 는 Client -> Server 로의 연결이 끊긴 상태이지만, Server -> Client 로의 연결은 유효하므로 Server -> Client 로의 데이터 전송은 아직 가능하며 Client 는 FIN-WAIT2 상태가 된다.

- 이제 Server 에서 Client 와의 연결을 끊기 위해 FIN 을 전송하며, 마지막 응답을 전달받기 위해 LAST-ACK 대기 상태가 된다.

- FIN 을 수신한 Client 는 이에 대한 응답으로 ACK 를 Server 에게 전송한다.

- 마지막 ACK 가 유실되는 경우 연결 해제 과정에서 문제가 발생하는 것을 방지하기 위해, Client 는 2MSL (Maximum Segment Lifetime, 20 ~ 30 s) timer 동안 TIME-WAIT 상태로 대기해야한다.
-> ACK 가 유실될 경우 재전송을 해야하는데, Client 가 먼저 CLOSE 된다면 불가능한 이야기이기 때문이다.

- Server 가 ACK 를 정상적으로 수신하면 양측의 연결은 완전히 종료되며 CLOSED 상태가 된다.
 

 

Flow-Control (흐름제어)

1. Push
수신 측의 버퍼 상황을 무시하고 데이터를 전송하는 방식으로, 데이터 유실 가능성이 있다.
따라서, 버퍼가 가득찼으니 천천히 데이터를 전송하라는 응답을 보내 Flow-Control 을 수행한다.
 
2. Pulling
수신 측에서 준비가 되었으니  요청을 보내오면 그제서야 데이터를 전송하는 방식으로, 데이터는 온전히 전송 가능하지만 속도가 느리다는 단점이 있다.

 

 

- 수신 측의 버퍼가 가득차면, 공간이 생길 때까지 데이터 전송을 중단한다.
- 수신 측의 버퍼에 공간이 생기면, 송신 측에 ACK 를 전송한다.
-  ACK 를 수신한 송신 측은 다시 데이터를 전송한다.
 

Error-Control (에러 제어)

- 송신 측에서 데이터를 전송할 때, 해당 데이터의 복사본은 송신측의 버퍼에 임시 저장된다.
- 데이터 오류 및 유실로 인해 수신 측으로부터 재전송 요청이 오면 해당 복사본을 재전송하며 정상적으로 전달된다면 복사본은 폐기된다. 이때, 몇 번째 Segement 가 오류인지 식별하기 위해 Sequence Number 가 필요하다.
 

 

Sliding Window

- 전송 가능한 최대 Segment 크기는 상대 측의 Window Size 만큼이다.
- 송신 측에서 수신 측의 Window Size 이내의 Segment 를 전송하며, 응답이 오기까지 대기한다.
- 수신 측이 Segement 를 정상적으로 수신하면, 송신 측으로 ACK 를 보낸다. 
- ACK 를 수신한 송신 측은 Window Sliding 을 통해 버퍼의 여유 공간을 확보한다.
- 여유 공간이 확보되면, 다시 수신 측으로 Segement 를 전송한다.

 


-> ACK 를 수신하기 전까지, 임시 복제본을 저장하고 있으므로 여유 공간이 부족해지는 현상이 발생한다.
 
1) Flow-Control
Window Size 를 통해 흐름제어를 수행한다.
 
2) Error-Control
Segment 전송 후, 응답 과정을 거쳐 오류 제어를 수행한다. 순서가 어긋난 Segement 는 임시 저장되어, 상위 계층으로 전달될 때 순서가 보정된다.

 

TCP 재전송 매커니즘

ACK 의 남발로 인한 트래픽 폭주를 방지하기 위해 ACK 를 전송하기 전 일정 시간 대기하며, 최소 2개의 Segment 가 수신되어야 ACK 를 보낸다. ACK timer 가 2번째 Segment 가 도착할 때까지 동작하며, 유효 시간이 만료되면 2번째 Segment 가 도착하지 않아도 ACK 가 전송된다.

- ACK 전송 시, 가능한 Piggybacking 방식을 사용한다.
- 데이터를 수신한 즉시 ACK 를 전송하지 않으며, 일정 시간의 Delay 후에 ACK 를 전송한다.
- 단, Segement 가 연속적으로 2개 도착하면 즉시 ACK 를 전송한다.

1. Time Out (Lost Segement)
- 2개의 Segment 가 도착하면 즉시 ACK 를 전달하며, ACK 를 수신하면 RTO (Retransmission Time Out) 타이머는 동작을 멈춘다.
- 순서에 어긋난 Segment 가 수신되면 해당 Segment 를 임시저장한 후, 원래 순서에 맞는 Segment 를 요청하는 ACK 를 전송한다.
- RTO 타이머가 만료되기 전까지 보낸 데이터에 대한 ACK 가 도착하지 않는다면, 유실된 Segment 를 재전송하며 RTO 타이머가 다시 재동작한다.

 


2. Duplicate ACK (Fast Retransmission)
연속적으로 3개의 중복 ACK 가 수신되면, 즉시 재전송을 요청하는 ACK 를 보낸다.

 


3. Lost Acknowlegement
ACK 가 유실되어도, 나중에 도착한 Segment 에 대한 ACK 로 누적 응답이 가능하다.

 

누적 응답을 수행하는 중에 ACK 가 유실되어 RTO 타이머가 만료되면, Segment 를 재전송하게 되어 중복된 Segment 를 수신하게 된다. 이때, 중복 Segment 를 폐기하고 받기를 원하는 Segment 를 요청하는 ACK 를 전송한다.

 

 

 

TCP Timter

TCP 에서 동작하는 타이머는 크게 4가지 종류로 분류된다.

 

1. Retransmission
일정 시간 후에도 ACK 도착하지 않을때, Segment 를 재전송하기 위해 사용한다.

2. Persistence
TCP 연결 과정을 거친 후에 아무런 Segment 전송 없이 방치되는 경우, 연결을 계속 유지하면 자원이 고갈된다. 이를 방지하기 위해 Probe Semgent 를 통해 Client 가 살아있는지 확인하고, Probe 에 대한 응답이 오지 않으면 TCP 연결을 종료한다.

3. KeepAlive
Probe Segment 가 주기적으로 전송되는 시간 주기이다.

4. TIME-WAIT
TCP 연결 해제 시, 마지막 ACK 가 유실되어 정상적인 연결 해제가 이루어지지 않는 것을 대비하여 (Deadlock) 대기하는 시간이다.

 

 

TCP 사용 사례

1. SMTP
메일의 장문의 메시지를 실어야 하는 경우가 있고, 첨부 파일의 크기가 클 수도 있기에 TCP 를 사용한다.

 

2. Downloading  a very large text from the Internet
파일이 유실되거나 손상된다면 재전송 받아야 하므로 신뢰성을 보장해주는 TCP 를 사용한다.

DDoS 공격 방지 솔루션 (SYN Flooding)

1. 수신 가능한 SYN Segment 의 개수를 제어한다.
2. 의도하지 않은 IP 주소로부터 수신된 SYN Segment 를 제어한다.
3. Cookie 를 사용하여 연결이 모두 정상적으로 설정될 때까지 자원을 할당해주지 않는다.

 



공부하면서 정리한 내용을 글로 작성하였습니다.
혹시나 잘못된 내용이 있다면 댓글로 알려주시면 감사하겠습니다 :)

COMMENT