클라와 서버가 서로 통신을 하기 위해서는 패킷을 주고 받아야 한다.
패킷 : 클라와 합의 된 규약
예를 들어 이동 패킷을 보낸다고 가정 : (3,2) 좌표로 이동하고 싶다.
받은 패킷 데이터 : 15 3 2
*패킷 번호 : 15 ⇒ 이동 명령
*좌표 : 3 2
⇒ 패킷 데이터를 해석하면 15번 패킷이니깐 이동을 하고 싶다는 것을 파악
⇒ 다음 패킷 내용을 까보면 좌표가 있을 것을 알고 해당 좌표로 이동하도록 클라에 발송
앞으로는 클라와 서버가 서로 규약한 프로토콜 대로 데이터를 주고 받고 분석을 해야 한다.
서버에 "15 3 2"을 보냈는 데 "15 3"만 오게 되면 실행하면 x
간단하게 문자열을 보낼 때는 상관 없지만 패킷 설계를 하고
TCP 프로토콜로 100바이트를 보낸다면 받는 서버에서 반드시 100바이트의 데이터를 받는다는 보장이 없다. TCP는 경우에 따라서 너무 혼잡이 일어나서 보내기 부담이 되는 상황이라면 서버에서 100바이트를 Send한다 할지라도 일부분만 먼저 보내고 후에 남은 데이터를 보내는 작업을 할 수도 있다.
TCP로 MMO로 만들어야할 때 TCP에 대한 기본 개념이 있어야 앞으로 진행을 할 수 있다.
택배를 보낼 때는 상품 → 배송정책 → 최종 주소 → 단지 경로 → 택배 운송 순서대로 가지만
택배를 받을 때는 택배 운송 → 단지 경로 → 최종 주소 → 배송 정책 → 상품 순으로 까보게 된다.
배송 정책에 따라 반송을 해야할지 여부를 판단하고 상품 단계로 가서 데이터를 까보게 된다.
TCP는 배송 정책에 해당 한다.
트랜스 포트 == 배송 정책 (5단계 레이어에서 4단계)
면접 당골 질문
그냥 외우기 보다 위 그림으로 기억해보자
TCP
: 전화가 연결될 때까지 대기해서 연결 후 대화를 진행하는 것
: 실제 물리적으로 연결되는 것은 아니지만 연결을 위해 할당되는 논리적은 경로가 있다.
: 전송 순서가 보장이 된다
→ 즉, "안녕하세요", "아무개 입니다"라고 수화기에 말을 했을 때 듣는 사람도 "안녕하세요", "아무개입니다"라는 메시지를 순서대로 들을 수 있게 된다.
UDP
: 우편은 연결이라는 개념이 없이 그냥 보내면 받는 느낌
: 전송 순서가 보장되지 않는다.
→ 즉, 첫 번째 편지는 "안녕하세요", 두 번째 편지는 "아무개 입니다"라고 보냈을 때 순서대로 편지를 수령한다는 보장이 없다.
TCP
: 분실에 대한 책임 o
: 흐름/혼잡 제어 해줌
: 속도가 느림
UDP
: 분실에 대한 책임 x
: 퀵으로 보낸 다음에 생각해봄
: 단순하기 때문에 속도가 빠름
결론
TCP의 핵심은 물건을 주고 받을 상황이 아니라면 일부만 보내는 혼잡제어가 가장 큰 핵심이다.
주의 깊게 봐야할 부분
파란색으로 표시된 부분이 게임 만들 때 가장 큰 핵심이다.
TCP로 작업하면 UDP보다 메리트가 크다.
패킷의 순서가 뒤죽박으로 보내졌다면 순서를 맞추는 작업을 하기도 까다롭고
패킷이 다 도착하지 않았다면 대기하는 작업도 해줘야 한다.
그리고 분실이 일어나면 TCP 레이어에서 책임을 지고 다시 전송을 해주니깐
TCP로 무엇인가를 보냈다고 가정하면 무조건 도착을 했다고 가정하고 코딩을 할 수 있게 된다.
물건을 주고 받을 상황이 아닐 때 일부만 보내준다.
TCP에서 데이터를 전달해주려고 할 때 상대방이 일부만 받을 수 있는 상황이라고 응답을 했을 때
받을 수 있는 만큼만 보내주게 된다.
장점 : 못 받는 상황에서 패킷을 쏴대지 않는다.
단점 : 패킷이 완전체로 가는 것이 아니라 뚝뚝 끊겨서 간다는 것이 굉장히 까다롭다.
결국 TCP를 통해 패킷을 받았다고 가정을 한다면 일단 완전한 패킷을 받았다고 가정한 다음에 조립을 해서 사용을 해야 한다.
UDP의 경우 애당초 끊어서 보내지 않기 때문에 완전체로 받게 된다.
경계선이 있냐?
UDP의 경우 우편물이니깐 통째로 보내지거나 유실되거나 할 것이다. ⇒ 경계선 o
TCP의 경우 연결이 된다는 가정하에 보내는 데 중간이 데이터가 끊기더라도 결국 모든 데이터를 보내기 때문에 경계선 x
부연 설명
TCP의 경우 속도가 느리기는 하지만 UDP의 경우보다 느릴 뿐이지 절망적으로 느리지는 않다.
별도의 작업 없이 프로토콜 단에서 작업을 해주는 거니깐 이 정도 속도 감소는 감안을 하는 것이 좋다.
만약에 속도 위주로 간다고 해도 쌩으로 UDP를 쓰는 것이 아니라 TCP와 비슷하게 데이터가 분실될 때 재전송을 하거나 추가 작업과 순서를 보장하게끔 작업이 필요하다 ⇒ Reliable UDP (RUDP)
고려를 할 수 있지만 기술적으로 다소 어렵다.
또 UDP는 분실이 되어도 상관이 없는 경우에 사용하면 좋다.
예를 들어 FPS 게임에서 가장 중요한 것은 latency( == 패킷을 한 지점에서 다른 지점으로 보내는데 소요되는 시간)이다.
즉 빠르게 응답이 와야 부드럽게 느끼게 될텐데 이동을 하는 하는 부분을 계속 체크를 해야하는지는 의문이 있다.
왜냐하면 어떤 패킷이 손실이 되었다고 하더라도 다음에 받은 패킷으로 이동좌표를 갱신한다고 하면 중간에 한 두개가 분실이 되었다고 해서 크게 영향이 없다.
그래서 FPS 게임에서는 주로 UDP를 사용하게 된다.(cf. 언리얼 데디케이트 서버도 UDP를 사용)
UDP의 또 다른 장점은 연결이라는 개념이 없다는 것이다.
지하철 같은 곳에서 통신이 불안하니깐 끊기기도 하는 데
TCP에서는 난리가 나는 상황 → 재연결을 하기 전까지 애당초 통신을 못함
UDP의 경우 애초에 연결이라는 개념이 없으니깐 그런 상황에서는 좀더 편리하게 작업을 할 수 있다.
모바일 환경에서는 UDP도 나쁘지 않은 선택이지만 TCP를 또 아예 선택을 안할 수는 없다.
MMO의 경우 TCP를 더 많이 선호 ⇒ 안정성 문제 때문에