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

SIsB님의 프로필 이미지
SIsB

작성한 질문수

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

TCP vs UDP

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

작성

·

352

1

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

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

답변 4

4

Rookiss님의 프로필 이미지
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님의 프로필 이미지
SIsB
질문자

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

1

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

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

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

0

SIsB님의 프로필 이미지
SIsB
질문자

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

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

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

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

강의 감사합니다!

SIsB님의 프로필 이미지
SIsB

작성한 질문수

질문하기