TCP 3-way-handshake & 4-way-handshake

Ouroboros·2023년 11월 15일
0

네트워크

목록 보기
11/20
post-thumbnail

TCP는 신뢰성 프로토콜이므로, 배달 하기전에 목적지가 무사한지 미리 확인하고 배달 끝나고도 다시 확인도 해주는 과정이 있다.
이러한 과정은 3 Way Handshake 와 4 Way Handshake이다.
둘다 똑같은 핸드쉐이크(Handshake)지만, 3 Way는 통신을 시작할때, 4 Way는 통신을 마칠때 거치는 과정이라는 차이만 있을 뿐이다.

🚩FLAG 잠깐 설명

제목1제목2
SYN접속요청을 할 때 보내는 패킷
TCP접속시에 가장 먼저 보내는 패킷
ACK상대방으로부터 패킷을 받은 뒤에, 잘 받았다고 알려주는 패킷
다른 플래그와 같이 출력되는 경우도 있다.
PSH데이터를 즉시 목적지로 보내라는 의미
FIN접속종료를 위한 플래그
이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 접속을 끊고자 할 때 사용


3 Way Handshake

양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고, 실제로 데이타 전달이 시작하기전에 한쪽이 다른 쪽이 준비되었다는 것을 알 수 있도록 한다.
양쪽 모두 상대편에 대한 초기 순차일련변호를 얻는다.

  1. 클라이언트는 접속을 요청하는 SYN 패킷을 보낸다.
    (이때 클라이언트 : SYN_SENT 상태, 응답을 기다린다.)
  2. LISTEN 상태였던 서버는 SYN 요청을 받으면, 클라이언트에게 요청을 수락하는 ACK 패킷과 접속요청을 하는 SYN 패킷을 보낸다.
    (이때 서버는 SYN_RCVD(SYN_RECEIVED)상태,
    클라이언트가 ACK 패킷을 보낼 때 까지 기다린다.)
  3. 클라이언트는 다시 서버에 ACK 패킷을 보내고, 이 후 ESTABLISHED 상태가 되어 데이터 통신이 가능하게 된다.



4 Way Handshake

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" 라고 한다.

참고자료

1) https://inpa.tistory.com/entry/NW-%F0%9F%8C%90-%EC%95%84%EC%A7%81%EB%8F%84-%EB%AA%A8%ED%98%B8%ED%95%9C-TCP-UDP-%EA%B0%9C%EB%85%90-%E2%9D%93-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EC%9E%90
2)

0개의 댓글