블로그를 변경하였습니다.

해당 블로그는 더 이상 추가 포스팅 없을 예정입니다.

👉 새 블로그 방문하기


[Network] TCP-3-WayHandshake & 4-WayHandshake

2021. 8. 24. 15:32
728x90
반응형

TCP-3-WayHandshake


TCP는 장치들 사이에 논리적인 접속을 성립(establish)하기 위하여 3-way handshake를 사용한다.

 

3 Way-Handshake 란 전송 제어 프로토콜(TCP)에서 통신을 하는 장치간 서로 연결이 잘 되어있는지 확인하는 과정, 방법이다.

TCP/IP프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미한다.

 

 

Client -> Server : TCP SYN

Server -> Client : TCP SYN ACK

Client -> Server : TCP ACK

  • 클라이언트가 통신을 하고 싶은 서버에 syn을 보낸다.
  • 그것을 받은 서버는 syn+1과 ack을 보낸다.
  • 그것을 받은 클라이언드는 마지막 ack을 보내고 서버는 그 신호를 받으면 서버와 클라이언트는 연결이 된다.

 

SYN
다른 컴퓨터로 전송 된 TCP 패킷으로 연결이 이루어 지도록 요청합니다. SYN이 두 번째 시스템에서 수신되면 SYN / ACK가 SYN이 요청한 주소로 다시 전송됩니다. 마지막으로, 원래 컴퓨터가 SYN / ACK를 수신하면 최종 ACK가 전송됩니다.

ACK 확인응답 (Acknowledgement)

송신된 메세지가 수신측에서 정상적으로 수신되었음을 송신측으로 확인응답하는 것 -> 오류제어 및 흐름제어를 위해 사용

 

이러한 절차는 TCP 접속을 성공적으로 성립하기 위하여 반드시 필요하다.

 

 

TCP의 3-way Handshaking 역할


양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고, 실제로 데이터 전달이 시작하기전에 한쪽이 다른 쪽이 준비되었다는 것을 알 수 있도록 한다.

 

양쪽 모두 상대편에 대한 초기 순차일련변호를 얻을 수 있도록 한다

TCP의 3-way Handshaking 과정

  • A클라이언트는 B서버에 접속을 요청하는 SYN 패킷을 보낸다. 이때 A클라이언트는 SYN 을 보내고 SYN/ACK 응답을 기다리는SYN_SENT 상태가 되는 것이다.
  • B서버는 SYN요청을 받고 A클라이언트에게 요청을 수락한다는 ACK 와 SYN flag 가 설정된 패킷을 발송하고 A가 다시 ACK으로 응답하기를 기다린다. 이때 B서버는 SYN_RECEIVED 상태가 된다.
  • A클라이언트는 B서버에게 ACK을 보내고 이후로부터는 연결이 이루어지고 데이터가 오가게 되는것이다. 이때의 B서버 상태가 ESTABLISHED 이다.

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

 

 

4-way Handshaking 


4-Way handshake세션을 종료하기 위해 수행되는 절차이다.

(서버와 클라이언트가 연결을 끊을때 데이터의 손실없는 전송을 보장하기 위해서 만들어진 과정)

 

* TCP의 4-way Handshaking 과정

  • 클라이언트가 종료하겠다는 신호인 FIN을 서버에 보내고 자신은 FIN_WAIT_1상태로 변경
  • 서버는 CLOSE_WAIT상태로 변경되고 응답으로 ACK을 보낸다. 그 후 서버는 클라이언트에게 자신이 보내지 못한 데이터를 다 보낸다.
  • ACK을 받은 클라이언트는 서버가 다 보내지 못한 데이터를 받기 위해서 FIN_WAIT_2상태로 변경되며 서버가 보내는 데이터를 받는다.
  • 서버는 데이터를 모두 전송하고 전송이 끝났는다는 FIN을 보낸다.
  • FIN을 받는 클아이언트는 아직 받지 못한 서버의 데이터를 받을 수 있기 때문에 TIME_WAIT 상태가 되며 ACK를 서버에 보내고 일정 시간 후 close상태가 된다.
  • 마지막으로 응답신호를 받은 서버는 close상태로 변경되면서 포트를 닫는다.
    • 클라이언트가 마지막에 ACK을 보내는 이유는 서버가 데이터를 다 보냈다는 FIN을 받지 못했다는 것이고 그러면 클라이언트는 계속 데이터를 기달리는 상황이 발생된다. 그래서 ACK을 보내서 FIN을 잘 받았는지 확인하는 것이다.
    • TIME_WAIT : 1) 서버에게 보낸 ACK이 도착하지 않은 경우 서버에서 오는 FIN를 다시 받기 위해 2) routing문제로 FIN을 두번 서버에서 클라이언트에게 보낸 경우. 똑같은 서버에 재연결했을 경우 클라이언트 통신에 끼어들어서 방해가능. 그래서 TIME_WAIT동안 최근 사용된 port를 봉쇄한다.

 

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

- 서버는 일단 확인메시지를 보내고 자신의 통신이 끝날때까지 기다리는데 이 상태가 TIME_WAIT상태다.

- 서버가 통신이 끝났으면 연결이 종료되었다고 클라이언트에게 FIN플래그를 전송한다.

- 클라이언트는 확인했다는 메시지를 보낸다.

 

그런데 만약 "Server에서 FIN을 전송하기 전에 전송한 패킷이 Routing 지연이나 패킷 유실로 인한 재전송 등으로 인해 FIN패킷보다 늦게 도착하는 상황"이 발생한다면 Client에서 세션을 종료시킨 후 뒤늦게 도착하는 패킷이 있다면 이 패킷은 Drop되고 데이터는 유실될 것이다. 

 

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

 

 


728x90
반응형

'CS > 네트워크' 카테고리의 다른 글

[Network] HTTP(1.1 , HTTP/2)  (0) 2021.08.31
[Network] HTTP  (0) 2021.08.28
[Network] 프록시 서버(proxy)  (0) 2021.08.28
[Network] RESTful  (0) 2021.08.26
[Network] OSI 7계층  (0) 2021.08.22

BELATED ARTICLES

more