Cộng đồng Hỏi & Đáp của Inflearn
TCP와 UDP에 대해 더 여쭤볼 부분이 있습니다!
Viết
·
463
1
1. 서버입장에서 TCP 프로토콜로 100byte를 SendAsync()로 전송했을 때, 콜백이 오는 그 시점은 100byte를 모두 클라이언트에게 전송이 완료되었을 때 오는건가요? 100byte를 보내더라도 나뉘어져서 보내진다는 얘기를 해주셔서 여쭤봅니다. SendAsync()를 호출한 이후에 콜백받은 상황이 정확히 어떤 상황인지 여쭤보고 싶습니다. 100byte를 보냈을 때 100byte를 클라이언트가 전부 받았다고 보장되었을 때 콜백이 오는지 알고싶습니다.
2. UDP 프로토콜에서는 해당 부분이 발생하지 않는다고 하셨는데 UDP 프로토콜은 패킷을 보낸 입장에서 상대방의 받는 유무조차 모르기 때문에 시도자체를 통으로 보내는 것이지 받았는지 유무는 전혀모르는거죠?
Câu trả lời 4
4
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
1
1.
네 보내는 쪽에서는 부분적으로 전송되는 것을 신경쓰지 않고 다 보냈다고 가정해도 됩니다.
TCP라고 해서 우리를 골탕먹이려고 막 쪼개서 보내는 것은 아니고
상대방의 수신버퍼가 꽉 차서 일부만 보낼 수 있을 때 그렇게 행동합니다.
따라서 TCP는 데이터의 경계(Boundary)가 없다고 표현을 합니다.
2.
UDP는 프로토콜 자체가 상대방의 상황을 고려해 일부를 보낸다거나 하는 개념이 없습니다.
100바이트를 보냈는데 상대방이 실제로 20바이트만 받을 수 있는 상황이라면,
TCP는 20바이트를 보내겠지만 UDP는 그딴거 없이 100바이트를 다 보냅니다.
받는 쪽에서 못받는 상황이라 하면, 추후 수신자 쪽에서 해당 패킷을 폐기시켜 버립니다.
물론 말씀대로 보내는 쪽에서도 상대방의 수신 여부에 전~혀 신경을 쓰지 않습니다.
0
답변 감사합니다~ 조금 더 여쭤볼 수 있을까요?
1. TCP로 보내는 입장에서 콜백이 왔을 때는 어떤 것까지 보장된 상황인가요? 제 컴퓨터 입장에서만 패킷을 다 보낸상태인가요? 아니면 상대 컴퓨터에게까지 패킷이 전부 도달했다고 보장할 수 있는건가요?
2. TCP 받는 입장에서 갑자기 40byte로 OnRecvCompleted()인 콜백으로 왔는데요
해당 40byte는 전송할 때 40byte를 보냈다고 볼 수 있는 크기가 아니라 100byte를 보냈을 때 40byte를 받을 수도 또는 25byte와 40byte를 보냈을 때 앞 패킷과 뒷패킷이 섞여 40byte를 받았다고도 볼 수 있는건가요? 40byte를 받았다고 했을 때 전송자가 딱 40byte를 보냈다고 볼 수 없는거죠? 패킷의 일부 바이트가 왔을 수도 또는 두 패킷이 섞여서 왔을 수도 있는건가요?
3. TCP관련 책이나 자세히 정리된 사이트 하나만 추천해주실 수 있으신가요? 부탁드립니다!
강의 감사합니다!





