Lsiron
3-Way Handshake, 4-Way Handshake 란? + 패킷이란 ? 본문
먼저, 패킷이란?
컴퓨터 네트워크에서 데이터를 전송할 때 사용하는 작은 데이터 단위이다!
데이터를 보내기 위해서는 한 번에 모든 데이터를 보내는 것이 아니라, 작은 조각으로 나눠서 전송해야 더 빠르고 안정적으로 데이터를 주고받을 수 있다.
이때 나뉜 조각을 패킷이라고 함!
이에 더해서 패킷은 보내는 쪽에서 데이터를 작은 조각으로 나눠서 전송하고, 받는 쪽에서는 이 패킷들을 다시 모아서 원래 데이터로 재구성하는 방식이다!
우리가 사진을 이메일로 보낼 때, 사진을 한 번에 보내는 것이 아니라, 네트워크는 이 사진을 여러 개의 작은 패킷으로 나눠서 상대방에게 보낸다! 각 패킷은 상대방의 컴퓨터로 다른 경로를 통해 이동할 수도 있지만, 마지막에는 모두 다시 모여서 원래의 사진으로 재구성 되는 것이다.
또한 패킷은 크게 두 부분으로 나눌 수 있다.
1. 헤더(Header): 패킷의 정보가 담긴 부분으로, 데이터가 어디에서 왔고 어디로 가야 하는지, 그리고 어떤 데이터인지에 대한 정보를 담고 있다. 일종의 주소와 안내서라고 생각하면 된다!
- 송신자와 수신자의 IP 주소
- 패킷의 순서 (데이터가 여러 조각으로 나눠졌을 때, 어떤 순서로 조립해야 하는지)
- 패킷 크기
- 기타 제어 정보 등
2. 페이로드(Payload): 실제로 전달하려는 데이터가 담긴 부분이다! 예를 들어, 이메일을 보내거나 웹 페이지 요청을 할 때 실제 내용이 여기에 담겨 있음!
정리하자면 패킷은 컴퓨터 네트워크에서 데이터를 작게 나눠서 전송하는 단위이다.
이렇게 나눠진 데이터 조각들은 네트워크에서 더 빠르고 신뢰성 있게 전송될 수 있으며, 손실이 발생해도 부분적으로 복구할 수 있다.
이러한 패킷은 네트워크 통신의 기본 단위로 매우 중요한 역할을 한다.
자 그렇다면 이제 3-Way Handshake에 대해 알아보자.
3-Way Handshake는 TCP 연결의 기초적인 과정으로, 클라이언트와 서버가 신뢰할 수 있는 방식으로 데이터를 주고받기 위한 중요한 단계이다.
TCP(Transmission Control Protocol)는 신뢰성 있는 데이터 전송을 보장하기 위해, 데이터를 패킷 단위로 나누어 전송하고, 중간에 패킷이 손실되거나 순서가 바뀌지 않도록 관리한다.
이 3-Way Handshake는 TCP 연결을 성립할 때 사용되며, 데이터 전송을 시작하기 전에 클라이언트와 서버가 서로 통신 준비가 되었는지 확인하는 과정이다.
3-Way Handshake의 과정은 크게 3단계로 진행된다!
1단계: 클라이언트가 서버에게: SYN 전송
- 클라이언트(사용자)가 먼저 손을 들고 "저와 통신을 시작할 수 있나요?"라고 말한다. 이 과정에서 클라이언트는 SYN 플래그를 설정한 패킷을 서버에게 보낸다.
- 이 패킷에는 임의의 시퀀스 번호(sequence number)가 포함되어 있다. 이를 통해 클라이언트는 서버가 어떤 데이터를 주고받고 있는지 파악할 수 있게 된다.
2단계: 서버가 클라이언트에게: SYN-ACK 전송
- 서버는 클라이언트의 요청을 받으면 "네, 준비됐어요! 당신도 준비되셨나요?"라고 답장한다. 이때 서버는 SYN-ACK 패킷을 보내며, 여기에는 서버 자신의 시퀀스 번호와 함께 클라이언트의 요청(SYN)에 대한 응답이 들어 있음.
- 즉, 서버도 자신의 시퀀스 번호를 포함하여 "저도 준비되었어요"라는 의미로 SYN 플래그를 설정하고, 동시에 클라이언트가 보낸 SYN 패킷에 대한 응답으로 ACK 플래그를 설정한다.
3단계: 클라이언트가 서버에게: ACK 전송
- 마지막으로 클라이언트는 "확인했습니다. 이제 데이터를 주고받을 준비가 됐어요!"라고 답한다. 이때 클라이언트는 ACK 플래그가 설정된 패킷을 서버에게 보내고, 이로써 3-Way Handshake가 완료된다.
- 이제 클라이언트와 서버는 서로 데이터를 안전하게 주고받을 준비가 된 상태이다.
그렇다면 3-Way Handshake의 목적은 무엇일까?
- 통신 준비 확인: 클라이언트와 서버가 모두 데이터 전송을 준비했는지 확인.
- 신뢰성 보장: 시퀀스 번호를 통해 데이터의 순서와 무결성을 보장.
- 상호 연결 설정: 양측이 서로의 상태를 인지하고, 연결이 제대로 이루어졌음을 보장.
여기서 시퀀스 번호는 뭘까?
3-Way Handshake에서 중요한 개념 중 하나는 시퀀스 번호(sequence number)다.
이 번호는 TCP가 패킷의 순서를 관리하고 데이터 손실을 방지하는 데 중요한 역할을 한다.
- 시퀀스 번호: 각 패킷에는 시퀀스 번호가 부여되며, 이는 해당 패킷이 전체 데이터 스트림에서 몇 번째 위치에 있는지를 나타낸다. 예를 들어, 클라이언트가 SYN 패킷에 시퀀스 번호 1000을 포함해서 서버에게 보내면, 서버는 이를 기준으로 이후 전송할 데이터를 정렬할 수 있다.
- ACK 번호: 서버는 클라이언트로부터 받은 시퀀스 번호에 1을 더한 값으로 응답한다. 예를 들어, 클라이언트가 시퀀스 번호 1000을 보냈다면, 서버는 ACK 번호 1001을 보낸다. 이 값은 클라이언트가 보낸 데이터를 제대로 수신했음을 나타낸다.
이러한 시퀀스 번호와 확인 응답(ACK 번호)을 통해, TCP는 데이터가 손실되지 않고, 중복되지 않으며, 순서에 맞게 전송되는지 확인한다.
3-Way Handshake의 실패 시 처리
3-Way Handshake 과정에서 문제가 발생하면, 연결이 성립되지 않는다.
- 클라이언트가 SYN 패킷을 보냈는데 서버가 응답하지 않으면 연결 시도가 실패하고, 클라이언트는 일정 시간 후 재시도를 하게 된다.
- 서버가 SYN-ACK를 보냈는데 클라이언트가 ACK를 보내지 않으면, 서버는 연결을 중단하고 다시 연결 요청을 받을 준비를 한다.
이러한 과정을 통해 TCP는 신뢰성 있는 연결을 보장할 수 있다.
3-Way Handshake 에 대해 알아 보았으니, 이제 4-Way Handshake를 파헤쳐 보자.
4-Way Handshake란?
TCP 연결을 종료할 때 사용되는 과정이다.
TCP에서는 연결을 시작할 때 3-Way Handshake를 사용해 신뢰성 있는 연결을 설정하고, 데이터를 주고받은 후에는 4-Way Handshake를 사용해 그 연결을 안전하게 종료한다.
4-Way Handshake 과정은 크게 4단계로 진행된다!
TCP 연결을 종료할 때는 클라이언트와 서버가 서로 연결을 종료하겠다는 신호를 주고받는다. 이 과정은 네 단계로 이루어잔다.
1단계: 클라이언트가 서버에게: FIN 전송
클라이언트는 FIN 플래그가 설정된 패킷을 서버에게 보낸다. 이는 클라이언트가 "이제 나는 더 이상 데이터를 보내지 않겠다"라는 신호를 서버에게 보내는 것.
- FIN (Finish): 데이터 전송을 끝내겠다는 의미로 "종료 요청"을 나타낸다.
2단계: 서버가 클라이언트에게: ACK 응답
서버는 클라이언트로부터 FIN 패킷을 받으면, "알겠어, 네가 더 이상 데이터를 보내지 않는다는 걸 확인했어"라는 의미로 ACK 패킷을 클라이언트에게 보낸다.
- ACK (Acknowledgment): 클라이언트의 종료 요청을 받았음을 확인하는 패킷. 하지만 서버는 아직 데이터를 보낼 준비를 하고 있을 수 있다.
3단계: 서버가 클라이언트에게: FIN 전송
서버는 자신의 데이터 전송이 끝났을 때, 클라이언트에게 FIN 플래그가 설정된 패킷을 보내면서 "나도 이제 데이터를 더 이상 보내지 않겠다"라고 알린다.
- 이 단계에서 서버는 자신도 연결을 종료하겠다는 신호를 클라이언트에게 보낸다.
4단계: 클라이언트가 서버에게: ACK 응답
클라이언트는 서버의 FIN 패킷을 받으면, 다시 ACK 패킷을 보내면서 "알겠어, 나도 네 종료 요청을 받았어"라고 응답. 이로써 TCP 연결이 완전히 종료.
4-Way Handshake의 목적은 무엇일까?
- 데이터 유실 방지: 연결을 종료하는 동안, 양측이 모든 데이터를 완벽하게 전송했는지 확인하고 종료함으로써 데이터 유실을 방지할 수 있다.
- 양방향 종료: TCP는 양방향 통신이기 때문에, 서버와 클라이언트 모두 데이터 전송이 끝났음을 명확히 확인하는 과정이 필요하다.
4-Way Handshake의 실패 시 처리
4-Way Handshake 실패 시 TCP가 신뢰성 있는 연결을 유지하기 위해 다양한 재전송 메커니즘과 타임아웃을 통해 문제를 해결하려고 시도한다.
- 타임아웃과 재전송: TCP는 패킷이 도착하지 않으면 타임아웃을 설정하고 재전송을 시도한다.
- 연결 강제 종료: 일정 횟수 이상 재전송에 실패하면 연결을 강제 종료한다.
- RST(Reset) 패킷: 비정상적인 상황에서는 RST 패킷을 통해 즉각 연결을 강제 종료할 수 있다.
- 데이터 손실 방지: 비정상적인 연결 종료 시에도 데이터 손실을 최소화하고 재전송을 통해 데이터 전송의 신뢰성을 유지한다.
이러한 메커니즘을 통해 TCP는 연결 종료 과정에서 발생할 수 있는 문제를 해결하고, 데이터 손실 없이 안정적으로 통신을 종료할 수 있도록 보장한다.
'공부방 > CS' 카테고리의 다른 글
HTTP? HTTPS? (0) | 2024.07.04 |
---|---|
네트워크와 IP 그리고 TCP와 UDP (0) | 2024.07.04 |