CS/네트워크

3 Way-Handshake, 4 Way-Handshake

D_Helloper 2022. 12. 19. 19:22

3 Way-Handshake

3 Way-Handshake란?

  • TCP에서 통신하는 장치 간에 서로 연결이 잘 되어 있는지 확인하는 과정, 방식

ㅎㅇ

TCP 프로토콜은 연결 지향적, 상대방이 내 신호를 받을 수 있는지 확인한 후에 통신을 시작 → 내 신호를 받을 수 있는지 확인할 때 3 Way-Handshake!

  • TCP 표준에서는 Client가 먼저 3 Way-Handshake를 시작하기 때문에 Client를 Active Opener라고 표현, Server를 Passive Opener라고 표현

3 Way-Handshake 동작

  1. Client가 connect() System Call을 호출하여 Server에게 SYN Flag 전송 후 SYN_SENT로 Client의 State를 변경
    1. SYN_SENT 상태는 Server로부터 SYN+ACK Flag를 받거나 Timeout이 발생할 때 까지 유지
  2. bind(), listen() System Call을 호출하여 LISTEN 상태가 된 Server는 Client에게 SYN Flag를 받은 다음 accept() System Call을 호출하여 Client에게 SYN+ACK Flag를 전송하고 State를 SYN_RECEIVED로 변경
    1. SYN_RECEIVED 상태는 Client로부터 ACK Flag 또는 Data Packet을 수신하거나 Timeout이 발생할 때 까지 유지
  3. Client의 connect() System Call은 Server로부터 SYN+ACK Flag를 수신한 다음 종료, 이후에 Client는 Server에게 ACK Flag를 전송하고 상태를 ESTABLISHED로 변경
    1. send()/recv() System Call 호출을 통해 Server와 Data를 주고 받을 수 있음
  4. server의 accept() System Call은 Client로부터 ACK Flag를 수신하거나 SYN_RECEIVED의 Timeout에 의해서 종료

💥 Client가 SYN+ACK Flag의 응답으로 전송한 ACK Flag가 유실되면 ?

  • Client가 전송하는 Data Packet 안에 ACK Flag 및 Sequence Number가 있음
  • Server는 해당 내용을 가지고 Client가 수신을 잘 마쳤다는 것을 간접적으로 알 수 있음
  • ACK Flag가 아닌 Data Packet을 수신해도 Server의 accept() System Call 호출은 종료되고 상태를 ESTABLISHED로 바뀜
함수 기능
bind() 생성된 소켓에 주소를 부여
listen() 소켓에서 대기할 수 있는 연결 요청의 개수를 지정하는 역할, 소켓 활성화
accept() 서버 프로그램에서 클라이언트의 연결 요청을 대기하는 역할 수행
connect() 클라이언트 프로그램에서 서버에게 연결 요청을 수행
send() 연결형 서비스에서 데이터를 송신하는 역할
recv() 연결형 서비스에서 데이터를 수신하는 역할

TCP System Call : https://developer.ibm.com/articles/au-tcpsystemcalls/

4 Way-Handshake

4 Way-Handshake란?

  • 3 Way-Handshake를 통해 안전하게 세션을 생성하고 데이터를 주고 받은 뒤 연결을 해제 하고자 할 때 사용

ㅂㅇ

  • Client 뿐만 아니라 Server가 먼저 FIN Flag를 전송하여 4 Way-Handshake를 시작할 수 있음
  • TCP 표준에서는 먼저 시작하는 쪽을 Active Closer라고 하며 반대쪽을 Passive CLoser라고 표현

4 Way-Handshake 동작

  1. Active Closer에서 close() System Call을 호출하거나 Activer Closer의 Process가 종료되면, Active Closer가 이용하던 Socket은 Close가 되고 FIN Flag를 상대방에게 전송 후 상태를 FIN_WAIT_1 상태로 변경
    1. Passive Closer로부터 ACK Flag를 받을 때 까지 유지
  2. FIN Flag를 받은 Passive CLoser는 ACK Flag를 전송하고 CLOSE_WAIT 상태로 변경
    1. Socket이 Close 될 때 까지 대기를 하는 상태를 의미
    2. Active CLoser와 동일하게 Passive Closer에서 close() System Call을 호출하거나 Passive CLoser의 Process가 종료되어 Socket이 Closer가 되기를 기다리는 상태
  3. Passive Closer의 Socket이 Close 되면 Passive Closer는 FIN Flag를 Active Closer에게 전송하고 LAST_ACK 상태로 변경
  4. Passive Closer의 ACK Flag와 FIN Flag를 받은 Active Closer는 FIN_WAIT_2 상태 및 TIME_WAIT 상태가 되며 특정 시간 이후에 CLOSE로 변경
    1. TIME_WAIT 상태는 의도치 않은 에러로 인해 연결이 데드락으로 빠지는 것을 방지하기 위해 사용, 에러로 인해 종료가 지연되다가 타임이 초과되면 CLOSED 상태로 변경

3 Way-Handshake

A → B 들림?

B → A 들림, 너 들림?

A → B ㅇㅋ 들림

4 Way-Handshake

A → B 야 이제 가자

B → A ㅇㅋ 나 짐만 싸고

A 기다리는 중

B → A 나 다 쌈

A → B ㅇㅋ 가자

B는 강의실 밖으로 나가고 A는 강의실 정리를 마치고, 놓고 간 물건이 없는지 확인하고 불 끄고 나감