백엔드/네트워크

[네트워크기초이론]#27. TCP 연결, LAN선 뽑기 그리고 게임해킹!

묘걍 2023. 10. 19. 21:25

LAN케이블을 뽑으면 TCP 연결은 어떻게 될까?

구조: Layered

- L3는 L4의 기반 (Base)

     - TCP의 Base 프로토콜은 IP

- 연결이라는 개념은 TCP에도 있고 Access 계층에도 있다

     - TCP: 연결, connection, session

     - Access계층: Link - up / down

- TCP는 L2 이더넷보다 위에 있다 = (L4가 성립하려면) L1, L2, L3가 성립했다는 전제 하에 L4가 성립

     - 어떤 사람이 "대학 졸업했다"라고 하면 초중고는 이수했다는 전제 O

- TCP 연결이 성립했다

     - Ethernet연결 (=Link-up 상태 = 물리적 통신 가능)상타에서 Virtual Circuit 연결이 성립

더보기

네트워킹에는 크게 두 가지 전송 모드가 있다: 회로 교환(Circuit Switching)과 패킷 교환(Packet Switching). 가상 회로(Virtual Circuit, VC)는 패킷 교환 네트워크에서 회로 교환의 원칙을 모방한 것이다.

Virtual Circuit (가상 회로)는 두 가지 주요 특성을 가진다:

  1. 연결 설정: 소스와 목적지 사이에 VC를 설정하기 위해 경로를 결정하고, 각 라우터에 VC 정보를 설정한다.
  2. 상태 유지: VC가 활성 상태일 때, 네트워크 요소(예: 라우터)는 VC에 대한 상태 정보를 유지한다.

Virtual Circuit의 주요 특징은 다음과 같다:

  1. 경로 선택: VC가 설정될 때, 경로가 결정되고 모든 패킷은 동일한 경로를 따른다.
  2. 패킷 순서: 패킷들은 도착한 순서대로 목적지에 도달한다. VC 때문에 중간 라우터에서 순서가 바뀌는 일은 없다.
  3. 오버헤드: VC 설정에는 초기 오버헤드가 필요하다. VC를 설정하고 해제할 때 추가 프로토콜 동작이 필요하다.
  4. 상태 정보: VC가 활성 상태일 때, 관련 라우터들은 해당 VC에 대한 상태 정보를 유지한다.

예컨대, ATM (Asynchronous Transfer Mode)와 Frame Relay는 VC를 사용하는 네트워크 기술 중 일부다.

결국, Virtual Circuit은 패킷 교환 네트워크에서 회로 교환의 일부 특성을 따라 일련의 패킷들이 동일한 경로로 전송되게 한다.

 

File 다운 받는 상황에서

❓ 용량이 있는 파일을 한번에 다운 받는 동안(토렌트X) 중간에 LAN케이블 분리하면?!

🤔 TCP 연결은 어떻게 될까?

- 5초, 10초, 15초, 20초... 실험해보면 멈췄던 게 그대로 잘 진행됨

- 어느 순간 되면 네트워크 이상으로 다운 못 받는 다고 뜸

Network 충격

- 물리적인 Link가 끊어진 것 (강제 Link down)

- L4가 유지될 때는 L2와의 간극이 있다

- 유선에서는 충격이 잘 안 나는데

- 무선에서는 허구한날 충돌

     - 지하철에서 데이터 사용시 기지국 갈아탐 = 연결 끊고 다시 연결한 것

- 그 충격과 상관 없이 TCP 연결은 유지

     - Virtual이라 논리적으로 유지

- RFC 표준에서는 2시간 정도로 정의하지만 실제로는 75초 정도

 

게임 서버

- 유저가 75초동안 LAN 케이블을 뽑았다 다시 연결해도 그 상태가 유지?

- 이렇게 되면 게임 서버가 정상 작동 될 수가 없다

- 동기화가 깨지는 경우 多

 

연결 세션 관리

- 실제 논리적 충격이 있었는데 프로그램이 인지를 못 하는건지

   내가 신경 안 써도 되는 건지 확인하도록

- ping과는 다름!

- 프로토콜 설계할 때 Keep alive 메커니즘을 넣도록 함

 

LAN선을 뽑으면 일정 시간 동안 유지된다

- 프로토콜에 따라 다름

 

게임 해킹

- TCP 연결은 착각이다

게임 실화

- MMORPG 등은 사용자가 다중으로 동시에 접속하며 동기화 이슈가 심함

- 같은 게임, 같은 시간, 같은 공간으로 이동하면 보는 화면이 같음

- Server와 Client는 TCP연결이 되어 있다

Inmemory

- 성능 높이려 예전에 

- 서버는 항상 DB와 연결

- DB가 직접 반응하게 했을 경우 DB 응답이 느려지면 게임이 느려지니까 이걸 해결하겠다고 중간에 memory를 둠

- inmemory 처리를 일부 하고 여유가 있으면 DB에 처리

- 잘못하면 초대형 사고

아이템 복제

1️⃣철수가 아이템을 들고 있다

     - 철수 화면에서도 철수가 들고 있다

     - 영희 화면에서도 철수가 들고 있다

2️⃣철수가 아이템을 내려놨다

      - 철수 화면에서도 아이템이 바닥에 있다

      - 영희 화면에서도 아이템이 바닥에 있다

3️⃣철수가 다시 집어 들었다

🚫이때 철수의 LAN 케이블 뽑아 연결이 끊겨 철수가 다시 아이템을 든 신호가 전달되지 않음

      - 철수 화면에서는 철수가 들고 있다

      - 영희 화면에서는 여전히 바닥에 있다

4️⃣(철수의 연결이 유지될 수 있는 시간 동안)그 사이 영희가 집어 들었다

5️⃣ 철수가 LAN 케이블을 다시 꽂았다

⭕ 철수의 TCP 연결은 유지

      - 철수 화면에서 철수도 영희도 아이템을 들고 있다

      - 영희 화면에서 철수도 영희도 아이템을 들고 있다

      (❗아이템은 unique한 것)

 

네트워크 공부하는 사람들은 이 점을 잘 생각해볼 것

Network 충격에 대해 생각해보기

- 소켓으로 뭔가 할 때

- 물리적 수준의 L1, L2 수준의 충격에 대해서 윗단(L3, L4 ~)에서 어떻게 대응하게 할건지

- 성능을 잃지 않으면서도 그것이 대응 가능한지

 

HTTP는 Stateless

- 연결 개념이 없다

- 연결이 없기 때문에 자유롭거나 너무 쉽게 해킹되거나

- 지금은 보안 된 게 많다

 

 

 

 

출처: https://youtu.be/mP_C2QJEYts?si=deoSnSSSk3x0EfRf