TCP는 신뢰성 프로토콜이므로, 배달 하기전에 목적지가 무사한지 미리 확인하고 배달 끝나고도 다시 확인도 해주는 과정이 있다.
이러한 과정은 3 Way Handshake 와 4 Way Handshake이다.
둘다 똑같은 핸드쉐이크(Handshake)지만, 3 Way는 통신을 시작할때, 4 Way는 통신을 마칠때 거치는 과정이라는 차이만 있을 뿐이다.
제목1 | 제목2 |
---|---|
SYN | 접속요청을 할 때 보내는 패킷 TCP접속시에 가장 먼저 보내는 패킷 |
ACK | 상대방으로부터 패킷을 받은 뒤에, 잘 받았다고 알려주는 패킷 다른 플래그와 같이 출력되는 경우도 있다. |
PSH | 데이터를 즉시 목적지로 보내라는 의미 |
FIN | 접속종료를 위한 플래그 이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 접속을 끊고자 할 때 사용 |
양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고, 실제로 데이타 전달이 시작하기전에 한쪽이 다른 쪽이 준비되었다는 것을 알 수 있도록 한다.
양쪽 모두 상대편에 대한 초기 순차일련변호를 얻는다.
Way handshake는 세션을 종료하기 위해 수행되는 절차이다.
1. 서버와 클라이언트가 TCP 연결이 되어있는 상태에서 클라이언트가 접속을 끊기 위해 CLOSE() 함수를 호출한다.그러면 FIN 플래그를 보내게 된다.
(이때 클라이언트 : FIN_WAIT1 상태)
2. 서버는 클라이언트가 CLOSE() 한다는 것을 알게되고 CLOSE_WAIT 상태로 바꾼 후 ACK 플래그를 전송한다.만일 서버에서 클라이언트로 보낼 남은 데이터가 있을 경우 이때 나머지를 모두 전송시킨다.
3. ACK를 받은 클라이언트는 FIN_WAIT2로 변환되고, 이때 서버는 CLOSE() 함수를 호출하고 FIN 플래그를 클라이언트에게 보낸다.
4. 서버도 연결을 닫았다는 신호를 클라이언트가 수신하면 클라이언트는 ACK 플래그를 보낸 후 TIME_WAIT 상태로 전환된다.이 후 모든것이 끝나면 CLOSED 상태로 변환된다.
만약 "서버에서 FIN을 전송하기 전에 전송한 패킷이 FIN패킷보다 늦게 도착하는 상황"이 발생한다면?
-> 클라이언트에서 세션을 종료시킨 후 뒤늦게 도착하는 패킷이 있다면 이 패킷은 Drop되고 데이터는 유실될 것이다.
이러한 현상에 대비하여 클라이언트는 서버로부터 FIN을 수신하더라도 일정시간(디폴트 240초) 동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정거치게 된다. 이 과정을 "TIME_WAIT" 라고 한다.