작성
·
804
0
안녕하세요..? 예전에 수강했던 학생인데 다시 돌려보고 있는 중입니다 ㅎㅎ..
바로 질문 들어가겠습니다.
패킷을 작성할 때 패킷 헤더라는 것에 공통적으로 패킷 id와 패킷 size를 넣는데, 패킷 id의 존재이유는 확실하게 알겠습니다. 그런데 패킷 size는 왜 필요한지 잘 모르겠습니다.
패킷 size라는 것이 네트워크상 데이터를 전송하기위해 필요한 파라미터라기 보다는 어느 정도의 데이터가 주고 받아졌다를 확인하는 용인지.. 아니면 보안상의 어떤 문제를 해결하기 위해 집어넣는 것인지 모르겠어요 ㅠ
리스트 같은 경우에는 개수 같은게 중요하니 데이터를 입력하기 전에 미리 데이터 사이즈를 집어넣는 것은 이해가 가지만.. 패킷 전체의 사이즈를 미리 알아야 하는 이유가 있나요..?
답변 4
3
PacketSession 코드를 복습해보시기 바랍니다.
실제로 온 패킷이 packetSize보다 작으면
RecvPacket에 있는 내용을 당장 처리하지 않고
다음 네트워크 패킷이 도착해서 조립할 수 있을때까지 기다립니다.
모든 내용이 다 채워진 다음에 size를 기입하는 것이고,
실제 패킷 자동화 코드에서 ushort size를 관리하며 추적하는 것도 그런 이유입니다.
3
TCP는 프로토콜 특성상 네트워크 패킷이 끊어져서 올 수 있는데,
패킷 사이즈를 모르면 어떤 패킷이 통으로 다 도착했는지 구분할 방법이 없기 때문입니다.
패킷 ID를 이용하면 되지 않을까? 라고 생각하실 수도 있겠지만
패킷 ID는 패킷의 포맷을 결정할 뿐,
만약에 해당 패킷에도 List나 string같은 가변 길이 데이터가 있다면
패킷 헤더를 파싱하는 순간에 패킷이 완전체로 왔는지 알 수 없습니다.
따라서 보안상 이유가 아니라 정!말! 순전히 패킷 파싱을 위해서 넣어주는 것입니다.
다만 악의적인 해커가 고의적으로 패킷 사이즈를 조작할 수 있기 때문에,
크로스 체크는 필수적으로 들어가야 합니다.
0
0
설날임에도 불구하고 빠른 답변 감사합니다 ㅠㅠ. 죄송합니다만.. 몇 가지 질문을 더 드리겠습니다.
첫 번째는, 패킷이 완전체가 아닌 경우로 왔을 경우는 어떤식으로 처리하나요..? 답변을 토대로 생각을 조금 해봤는데 완전체로 오지 않는 경우 판별 방법이 헤더의 사이즈 값을 통해 컨텐츠의 크기와 일치한지 비교를 통해서 판별할 것이라고 생각하는데.. 전부 오지 않는 경우에 처리 방법이 생각나지 않습니다 .. 아니면, 제가 완전히 잘못생각하고 있는 것일 수도 있겠네요 ㅠ
두 번째는, 패킷의 크기를 결정하는 순간은 모든 컨텐츠 기입이 끝났을 때라고 생각합니다. 그런데, 위의 질문과 같이 패킷의 실제 크기와 실제 전달 받은 크기 비교를 우선적으로 해야 할 것 같은데.. 직렬화 과정에서 사이즈가 기입되는 순간이 언제인지 모르겠습니다.. 처음에 넣자니 컨텐츠 크기를 모르고.. 나중에 넣자니 수신하는 쪽에서 가장 먼저 사이즈를 알아야할 것 같아 제 생각으로는 모순이 발생하네요 ㅠ