TCP 연결, 해제 과정. 3 way hand shake, 4 way hand shake
3 way handshake
3-way-handshake 는 tcp/ip 프로토콜을 이용해 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정.
TCP 통신은 PAR (Positive Acknowldge with Re-transmission) 을 통해 신뢰적인 통신 제공.
PAR 을 사용하는 기기는 ack 을 받을 때 까지 유닛을 재전송한다.
수신자가 세그먼트 (데이터 유닛) 가 손상된것을 확인하면 해당 세그먼트를 없앤다.
그러면 송신자는 positive ack 이 오지 않은 데이터 유닛을 다시 전송해야 한다.
3 way handshake 의 역할은 양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고
실제로 데이터 전달이 시작하기 전에 다른 쪽이 준비 되었다는 것을 알 수 있도록 한다.
작동 방식
step 1) SYN 단계
A 클라이언트는 B 서버에게 클라이언트의 ISN을 담아 SYN 을 보냄.
ISN은 새로운 TCP 연결의 첫 번째 패킷에 할당된 32 비트의 임의의 시퀸스 번호를 말하며 장치마다 다를수 있음.
A 클라이언트 상태 : SYN 을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태
B 서버 상태 : LISTEN
step 2) SYN+ACK 단계
B 서버는 SYN 요청을 받고 A 클라이언트에게 요청을 수락한다는 ACK 와,
서버의 ISN 을 보내며 승인번호로 클라이언트의 ISN + 1 을 보낸다.
A 클라이언트 상태 : CLOSED
B 서버 상태 : SYN_RCV
step 3) ACK 단계
클라이언트는 서버의 ISN+1 한 값인 승인번호를 담아 ACK를 서버에 보냄.
A 클라이언트 상태 : ESTABLISED
B 서버 상태 : SYN_RCV -> ACK -> ESTABLISED
4 way handshake
tcp 연결을 해제하는 과정.
step 1)
클라이언트가 연결을 닫으려고 할때 FIN 으로 설정된 세그먼트를 보낸다.
그리고 클라이언트는 FIN_WAIT_1 상태로 들어가고 서버의 응답을 기다린다.
step 2)
서버는 클라이언트로 ACK 라는 승인 세그먼트를 보낸다.
그리고 자신의 통신이 끝날때 까지 기다리는 CLOSE_WAIT 상태에 들어간다.
클라이언트가 세그먼트를 받으면 FIN_WAIT_2 상태에 들어간다.
step 3)
서버는 ACK 를 보내고 일정 시간 이후에 클라이언트에 FIN 이라는 세그먼트를 보낸다.
step 4)
클라이언트는 TIME_WAIT 상태가 되고 다시 서버로 ACK를 보내서 서버는 CLOSED 상태가 된다.
이후 클라이언트는 어느 정도 시간을 대기한 후 연결이 닫히고 클라와 서버의 모든 자원의 연결이 해제된다.
클라가 어느 정도 시간을 대기하는 이유?
step3 에서 서버가 FIN 을 전송하기 전에 전송한 패킷이 FIN 패킷 보다 늦게 도착한다면 문제다.
따라서 클라이언트는 서버로부터 FIN 을 수신하더라도 일정시간 (디폴트 240초) 동안 세션을 남겨놓고 기다리는데 이 과정이 TIME_WAIT 이다.
연결할때보다 해제할때 스탭이 하나 더 필요한 이유는 step2 에서 ack를 보낸후 아직 서버에서 보낼 데이터가 남이 있을수 있기 때문이다.
따라서 일단 최초에 클라이언트가 보낸 fin 에 대해 ack 만 보내고, 데이터를 모두 전송한 후에 서버도 fin 을 보낸다.
즉 연결할때는 아직 아무런 데이터도 오가지 않은 최초의 상태이기 때문에 syn, ack+syn, ack 로 끝나지만,
연결을 해제 할때는 아직 전송하지 못한 데이터가 있을수도 있기 때문에 기다렸다가 또다시 fin,ack 가 이루어져야 한다.