[네트워크] TCP 3-Way Handshake & 4-Way Handshake

함민혁·2023년 7월 14일
1

cs면접준비

목록 보기
10/43

TCP란

Transmission Control Protocol

인터넷상에서 데이터를 메세지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜

신뢰성을 중시하는 연결 지향적인 프로토콜
신뢰성 있는 전송을 위해 여러 기능을 제공함 -> 데이터의 세그먼트화, 순서 제어, 흐름 제어, 오류 검출 및 복구

신뢰성은 높지만 이로 인해 TCP의 속도는 느리다

TCP는 3-way handshaking으로 연결을 설정하고 4-way handshaking으로 연결을 해제함

TCP는 전이중(Full-Duplex) 방식을 통해 양쪽 방향으로 동시에 데이터를 주고받을 수 있음

웹 브라우징, 이메일, 파일 전송, 원격 접속 등 데이터의 안정적인 전송을 보장하기 위해 사용됨

UDP란

User Datagram Protocol

데이터를 데이터그램 단위로 처리하는 프로토콜 ( datagram : 독립적인 관계를 지니는 패킷)

비연결형 프로토콜로, 신뢰성보다는 단순한 데이터 전송을 목적으로 함. TCP와 달리 연결 설정과 연결 해제의 과정이 없음. 데이터를 보내는 쪽과 받는 쪽의 상태를 추적하거나 통신 경로를 설정할 필요가 없어 TCP보다 간단하고 경량화된 프로토콜임

신뢰성은 낮고 속도는 빠르다

실시간 스트리밍, 음성 및 비디오 통화, 온라인 게임 등에 주로 사용됨

TCP 3-Way Handshake

: tcp 프로토콜에서 연결을 설정하기 위해 사용되는 과정. 클라이언트 서버 간의 초기 연결을 수립하기 위해 세 개의 메시지를 교환하는 방식으로 이루어짐

  1. 클라이언트가 서버에게 연결 요청을 보냄. 이 때 클라이언트는 "안녕하세요. 연결하고 싶어요!"라는 메시지를 보냄. 이 메시지에는 클라이언트가 사용할 임의의 숫자도 포함돼 있음
  2. 서버는 클라이언트의 요청을 받고, 연결을 수락할 준비를 함. 서버는 "안녕하세요, 연결을 수락하고 클라이언트의 요청을 받을 준비가 됐어요!" 라는 메시지를 보냄. 이 메시지에는 클라이언트가 보낸 숫자에 1을 더한 숫자도 포함돼 있음. 그리고 서버도 임의의 숫자를 선택해서 포함시킴
  3. 클라이언트는 서버의 응답을 받고, 연결을 확정함. 클라이언트는 " 네 연결을 수락합니다!"라는 메시지를 보냄. 이 메시지에는 서버가 보낸 숫자에 1을 더한 숫자가 포함돼 있음

클라이언트->서버 ①SYN(seq=x)
클라이언트<-서버 ②SYN(seq=y)+ACK(x+1)
클라이언트->서버 ③ACK(y+1)

Full-duplex 통신

친구들이랑 대화를 할 때와 비슷한 개념
상대방과 대화하면서 동시에 듣기도 하고 말하기도 함. 동시에 양방향으로 대화가 이루어진다는 거임
Full-duplex 통신도 마찬가지임. 데이터를 보내는 쪽과 받는 쪽이 동시에 데이터를 주고받을 수 잇음. 송신자는 데이터를 보내는 동시에 수신자도 동시에 데이터를 받을 수 있음. 마찬가지로 수신자는 데이터를 받는 동시에 송신자에게 데이터를 보낼 수 있음.

특징
1. 동시성: 송신과 수신이 동시에 이루어짐. 양쪽은 독립적인 통신 경로를 가지고 있으므로, 송신자와 수신자는 동시에 데이터를 주고받을 수 있음
2. 전이중: 양방향 전송이 가능함. 데이터를 동시에 송신하면서 동시에 수신할 수 있음
3. 통신 경로 분리: Full-duplex 통신에서는 송신과 수신을 위한 별도의 통신 경로가 사용됨. 이렇게 분리된 통신 경로를 통해 동시에 데이터를 주고받을 수 있게 됨

양방향 통신이 필요한 상황에서 데이터 전송이 더 효율적이고 실시간성이 높아짐
(ex. 온라인 게임에서 여러 플레이어가 같이 플레이할때, Full-duplex 통신을 사용하면 실시간으로 데이터를 주고받을 수 있어 게임 플레이가 원활해짐)

TCP의 4-Way Handshake

: 연결을 해제하는 과정

  1. 클라이언트는 서버에게 연결 종료를 요청하는 메시지를 보냄. 이 메시지는 "데이터를 보낼 일 없으니 연결 종료해도 됩니다~" 라는 의미를 담고 있음
    <FIN(finish)플래그가 설정된 FIN패킷을 보냄>

  2. 서버는 클라이언트의 연결 종료 요청을 받고, 클라이언트에게 "네, 연결을 종료할게요." 라는 응답을 보냄. 이 응답은 클라이언트가 보낸 요청을 수락한다는 의미. 그러나 아직 클라이언트에 보내야할 데이터가 남아있을 수 있음.
    <클라이언트의 FIN패킷을 확인하고 수락함을 알리는 ACK(acknowledgment)패킷을 보냄>

  3. 서버는 모든 데이터를 보낸 후 연결을 종료하기 위해 클라이언트에게 "데이터를 모두 보냈어요. 이제 연결을 종료할게요."라는 메시지를 보냄
    <FIN패킷을 보내어 더 이상 데이터를 전송하지 않을 것임을 클라이언트에게 알림>

  4. 클라이언트는 서버의 연결 종료 요청에 대한 응답으로 "네., 데이터를 다 받았어요. 연결을 종료할게요"라는 메시지를 보냄. 이제 연결을 완전히 종료함
    <클라이언트는 서버의 연결 종료 요청에 대한 응답으로 서버의 FIN패킷을 확인하고 수락함을 알리는 ACK패킷을 보냄>

이렇게 클라이언트와 서버는 순서대로 FINACK 메시지를 주고 받으면서 연결을 종료함
양쪽에 모두 데이터를 주고받은 후에 연결을 완전히 종료하기 때문에, 모든 데이터가 안전하게 전송되고 받아졌음을 보장함

4-way handshake는 연결 종료를 깔끔히 처리해 네트워크 리소스를 효율적으로 관리하기 위해 사용됨
-> 결국 클라이언트와 서버의 연결을 안전히 끝내고 리소스를 확보하는 과정인거임

클라이언트 --> 서버 ①FIN(+ACK)
클라이언트 <-- 서버 ②ACK
클라이언트 <-- 서버 ②FIN
클라이언트 --> 서버 ③ACK

profile
Born to be FE developer 🧑🏻‍💻

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

애매했던 개념이 깔끔하게 정리되네요!

답글 달기