CS/네트워크
3 way handshake & 4 way handshake
공백._.
2022. 10. 22. 21:54
3-Way Handshake
3Way Handshake란?
- TCP통신에서 사용하는 연결확인 방식으로 연결하고자 하는 두 장치 간의 논리적 접속을 성립하기 위해 3번의 확인을 거쳐 3way handshake라고 부른다. 3-way handshake를 통해 양쪽 모두 데이터를 전송할 준비가 되어있는지를 확인하고, 세션을 수립한다.
3way handshake의 플래그 정보
- SYN(synchronize sequence numbers) : 연결을 확인하기 위해 보내는 무작위의 숫자값.
- connection을 맺을 때 사용하는 포트는 유한 범위 내에서 사용하고, 시간이 지남에 따라 재사용된다. 따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 사용할 가능성이 존재한다.
- 서버 측에서 패킷의 SYN을 보고 패킷을 구분하게 되는데, 이때 난수가 아닌 순차적 숫자를 전송하면 이전의 connection으로부터 오는 패킷으로 인식할 수 있어 무작위 난수를 사용한다.
- ACK(acknowledgements) : 응답확인.
- client 혹은 server로부터 받은 SYN을 잘 받았을 경우 SYN에 1을 더해 다시 반환한다.
- 양단의 프로세스가 쉬지않고 데이터를 전송한다고 할 때 최초 연결 설정 과정에서 전송되는 첫번째 세그먼트를 제외한 모든 세그먼트의 ACK비트는 1로 지정된다.
- ISN(Initial Sequence Numbers) : 클라이언트와 서버가 각각 처음으로 생성한 syn.
3WAY-HANDSHAKE 중 포트의 상태
상태 설명
CLOSED | 연결 수립을 시작하기 전의 기본 상태 (연결 없음) |
LISTEN | 포트가 열린 상태로 연결 요청 대기 중 |
SYN-SENT | SYN 요청을 한 상태 |
SYN-RECEIVED | SYN 요청을 받고 상대방의 응답을 기다리는 중 |
ESTABLISEHD | 연결의 수립이 완료된 상태, 서로 데이터를 교환할 수 있다. |
3way handshake의 과정
(1)A→B:SYN
- A의 포트상태: CLOSED & B의 포트상태: LISTEN
- 접속 요청 프로세스 A가 연결 요청 메세지(SYN)를 전송한다. 여기서 A의 SYN은 ISN이다.
(2)B→A:SYN+ACK
- A의 포트상태: SYN-SENT & B의 포트상태: SYN-RECEIVED
- 접속 요청을 받은 프로세스 B가 요청을 수락하고, A에게 포트를 열어달라는 메세지를 전송한다. SYN에 1을 더한 ACK와 SYN을 전송한다.
(3) A→B: ACK
- A의 포트상태: ESTABLISHED & B의 포트상태: SYN-RECEIVED
- A가 B의 접속 요청 프로세스에 대한 수락 확인을 보낸다. 전송할 데이터를 이 시기에 보낸다.
⇒3way handshake가 끝났을 때 A와 B의 포트상태
- A의 포트상태: ESTABLISHED & B의 포트상태: EASTABLISHED
4-Way Handshake
4Way Handshake란?
- 3way handshake가 접속을 확인하기 위해 사용되었다면, 4way handshake는 반대로 가상 회선 연결을 해제할 때 주고받는 확인 작업이다.
Time-wait
- 먼저 연결을 끊는 쪽에 생성되는 소켓으로 혹시 모를 패킷 전송 실패에 대비하기 위해 존재한다. Time-wait이 없다면 패킷 손실이 발생하거나 통신자 간 연결 해제가 제대로 이루어지지 않을 수 있다.
- 예를 들어 서버에서 fin을 전송하기 전에 전송한 패킷이 routing지연이나 패킷 유실로 인한 재전송 등으로 인해 fin패킷보다 늦게 도착하는 경우, 데이터 유실을 막기 위해 FIN을 수신하더라도 세션을 남겨놓고 잉여패킷을 기다리는 과정(Time-wait)을 거쳐야 한다.
4WAY-HANDSHAKE 중 포트의 상태
상태 설명
CLOSE | 연결 수립을 시작하기 전의 기본 상태 (연결 없음) |
ESTABLISHED | 연결의 수립이 완료된 상태, 서로 데이터를 교환할 수 있다. |
CLOSE-WAIT | 상대방의 FIN(종료 요청)을 받은 상태. 상대방 FIN에 대한 ACK를 보내고 애플리케이션에 종료를 알린다. |
LAST-ACK | CLOSE-WAIT 상태를 처리 후 자신의 FIN요청을 보낸 후 FIN에 대한 ACK를 기다리는 상태. |
FIN-WAIT-1 | 자신이 보낸 FIN에 대한 ACK를 기다리거나 상대방의 FIN을 기다린다. |
FIN-WAIT-2 | 자신이 보낸 FIN에 대한 ACK를 받았고 상대방의 FIN을 기다린다. |
CLOSING | 상대방의 FIN에 ACK를 보냈지만 자신의 FIN에 대한 ACK를 못받은 상태 |
TIME-WAIT | 모든 FIN에 대한 ACK를 받고 연결 종료가 완료된 상태. 새 연결과 겹치지 않도록 일정 시간 동안 기다린 후 CLOSED로 전이한다. |
4WAY-HANDSHAKE 의 과정
(1) A→B: FIN
- 프로세스 A가 연결을 종료하겠다는 FIN 플래그를 전송하고, 프로세스 B가 FIN 플래그로 응답하기 전까지 연결을 유지한다.
(2) B→A : ACK
- 프로세스 B는 확인 메시지를 보내고 자신의 통신이 끝날 때까지 기다린다.
- ACK를 SequenceNum+1로 지정하고, ACK 플래그비트를 1로 설정한 세그먼트를 전송한다. 전송할 데이터가 남아있다면 이어서 계속 전송한다.
(3) B→A : FIN
- 통신이 끝나면 연결 종료 요청에 FIN플래그로 응답한다.
(4) A→B : ACK
- B의 FIN플래그를 확인했다는 메세지를 전송한다.