→ 3-Way Handshake 는 TCP의 접속, 4-Way Handshake는 TCP의 접속 해제 과정
→ 서버와 클라이언드 모두 연결 요청을 먼저할 수 있기 때문에, 연결 요청을 먼저 시도한 요청자를 Client로, 연결 요청을 받은 수신자를 Server 쪽으로 생각하면 됨
- 용어 정리
- 포트(PORT) 상태 정보
- CLOSED : 포트가 닫힌 상태
- LISTEN : 포트가 열린 상태로 연결 요청 대기 중
- SYN_RCV : SYNC 요청을 받고 상대방의 응답을 기다리는 중
- ESTABLISHED : 포트 연결 상태
- 플래그 정보
- TCP Header에는 CONTROL BIT(플래그 비트, 6bit)가 존재하며, 각각의 bit는 “URG-ACK-PSH-RST-SYN-FIN”의 의미를 가짐
- 즉, 해당 위치의 bit가 1이면 해당 패킷이 어떠한 내용을 담고 있는 패킷인지를 나타냄
- SYN(Synchronize Sequence Number) / 000010
- 연결 설정. Sequence Number를 랜덤으로 설정하여 세션을 연결하는 데 사용하며, 초기에 Sequence Number를 전송
- ACK(Acknowledgement)/ 010000
- 응답 확인. 패킷을 받았다는 것을 의미
- Acknowledgement Number 필드가 유효한지를 나타냄
- 양단 프로세스가 쉬지 않고 데이터를 전송한다고 가정하면 최초 연결 설정 과정에서 전송되는 첫 번째 세그먼트를 제외한 모든 세그먼트의 ACK 비트는 1로 지정된다고 생각할 수 있음
- FIN(Finish) / 000001
- 연결 해제. 세션 연결을 종료시킬 때 사용되며, 더 이상 전송할 데이터가 없음을 의미
- 포트(PORT) 상태 정보
- 3-way handshake : 연결 성립
- 개념
- TCP는 안정적이고 연결지향적인 트랜스포트 계층용 프로토콜로써, 연결 세션 설정을 위해 3단계의 핸드셰이킹 과정을 밟음
- TCP/IP 프로토콜을 이용해서 통신을 하는 응용 프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미
-
- TCP 통신은 PAR (Positive Acknowledgement with Re-transmission)을 통해 신뢰적인 통신을 제공
- PAR을 사용하는 기기는 ack을 받을 때까지 데이터 유닛을 재전송
- 수신자가 데이터 유닛(세그먼트)이 손상된 것을 확인하면(전송 계층의 checksum을 활용), 해당 세그먼트를 없애면 sender는 positive ack이 오지 않은 데이터 유닛을 다시 보내야 함
- 이 과정에서 클라이언트와 서버 사이에서 3개의 세그먼트가 교환되는 것을 확인할 수 있는데, 이것이 3-way handshake의 기본 메커니즘임기본 매커니즘
- 작동 방식
- 클라이언트는 서버와 연결하기 위해 3-way handshake를 통해 연결 요청을 함
- SYN (Synchronization) : 연결요청, 세션을 설정하는데 사용되며 초기에 시퀀스 번호를 보냄
- ACK (Acknowledgement) : 보낸 시퀀스 번호에 TCP 계층에서의 길이 또는 양을 더한 것과 같은 값을 ACK에 포함하여 전송
- 개념
- STEP 1 :: SYN
- 클라이언트는 서버와 커넥션을 연결하기 위해 SYN을 보냄 (seq : x)
- 송신자가 최초로 데이터를 전송할 때 Sequence Number를 임의의 랜덤 숫자로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트를 전송
- PORT 상태
- Client : CLOSED - SYN_SENT 로 변함
- SERVER : LISTEN
- STEP 2 :: SYN+ACK
- 서버가 SYN(x)을 받고, 클라이언트로 받았다는 신호인 ACK와 SYN 패킷을 보냄 (seq : y, ACK : x+1)
- 접속 요청을 받은 Q가 요청을 수락했으며, 접속 요청 프로세스인 P도 포트를 열어달라는 메세지를 전송 (SYN-ACK signal bits set)
- ACK Number필드를 Sequence Number +1로 지정하고 SYN과 ACK 플래그 비트를 1로 설정한 세그먼트 전송 (Seq = y, ACK = x+1, SYN, ACK)
- PORT 상태
- Client : CLOSED
- Server : SYN_RCV
- STEP 3 :: ACK
- 클라이언트는 서버의 응답인 ACK(x+1)와 SYN(y) 패킷을 받고, ACK(y+1)를 서버로 보냄
- 마지막으로 접속 요청 프로세스 P가 수락 확인을 보내 연결을 맺음 (ACK)
- 이때, 전송할 데이터가 있으면 이 단계에서 데이터를 전송할 수 있음
- PORT 상태
- Client : ESTABLISHED
- Server : SYN_RCV ⇒ ACK> ESTABLISHED
- 4-way handshake : 연결 해제
- 개념 : FIN 플래그를 이용하여 연결을 해제하는 과정
- Termination의 종류
- Graceful connection release (정상적인 연결 해제)
- 양 쪽의 커넥션이 서로 모든 커넥션을 닫을 때까지 연결되어 있음
- Abrupt connection release (갑작스런 연결 해제)
- 갑자기 한 TCP 엔티티가 연결을 강제로 닫는 경우
- 한 사용자가 두 데이터 전송 방향을 모두 닫는 경우
- 작동방식 (Abrupt)
- RST (TCP reset) 세그먼트가 전송되면 갑작스러운 연결 해제가 수행되는데, RST 세그먼트는 다음과 같은 경우에 전송
- 존재하지 않는 TCP 연결에 대해 비SYN 세그먼트가 수신된 경우
- 열린 커넥션에서 일부 TCP 구현은 잘못된 헤더가 있는 세그먼트가 수신된 경우
- RST 세그먼트를 보내, 해당 커넥션을 닫아 공격을 방지
- 일부 구현에서 기존 TCP 연결을 종료해야 하는 경우
- 연결을 지원하는 리소스가 부족할 때
- 원격 호스트에 연결할 수 없고 응답이 중지되었을 때
- 작동방식 (Graceful)
- STEP 1 (Client → Server : FIN(+ACK))
- 서버와 클라이언트가 연결된 상태에서 클라이언트가 close()를 호출하여 접속을 끊는다.(or 끊으려 함)
- 이 때, 클라이언트는 서버에게 연결을 종료한다는 FIN 플래그를 보냄
- 이 때, FIN 패킷에는 실질적으로 ACK도 포함되어 있음
- STEP 2 (Server → Client : ACK)
- 서버는 FIN을 받고, 확인했다는 ACK를 클라이언트에게 보내고 자신의 통신이 끝날대까지 기다림 (TIME_WAIT 상태)
- 서버(수신자)는 ACK Number 필드를 (Sequence Number +1)로 지정하고, ACK 플래그 비트를 1로 설정한 세그먼트를 전송
- 서버는 클라이언트에게 응답을 보내고 CLOSE_WAIT 상태로 들어가며, 아직 남은 데이터가 있다면 마저 전송을 마친 후에 close()를 호출
- 클라이언트에서는 서버에서 ACK를 받은 후에 서버가 남은 데이터 처리를 끝내고 FIN 패킷을 보낼 때까지 기다리게 됨
- STEP 3 (Server → Client : FIN)
- 데이터를 모두 보냈다면, 서버는 연결의 종료에 합의 한다는 의미로 FIN 패킷을 클라이언트에게 보낸 후에, 승인 번호를 보내줄 때까지 기다리는 LAST_ACK 상태로 들어감
- STEP 4 (Client → Server : ACK)
- 클라이언트는 FIN을 받고, 확인했다는 ACK를 서버에게 보냄
- 아직 서버로부터 받지 못한 데이터가 있을 수 있으므로 TIME_WAIT을 통해 기다림 (실질적인 종료과정 CLOSED에 들어가게 됨)
- 이 때 TIME_WAIT 상태는 의도치 않은 에러로 인해 연결이 데드락으로 빠지는 것을 방지
- 만약 에러로 인해 종료가 지연되다가 타임이 초과되면 CLOSED로 들어감
- 서버는 ACK를 받은 이후 소켓을 닫음
- TIME_WAIT 시간이 끝나면 클라이언트도 닫음
'CS > Network' 카테고리의 다른 글
[CS] HTTP & HTTPS (0) | 2024.01.26 |
---|---|
[CS] 대칭키 & 공개키 (1) | 2023.11.29 |
[CS] UDP (0) | 2023.11.29 |
[CS] TCP/IP 흐름제어 & 혼잡제어 (1) | 2023.11.29 |
[CS] OSI 7계층 (0) | 2023.10.24 |