인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

pnj991122님의 프로필 이미지

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Tcp 프로토콜 관련해서 질문드립니다.

작성

·

71

0

안녕하세요 수업을 N회독하면서 이해한 부분이 맞는지, 또 질문이 있어 글을 남깁니다.

1. TCP프로토콜 : TCP는 내부적으로 패킷이 잘 도착했는지, 순서있게 왔는지 확인하면서

필요하면 재전송을 한다고 알고있습니다. 가령, 클라이언트에서 이동패킷, 공격패킷 등등을

모아서 한번에 SendAsync를 하게될텐데 이 크기가 100의 크기라고 하면 TCP는 연결된

ip주소와 port번호를 통해 보내게 될텐데, 이 과정에서 내부적으로 최적의 상태로 쪼개서

100을 ( 20, 30, 50 )이렇게 쪼개서 보내게 된다면, 또한 보낼때도 한 경로로만 보내는 것도

아니니 받는입장 즉 서버의 커널단에서 패킷을 받게될텐다. 30 20 50 순서로도 올수있고

50 30 20 으로도 올수 있다고 알고있습니다. 또한 하나가 유실되어서 20, 30만 도착할 수도

있고요

그런데 수업중에 PacketSession에서 OnRecv를 오버라이딩 할 때 패킷이 100%다 온다는 보장이

없다. 그래서 헤더를 까보고 이 패킷이 전체가 다 왔는지 확인하는 작업이 있었습니다.

여기서 의문점이 생겼는데. TCP는 내부적으로 20, 30만 도착하면 대기하고 50이 오지않았다고 재전송

해달라는 요청을할거고 최종적으로 50까지 도착하게되면 서버쪽에 OnReciveCompleted함수를

호출하고 그 정보를 넘겨줄텐데. 그러면 지금 개발하고있는 서버입장에서는 100% 완전히

왔다고 판단 할 수 있는게 아닌지 너무 헷갈립니다.ㅠ 또한 위 내용이 제가 제대로 이해했는지도 궁금합니다!

답변 2

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

TCP 관련 잘못 이해하신 부분이 있는데
20, 30, 50 순서로 보내면 받는 쪽에서도 20, 30, 50 순서로 받게 됩니다. (순서 보장 됨)
그리고 유실된 패킷은 TCP 프로토콜에 의해 재전송 되어,
사실상 유실되는 것은 없다고 가정하셔도 됩니다.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. pnj991122님.

TCP 프로토콜의 동작 방식에 대해 재미있는 질문을 주셨네요! TCP의 특성과 데이터 핸들링에 대해서 조금 더 깊이 파고들어 보겠습니다.

TCP는 신뢰할 수 있는 전송 프로토콜로, 데이터가 목적지에 올바르게 도달했는지를 보장하기 위해 다양한 메커니즘을 사용합니다. 데이터를 여러 조각으로 분할해 전송한 후, 수신자는 받은 데이터를 다시 합쳐야 합니다. 또한, 데이터가 손실되거나 순서가 뒤바뀌어 도착할 경우, TCP는 이를 감지하고 문제를 해결하기 위해 재전송을 요청합니다. 이러한 기능 덕분에 TCP는 스트림 기반의 안정적인 연결을 제공합니다.

그렇지만, TCP가 데이터를 완전하게 전송한다고 해도, 애플리케이션 레벨에서는 데이터가 한 번에 도착하지 않을 수 있습니다. 이는 TCP의 전송 특성과 상관없이 네트워크 상황, 버퍼의 크기 등 여러 요인에 의한 것입니다. 이러한 이유로, 서버 애플리케이션은 Recv 호출 시 수신한 데이터가 온전한지 확인해야 하고, 이를 위해 헤더를 검사하고 필요한 경우 남은 데이터를 기다려야 합니다.

아래에 관련된 질문과 기존의 답변들 링크 추가합니다. 해당 질문과 답변들을 확인하면 TCP의 동작 방식과 데이터 수신 과정에서의 세부적인 내용을 더 잘 이해하실 수 있을 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.