inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

TCP vs UDP

TCP와 UDP에 대해 더 여쭤볼 부분이 있습니다!

488

SIsB

작성한 질문수 19

1

1. 서버입장에서 TCP 프로토콜로 100byte를 SendAsync()로 전송했을 때, 콜백이 오는 그 시점은 100byte를 모두 클라이언트에게 전송이 완료되었을 때 오는건가요? 100byte를 보내더라도 나뉘어져서 보내진다는 얘기를 해주셔서 여쭤봅니다. SendAsync()를 호출한 이후에 콜백받은 상황이 정확히 어떤 상황인지 여쭤보고 싶습니다. 100byte를 보냈을 때 100byte를 클라이언트가 전부 받았다고 보장되었을 때 콜백이 오는지 알고싶습니다.

2. UDP 프로토콜에서는  해당 부분이 발생하지 않는다고 하셨는데 UDP 프로토콜은 패킷을 보낸 입장에서 상대방의 받는 유무조차 모르기 때문에 시도자체를 통으로 보내는 것이지 받았는지 유무는 전혀모르는거죠?

network C# unity

답변 4

4

Rookiss

1. TCP로 보내는 입장에서 콜백이 왔을 때는 어떤 것까지 보장된 상황인가요? 제 컴퓨터 입장에서만 패킷을 다 보낸상태인가요? 아니면 상대 컴퓨터에게까지 패킷이 전부 도달했다고 보장할 수 있는건가요?

send가 완료된 것은 커널의 송신 버퍼로 데이터를 다 복사한 것을 의미합니다.
상대 컴퓨터에 패킷이 전부 도달한 것은 아닙니다.

2. TCP 받는 입장에서 갑자기 40byte로 OnRecvCompleted()인 콜백으로 왔는데요 
해당 40byte는 전송할 때 40byte를 보냈다고 볼 수 있는 크기가 아니라 100byte를 보냈을 때 40byte를 받을 수도 또는 25byte와 40byte를 보냈을 때 앞 패킷과 뒷패킷이 섞여 40byte를 받았다고도 볼 수 있는건가요? 40byte를 받았다고 했을 때 전송자가 딱 40byte를 보냈다고 볼 수 없는거죠? 패킷의 일부 바이트가 왔을 수도 또는 두 패킷이 섞여서 왔을 수도 있는건가요?

네 40byte 받았다고 해도 상대방이 40byte를 보냈다고 가정할 수는 없습니다.
15 15 15 씩 보낸게 합쳐져서 온 것일 수도 있고
그냥 애당초 TCP는 데이터 경계(boundary)의 개념이 없습니다.
다만 보내는 순서는 보장됩니다. a b c 순서로 보냈으면 상대방도 a b c 순서로 받습니다.
(= 설령 a + b 가 섞여서 온다 하더라도, a 다음에 b가 등장하는 순서는 고정)
UDP는 완전 반대로 순서가 보장되진 않지만

40바이트를 보냈으면 상대방도 40바이트를 받습니다. (분실되지 않았을 경우)

3. TCP관련 책이나 자세히 정리된 사이트 하나만 추천해주실 수 있으신가요? 부탁드립니다!

소켓 프로그래밍을 공부할 때 보통 C/C++ 언어 기반의 책밖에 없습니다.
그런데 책도 많이 부실한 편이고
저도 회사 코드를 보면서 많이 공부를 했습니다.
따라서 추천할만큼 좋은 책은 없지만
[TCP/IP 윈도우 소켓 프로그래밍 한빛 아카데미]
[클릭하세요 온라인 게임 네트워크 프로그래밍] 정도가 있을 것 같네요.
사실 대부분의 소켓 프로그래밍 책들이 비슷비슷합니다.

1

SIsB

엄청 빨리 답변해주시는군요! 정말 감사합니다!

1

Rookiss

1.
네 보내는 쪽에서는 부분적으로 전송되는 것을 신경쓰지 않고 다 보냈다고 가정해도 됩니다.
TCP라고 해서 우리를 골탕먹이려고 막 쪼개서 보내는 것은 아니고
상대방의 수신버퍼가 꽉 차서 일부만 보낼 수 있을 때 그렇게 행동합니다.
따라서 TCP는 데이터의 경계(Boundary)가 없다고 표현을 합니다.

2.
UDP는 프로토콜 자체가 상대방의 상황을 고려해 일부를 보낸다거나 하는 개념이 없습니다.
100바이트를 보냈는데 상대방이 실제로 20바이트만 받을 수 있는 상황이라면,
TCP는 20바이트를 보내겠지만 UDP는 그딴거 없이 100바이트를 다 보냅니다.
받는 쪽에서 못받는 상황이라 하면, 추후 수신자 쪽에서 해당 패킷을 폐기시켜 버립니다.
물론 말씀대로 보내는 쪽에서도 상대방의 수신 여부에 전~혀 신경을 쓰지 않습니다.

0

SIsB

답변 감사합니다~ 조금 더 여쭤볼 수 있을까요?

1. TCP로 보내는 입장에서 콜백이 왔을 때는 어떤 것까지 보장된 상황인가요? 제 컴퓨터 입장에서만 패킷을 다 보낸상태인가요? 아니면 상대 컴퓨터에게까지 패킷이 전부 도달했다고 보장할 수 있는건가요?

2. TCP 받는 입장에서 갑자기 40byte로 OnRecvCompleted()인 콜백으로 왔는데요 
해당 40byte는 전송할 때 40byte를 보냈다고 볼 수 있는 크기가 아니라 100byte를 보냈을 때 40byte를 받을 수도 또는 25byte와 40byte를 보냈을 때 앞 패킷과 뒷패킷이 섞여 40byte를 받았다고도 볼 수 있는건가요? 40byte를 받았다고 했을 때 전송자가 딱 40byte를 보냈다고 볼 수 없는거죠? 패킷의 일부 바이트가 왔을 수도 또는 두 패킷이 섞여서 왔을 수도 있는건가요?

3. TCP관련 책이나 자세히 정리된 사이트 하나만 추천해주실 수 있으신가요? 부탁드립니다!

강의 감사합니다!

TLS 질문드립니다.

0

42

2

SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.

0

46

2

Unity Span

0

75

2

XML, Dll 차이점

0

105

2

Session 질문입니다

0

79

1

Write Read 커서 키워드

0

74

1

더미 클라이언트 수에 따른 OnDisconnect 발생

0

70

2

네트워크 Send 전담 스레드 배치

0

98

2

UnhandledException 으로 서버 터지는 경우

0

85

2

컨텐츠 단, 엔진 단

0

104

1

질문 있습니다

0

77

2

C# 게임서버 3D MMORPG

0

144

2

유니티6 버전

0

97

2

receive하는 부분과 send하는 부분의 차이

0

133

2

커서의 위치의 중요성

0

103

2

C++ 전혀 모르는데 C# 서버

0

169

2

강의에 질문이 있습니다

0

86

2

멀티스레드 이해도 질문

0

95

1

500 vs 500

0

128

3

OnAcceptHandler 액션 함수

0

61

1

이 정도 서버의 객관적인 수준이 궁금합니다.

0

188

2

36. Serialization #3 에서 string (name) 코드 수정 질문

0

82

2

외부 컴퓨터와의 통신 방법이 궁금합니다

0

105

1

스핀락 질문.

0

109

2