3-way-handshake
TCP는 장치들 사이에 논리적인 접속을 성립하기 위하여 3-way handshake를 사용한다.
TCP 3 Way Handshake는 TCP/IP프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미한다.
양쪽 모두 데이터를 전송할 준비가 되어있다는 것을 보장하고, 실제로 데이터 전달이 시작하기 전에 다른 한쪽이 준비되었다는 것을 알 수 있도록 해준다.
![](https://velog.velcdn.com/images/yslys/post/d4db942b-4757-4fcd-b6a3-236c4a7c92ad/image.png)
- Step1 [Client -> SYN -> Server]
클라이언트가 서버에게 접속을 요청하는 SYN플래그를 보낸다.
이 때, 클라이언트는 SYN 을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태,
서버는 Wait for Client 상태이다.
- Step2. [Server -> SYN + ACK -> Client ]
Server는 Listen상태에서 SYN이 들어온 것을 확인하고 SYN_RECV상태로 바뀌어 SYN + ACK플래그를 클라이언트에게 전송한다. 그 후 서버는 다시 ACK 플래그를 받기 위해 대기상태(SYN_RECEIVED상태)로 변경된다.
- Step3. [Client -> ACK -> Server]
SYN + ACK 상태를 확인한 클라이언트는 서버에게 ACK를 보내고 연결 성립(Established)이 된다.
- State 정보
- CLOSED: 포트가 닫힌 상태
- LISTEN: 포트가 열린 상태로 연결 요청 대기 중
- SYN_RECV: SYNC 요청을 받고 상대방의 응답을 기다리는 중
- ESTABLISHED: 포트 연결 상태
- TIME-WAIT: Server로부터 FIN을 수신하더라도 일정시간(default: 240초)동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 말한다.
- Flag 정보
- TCP Header에는 CONTROL BIT(플래그 비트, 6bit)가 존재하며, 각각의 bit는 "URG-ACK-PSH-RST-SYN-FIN"의 의미를 가진다.
즉, 해당 위치의 bit가 1이면 해당 패킷이 어떠한 내용을 담고 있는 패킷인지를 나타낸다.
- SYN(Synchronize Sequence Number)
연결 설정. Sequence Number를 랜덤으로 설정하여 세션을 연결하는 데 사용하며, 초기에 Sequence Number를 전송한다.
따라서, Connection을 생성할때 사용하는 flag이다.
- ACK(Acknowledgement)
응답 확인. 패킷을 받았다는 것을 의미하는 flag이다.
Acknowledgement Number 필드가 유효한지를 나타낸다.
양단 프로세스가 쉬지 않고 데이터를 전송한다고 가정하면 최초 연결 설정 과정에서 전송되는 첫 번째 세그먼트를 제외한 모든 세그먼트의 ACK 비트는 1로 지정된다고 생각할 수 있다.
- FIN(Finish)
연결 해제. 세션 연결을 종료시킬 때 사용되며, 더 이상 전송할 데이터가 없음을 의미한다.
4-way handshake에서 사용한다.
4-way-handshake
3-way-handshake는 TCP의 연결을 초기화 할 때 사용한다면, 4-way-handshake는 세션을 종료하기 위해 수행되는 절차다.
![](https://velog.velcdn.com/images/yslys/post/ad04693b-3c53-4d9e-ad0b-1bd902e4b7dd/image.png)
- 동작방식
1.Step1 [Client -> FIN -> Server]
클라이언트가 연결을 종료하겠다는 FIN플래그를 전송한다. 보낸 후에 FIN-WAIT-1 상태로 변한다.
2.Step2 [Server-> ACK -> Client]
FIN 플래그를 받은 서버는 확인메세지인 ACK를 클라이언트에게 보내준다. 그 후 CLOSE-WAIT상태로 변한다. 클라이언트도 마찬가지로 서버에서 종료될 준비가 됐다는 FIN을 받기위해 FIN-WAIT-2 상태가 된다.
3.Step3 [Server -> FIN -> Client]
Close준비가 다 된 후 서버는 클라이언트에게 FIN 플래그를 전송한다.
4.Step4 [Client -> ACK-> Server]
클라이언트는 해지 준비가 되었다는 정상응답인 ACK를 서버에게 보내준다. 이 때, 클라이언트는 TIME-WAIT 상태로 변경된다.
여기서 TIME-WAIT 상태는 의도치않은 에러로 인해 연결이 데드락으로 빠지는 것을 방지하기 위해 변경 되는 것이다. 만약 에러로 인해 종료가 지연되다가 타임이 초과되면 CLOSED 상태로 변경된다.
🙇 참고 사이트 🙇
https://jeongkyun-it.tistory.com/180
https://bangu4.tistory.com/74