해당 글은 VSFe 깃허브 레포를 참고하여 작성한 글입니다. (아래 출처에 표기)
✅ 3-Way Handshake에 대해 설명해 주세요.
3-Way Handshake는 TCP 연결을 설정하는 과정으로, 데이터 전송 전에 양측의 준비 상태를 확인하고 신뢰할 수 있는 세션을 수립하는 과정이다.
TCP와 관련된 자세한 설명은 여기를 참고하면 좋을 것 같다.
▶ 플래그 정보
FLAG | 기능 | 설명 |
SYN | 연결 설정 | Synchronize Sequence Number Sequence Number를 랜덤으로 설정하여 세션을 연결하는데 사용하며, 초기에 Sequence Number를 전송한다. |
ACK | 응답 확인 | Acknowledgement 패킷을 받았다는 것을 의미하며, Acknowledgement Number 필드가 유효한지 나타낸다. |
▶ 포트 상태 정보
STATE | 설명 |
CLOSED | 포트가 닫힌 상태 |
LISTEN | 포트가 열린 상태로 연결 요청 대기 중 |
SYN_SENT | SYN 요청을 한 상태 |
SYN_RECEIVED | SYN 요청을 받고 상대방의 응답을 기다리는 중 |
ESTABLISHED | 포트가 연결 상태 |
▶ 3-Way Handshake 동작 과정
- Client -> Server (SYN)
- 클라이언트는 서버에 연결을 요청하기 위해 SYN 패킷을 전송한다.
- 이 패킷의 세그먼트(segment)는 클라이언트의 초기 Sequence Number를 임의의 랜덤 숫자로 지정하고, SYN 플래그 비트를 1로 설정한다.
- PORT 상태
- 클라이언트: CLOSED -> SYN_SENT
- 서버: LISTEN
- Server -> Client (SYN/ACK)
- 서버는 LISTEN 상태에서 SYN 패킷을 수신한 후, 클라이언트의 요청을 수락하고 응답하기 위해 SYN-ACK 패킷을 전송한다.
- 이 패킷의 세그먼트(segment)는 ACK Number 필드를 클라이언트의 Sequence Number에 1을 더한 값으로 설정하고, SYN과 ACK 플래그 비트를 1로 설정한다.
- PORT 상태
- 클라이언트: SYN_SENT
- 서버: SYN_RECEIVED
- Client -> Server (ACK)
- 클라이언트는 서버의 SYN-ACK 패킷을 수신한 후, ACK 패킷을 서버에 보낸다.
- 이 패킷의 ACK Number 필드는 서버의 Sequenct Number에 1을 더한 값으로 설정되며, ACK 플래그가 설정된다.
- PORT 상태
- 클라이언트: SYN_SENT -> ESTABLISHED
- 서버: SYN_RECEIVED -> ESTABLISHED
✅ ACK, SYN 같은 정보는 어떻게 전달하는 것일까요?
- TCP 헤더에는 제어 비트(Control Bit) 또는 플래그 비트(Flag Bit)라고 불리는 6개의 비트가 있으며, 이 비트들은 TCP 세그먼트(segment)의 동작을 제어하는 역할을 한다. 각 비트는 "URG-ACK-PSH-RST-SYN-FIN"의 의미를 가진다.
- URG (Urgent): 1로 설정되면 긴급 데이터가 있음을 나타낸다.
- ACK (Acknowledgement): 1로 설정되면 패킷 수신에 대한 확인 응답을 나타낸다.
- PSH (Push): 1로 설정되면 수신 측에서 버퍼에 쌓지 않고 즉시 애플리케이션에 전달해야 함을 나타낸다.
- RST (Reset): 1로 설정되면 연결을 강제로 재설정해야 함을 나타낸다.
- SYN (Synchronize Sequence Number): 1로 설정되면 연결을 설정하기 위한 초기 Sequence Number을 동기화하려는 요청을 나타낸다.
- FIN (Finish): 1로 설정되면 연결을 종료하고 데이터 전송이 완료되었음을 나타낸다.
✅ 2-Way Handshaking를 하지 않는 이유에 대해 설명해 주세요.
▶ 신뢰성 확인 부족
2-Way Handshake는 3-Way Handshake의 마지막 과정인 클라이언트에서 서버에게 ACK 패킷을 보내는 과정이 생략되는 방법이다.
Handshake에서의 신뢰성 조건
1. 상대방에게 패킷이 전달 가능하다.
2. 상대방에게 패킷을 전달받을 수 있다.
- 2-Way Handshake에서는 클라이언트가 서버에 연결 요청을 보내고, 서버가 응답을 보내는 과정만으로 연결을 설정한다.
- 클라이언트는 서버의 연결이 성공적으로 이루어졌다는 것을 확인할 수 있지만, 서버는 클라이언트의 최종 ACK을 수신하지 못할 수 있다.
- 따라서 연결이 일방적으로 설정될 수 있으며, 서버의 입장에서는 1번 조건을 만족하지 못하기 때문에 서버는 연결 상태를 신뢰할 수 없게 된다.
▶ 초기 Sequence Number 동기화 부족
2-Way Handshake에서는 클라이언트와 서버가 서로의 초기 Sequence Number 번호를 동기화하기 전에 연결을 설정한다.
- 2-Way Handshake에서는 클라이언트와 서버가 서로의 초기 Sequence Number을 알지 못하므로, 세그먼트(segment)의 순서를 파악하고 데이터의 무결성을 유지하는 데 필요한 정보가 부족하다.
- 이는 데이터 전송 시 패킷의 순서가 어긋나거나 데이터가 손실되는 등의 문제가 발생할 수 있다.
✅ 두 호스트가 동시에 연결을 시도하면, 연결이 가능한가요? 가능하다면 어떻게 통신 연결을 수행하나요?
두 호스트가 동시에 연결을 시도할 수 있으며, 이 경우에도 연결이 가능하다. 이를 동시 연결 요청(Simultaneous Open)이라고 한다.
- SYN 패킷 전송
- 호스트 A와 호스트 B가 동시에 서로에게 SYN 패킷을 보낸다.
- 각 SYN 패킷에는 각 호스트의 초기 Sequence Number가 포함되어 있다.
- 이는 통상적인 연결 요청과 동일하게 동시에 발생한다.
- SYN-ACK 패킷 응답
- 호스트 A는 호스트 B로부터 SYN 패킷을 수신한 후, SYN-ACK 패킷으로 응답한다.
- 마찬가지로, 호스트 B도 호스트 A로부터 SYN 패킷을 수신한 후, SYN-ACK 패킷으로 응답한다.
- 이 단계에서 각 호스트는 상대방의 SYN에 대해 ACK을 보내면서 동시에 자신의 SYN에 대한 ACK도 기대한다.
- ACK 패킷 전송
- 호스트 A와 호스트 B 모두 상대방으로부터 받은 SYN-ACK 패킷에 대해 ACK 패킷으로 응답한다.
- 이 ACK 패킷은 상대방의 초기 Sequence Number에 1을 더한 값을 포함하여, 상대방의 SYN-ACK를 올바르게 수신했음을 확인한다.
✅ SYN Flooding에 대해 설명해 주세요.
SYN Flooding은 DDos(Distributed Denial of Service) 공격의 일종으로, TCP 3-Way Handshake의 취약점을 악용하여 네트워크 서비스를 방해하기 위해 사용된다.
- 대량의 SYN 패킷 전송
- 공격자는 대량의 SYN 패킷을 서버에 보낸다. 이 패킷들을 실제로 연결이 설정되지 않은 가짜 요청이다.
- 서버의 SYN-ACK 응답
- 서버는 각 SYN 패킷에 대해 SYN-ACK 패킷으로 응답한다. 이 패킷들은 서버의 연결 큐에 저장된다.
- 응답 대기
- 공격자는 서버의 SYN-ACK 패킷에 대한 응답을 일부러 보내지 않아, 서버는 계속해서 응답을 기다리면서 연결 요청을 처리하지 못한다.
- 연결 큐의 포화
- 결과적으로 서버의 연결 큐가 가득 차게 되어, 정상적인 클라이언트의 새로운 연결 요청을 처리할 수 없게 된다. 이를 통해 서버의 자원을 소모시키고, 정상적인 서비스가 중단되거나 심각하게 저하된다.
✅ 위 질문과 모순될 수 있지만, 3-Way Handshake의 속도 문제 때문에 이동 수를 줄이는 0-RTT 기법을 많이 적용하고 있습니다. 어떤 방식으로 가능한 걸까요?
0-RTT(Zero Round-Trip Time)는 TLS 1.3과 같은 최신 프로토콜에서 지원되는 기능으로, 연결 설정 속도를 개선하기 위해 사용된다.
- 세션 재사용
- 클라이언트는 이전에 연결한 서버와의 세션 정보를 캐시한다.
- 이 정보를 재사용하여 새로운 연결 설정 시, 기존의 세션 정보를 기반으로 빠르게 연결을 설정한다. 이 과정에서 추가적인 Handshake가 필요 없어 0-RTT 데이터 전송이 가능하다.
- 사전 공유 키 (Pre-Shared Key, PSK)
- 클라이언트와 서버는 사전에 공유한 암호화 키를 사용하여 연결을 설정한다.
- 이 암호화 키를 통해 초기 연결 단계에서 0-RTT 데이터를 전송할 수 있고, 초기 Handshake 과정 없이도 안전하게 송수신할 수 있다.
📍 문제 출처
Tech-Interview / 03-NETWORK.md
📍 참고 자료
'Programming > Network' 카테고리의 다른 글
[Network] www.github.com을 브라우저에 입력하면? (0) | 2024.08.18 |
---|---|
[Network] 4-Way Handshake (0) | 2024.08.14 |
[Network] OSI 7계층 (0) | 2024.08.11 |
[Network] IP (0) | 2024.08.06 |
[Network] DHCP (0) | 2024.08.05 |