[네트워크] TCP - 3 way handshake / 4 way handshake

2023. 1. 9. 00:29기술 창고/네트워크

728x90
SMALL

네트워크 관련된 학습을 진행하다보면 가장 기본적인 대표적인 기술 혹은 과정이라고 생각하는 것이 바로 이 3 Way Handshake, 4 way handshake 이다.

WebRTC, WebSocket 을 조금만 만져봤음에도 네트워크에 관해서도 학습을 해야할 필요가 있다고 느껴졌다.

따라서, 기본적인 3 Way Handshake, 4 way handshake를 먼저 정리해보자.

 


TCP (Transmission Control Protocol)

TCP란 서버와 클라이언트 간에 데이터를 신뢰성 있게 전달하기 위한 프로토콜이다. (반대로 UDP의 경우 신뢰성이 없다. 비연결형 지향성이기 때문)

데이터를 전송하기 전에 데이터 전송을 위한 연결을 만드는 연결지향성 프로토콜이다.

데이터는 네트워크 경로를 통해 전달되는 과정에서 손실되거나 순서가 바뀌는 등 잘못된 형식으로 전달될 수 있는데,

TCP는 이러한 손실을 탐색하여 교정하고 순서를 재조합할 수 있도록 해준다.

 

 

TCP 특징

1. 신뢰성

TCP는 손실되거나 이상이 있는 데이터가 네트워크 계층에서 순서가 틀어져서 전달되게 되면 신뢰성을 제공하기 위해 적극적으로 수신, 통지, 재전송 체계를 사용하여 신뢰성을 제공한다.

따라서, 신뢰할 수 있는 단말 간의 데이터 전달이 TCP의 가장 큰 특징이다.

 

 

2. 흐름제어

TCP 데이터 세그먼트를 송수신하는 컴퓨터는 CPU와 네트워크 대역폭의 차이 때문에 서로 다른 데이터 속도로 작동할 수 있다.

결국 수신자가 처리할 수 있는 것처럼 훨씬 더 빠른 속도로 송신자가 데이터를 보낼 가능성이 많다.

TCP는 송신자가 보낸 데이터의 양을 제어하는 흐름 제어 메커니즘을 구현한다.

 

 

3. 다중화

TCP에서는 한 라우터의 많은 프로세스가 TCP 통신 서비스를 동시에 사용할 수 있다. 

이것을 TCP 다중화라 한다.

이들 프로세스는 같은 네트워크 인터페이스에서 통신할 수 있으므로 네트워크 인터페이스의 IP 주소로 식별된다.

그러나 한 컴퓨터의 같은 네트워크 인터페이스를 사용하는 모든 프로세스는 공통의 IP 주소를 가지고 있으므로, 네트워크 인터페이스의 IP 주소외에도 더 많은 것이 필요하다.

TCP는 TCP를 사용하는 응용프로그램에 포트 번호 값을 연계시킨다.

각 연결은 서로 다른 포트 쌍을 사용하므로, 이 연관성은 원격 컴퓨터의 응용 프로그램 프로세스들 사이에 여러 연결이 존재할 수 있게 한다.

응용 프로그램 프로세스에 대한 포트의 바인딩은 각 컴퓨터에서 독립적으로 처리된다. 

 

 

4. 연결형 서비스

응용 프로그램 프로세스는 TCP를 사용하여 데이터를 보낼 수 있는 상태가 되려면 먼저 연결을 설정해야 한다. 

 

 

5. 양방향 전송

하나의 경로에서 데이터가 동시에 양방향으로 전송될 수 있다.

 

 

6. 3 way handshake 연결

 

 

 

3 way handshake

TCP 프로토콜을 이용하여 통신을 하는 응용 프로그램이 데이터를 전송하기 전에 정확한 전송을 보장하기 위해 상대 단말과의 사전에 전송을 위한 연결 세션을 수립하는 과정을 뜻한다.

 

이 과정을 통해서 양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고, 실제로 데이터를 전달하기 이전에 한 쪽이 상대 단말이 준비되었다는 것을 알 수 있도록 한다.

 

[handshake 절차]

 

[STEP 1]

A클라이언트는 B서버에 접속을 요청하는 SYN 패킷을 보낸다.

이때 A클라이언트는 SYN 을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태, B서버는 Wait for Client 상태이다.

 

[STEP 2] 

B서버는 SYN요청을 받고 A클라이언트에게 요청을 수락한다는 ACK 와 SYN flag 가 설정된 패킷을 발송하고

A가 다시 ACK으로 응답하기를 기다린다. 이때 B서버 SYN_RECEIVED 상태가 된다.

 

[STEP 3]

A클라이언트는 B서버에게 ACK을 보내고 이후로부터는 연결이 이루어지고 데이터가 오가게 되는것이다.

이때의 B서버 상태가 ESTABLISHED 이다.

위와 같은 방식으로 통신하는것이 신뢰성 있는 연결을 맺어 준다는 TCP의 3 Way handshake 방식이다.

 

 

# 간단 요약

1. Client > Server : TCP SYN

2. Server > Client : TCP SYN, ACK

3. Client > Server : TCP ACK

 

 

 

4 way handshake

3 way handshake가 TCP 연결을 위한 과정이라면, 4 way handshake.는 세션을 종료하기 위한 과정이다.

 

 

[handshake 절차]

 

[STEP 1]

클라이언트가 연결을 종료하겠다는 FIN플래그를 전송한다. 이때 A클라이언트는  FIN-WAIT 상태가 된다.

 

[STEP 2] 

B서버는 FIN플래그를 받고, 일단 확인메시지 ACK 보내고 자신의 통신이 끝날때까지 기다리는데 이 상태가

B서버의 CLOSE_WAIT상태다.

 

[STEP 3]

연결을 종료할 준비가 되면, 연결해지를 위한 준비가 되었음을 알리기 위해  클라이언트에게 FIN플래그를 전송한다. 이때 B서버의 상태는 LAST-ACK이다.

 

[STEP 4]

클라이언트는 해지준비가 되었다는 ACK를 확인했다는 메시지를 보낸다.

A클라이언트의 상태가 FIN-WAIT ->TIME-WAIT 으로 변경된다.

 

 

# 간단요약

1. Client > Server : TCP FIN

2. Server > Client : TCP ACK

3. Server > Client : TCP FIN

4. Client > Server : TCP ACK

 

 

그런데 만약 "Server에서 FIN을 전송하기 전에 전송한 패킷이 Routing 지연이나 패킷 유실로 인한 재전송 등으로 인해 FIN패킷보다 늦게 도착하는 상황"이 발생한다면 어떻게 될까? 

 

Client에서 세션을 종료시킨 후 뒤늦게 도착하는 패킷이 있다면 이 패킷은 Drop되고 데이터는 유실될 것이다. 

 

A클라이언트는 이러한 현상에 대비하여 Client는 Server로부터 FIN을 수신하더라도 일정시간(디폴트 240초) 동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 거치게 되는데 이 과정을 "TIME_WAIT" 라고 한다.

일정시간이 지나면, 세션을 만료하고 연결을 종료시키며, "CLOSE" 상태로 변화한다.

 

728x90
반응형
LIST

'기술 창고 > 네트워크' 카테고리의 다른 글

[네트워크] FTP / SFTP  (0) 2023.06.03
[네트워크] 동기 / 비동기  (0) 2023.02.07