[Network] TCP-3-WayHandshake & 4-WayHandshake
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" 라고 한다..
'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 |