3-Way Handshake
- 3-way handshake는 TCP/IP 프로토콜에서 연결 지향적 통신을 시작하기 위해 사용되는 과정이다.
- UDP에서는 사용되지 않으며, TCP 연결 설정 시에만 사용된다.\
- 연결 초기화 과정
| 상태 | 설명 |
|---|---|
| CLOSED | 연결 수립을 시작하기 전의 기본 상태 (연결 없음) |
| LISTEN | 포트가 열린 상태로 연결 요청 대기 중 |
| SYN-SENT | SYN 요청을 한 상태 |
| SYN-RECEIVED | SYN 요청을 받고 상대방의 응답을 기다리는 중 |
| ESTABLISHED | 연결의 수립이 완료된 상태, 서로 데이터를 교환할 수 있다. |
4-Way Handshake
- 4-way handshake는 TCP 연결을 종료할 때 사용한다.
- TCP는 신뢰할 수 있는 데이터 전송을 보장하는 연결 지향적 프로토콜이며, 연결을 안정적으로 종료하기 위해 4-way handshake 과정을 사용한다.
| 상태 | 설명 |
|---|---|
| FIN_WAIT1 | Close를 호출한 측의 소켓이 진입하는 상태, FIN 보냄 |
| CLOSE_WAIT | Close를 받으면 CLOSE_WAIT 상태로 진입함, Ack 보냄 |
| FIN_WAIT2 | Ack 신호를 받은 소켓은 FIN_WAIT1 > FIN_WAIT2로 상태 변경됨 |
| LAST_WAIT | Close 호출 후 진입하는 상태, FIN 보냄 |
| TIME_WAIT | Close를 받으면 진입하는 상태, ACK 보냄 |
| CLOSED | 연결 종료 |
현재 클라이언트의 시퀀스 번호가 포함된다.CLOSE_WAIT상태에서 LAST_WAIT상태로 변경된다.현재 서버의 시퀀스 번호가 포함된 FIN 패킷을 보내 연결 종료를 요청한다.| FLAG | 설명 |
|---|---|
| SYN ) 000010 (연결 요청 플래그) | TCP에서 세션을 성립할 때 가장 먼저 보내는 패킷 시퀀스 번호를 임의적으로 설정하여 세션을 연결하는 데 사용되며 초기에 시퀀스 번호를 보내게 된다. |
| ACK ) 010000 (응답플래그) | 상대방으로부터 패킷을 받았다는 것을 알려주는 패킷. 다른 플래그와 같이 출력되는 경우도 있다. 받는 사람이 보낸 사람 시퀀스 번호에 TCP 계층에서 길이 또는 데이터 양을 더한 것과 같은 ACK를 보낸다 (일반적으로 +1 하여 보냄). ACK 응답을 통해 보낸 패킷에 대한 성공, 실패를 판단하여 재전송 하거나 다음 패킷을 전송한다. |
| FIN ) 000001 (연결종료 플래그) | 세션 연결을 종료시킬 때 사용되며 더 이상 전송할 데이터가 없음을 나타냅니다. |
| RST ) 000100 (연결 재설정 플래그) | 재설정(Reset)을 하는 과정이며 양방향에서 동시에 일어나는 중단 작업. 비정상적인 세션 연결 끊기에 해당하며, 이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 즉시 연결을 끊고자 할 때 사용. |
| PSH ) 001000 (밀어넣기) | TELNET과 같은 상호작용이 중요한 프로토콜의 경우 빠른 응답이 중요하다, 이 때 받은 데이터를 즉시 목적지인 OSI 7 Layer 의 Application 계층으로 전송하도록 하는 FLAG이다. 대화형 트래픽에 사용되며, 버퍼가 채워지기를 기다리지 않고 데이터를 전달한다. 데이터는 버퍼링 없이 바로 7 계층의 응용프로그램으로 바로 전달한다. |
| URG ) 100000 (긴급 데이터 플래그) | Urgent pointer가 유효한 것인지를 나타낸다. Urgent pointer란 전송하는 데이터 중에서 긴급히 전달해야 할 내용이 있을 경우에 사용한다. 긴급한 데이터는 다른 데이터에 비해 우선순위가 높아야 한다. 예: ping 명령어 실행 도중 Ctrl+c 입력 |