패킷조립순서
417
작성한 질문수 22
void RegisterRecv()
{
_recvBuffer.Clean();
ArraySegment<byte> segment = _recvBuffer.WriteSegment;
_recvArgs.SetBuffer(segment.Array, segment.Offset, segment.Count);
...
}
불완전한 패킷은 조립가능할때까지 기다렸다가 조립해서 해석하는 것까지는 알겠는데, 어디서 모아놓는지 헷갈려서 복습을 하면서 찾아보았습니다.
위의 RegisterRecv메소드의 _recvArgs.SetBuffer에서 Recv데이터를 모아놓는게 맞나요?
①여기서 처리가능하면 처리후 _recvBuffer.Clean()을 통해 위치를 처음으로 돌려주고 ②처리가 불가능하다면 계속 기다리다가 다음 패킷이 오면 현재의 _readPos, _writePos 기준으로 다음 데이터를 받아서 처리- 맞게 이해했을까요?
그리고 만약에
지금 RecvBuffer의 크기가 1024인데 800짜리 패킷이 400만 도착해서 대기중입니다.
그때 다음 패킷이 잘린 400+새 패킷 800 해서 1200이 들어와 버리면 => 400짜리 패킷(a-1)+400짜리 패킷(a-2)+800짜리 새 패킷(b)이렇게 될텐데,
1024를 넘어 버리게 들어오면 어떻게 되나요? 애초에 이렇게 들어올 수 있을지는 모르겠지만;;(잘린 패킷이 다음패킷에 붙어서 올수가 없나요?)
답변 1
1
①여기서 처리가능하면 처리후 _recvBuffer.Clean()을 통해 위치를 처음으로 돌려주고 ②처리가 불가능하다면 계속 기다리다가 다음 패킷이 오면 현재의 _readPos, _writePos 기준으로 다음 데이터를 받아서 처리- 맞게 이해했을까요?
네 맞습니다!
위 부분입니다.
강의 코드 기준으로 OnRecv 함수가 얼마나 처리했는지를 int로 반환하는데,
그만큼을 딱 컨텐츠 코드에서 처리한 것이라 볼 수 있습니다.
로컬 테스트에선 대부분 딱 보낸만큼을 바로 처리하고
패킷이 분할되어 오는 경우도 거의 없겠지만,
서버에 아주 많은 부하가 걸리고 사람들이 한군데에 모여 있으면
심심찮게 분할되어 오는 패킷이 발생하게 됩니다.
그때 다음 패킷이 잘린 400+새 패킷 800 해서 1200이 들어와 버리면 => 400짜리 패킷(a-1)+400짜리 패킷(a-2)+800짜리 새 패킷(b)이렇게 될텐데,
1024를 넘어 버리게 들어오면 어떻게 되나요? 애초에 이렇게 들어올 수 있을지는 모르겠지만;;(잘린 패킷이 다음패킷에 붙어서 올수가 없나요?)
우리가 유저레벨에서 데이터를 냠냠 뽑아먹기 위해 사용하는 버퍼와
실제로 커널 버퍼에 내용물을 저장하는 버퍼는 별개로 있습니다.
따라서 [400] + [400 + 800] 이렇게 들어오더라도 문제 없습니다.
위 가정에서 유저레벨 버퍼가 1024 한도라면 [400]+[400 + 224] 가 일단
커널레벨->유저레벨로 복사되구요.
그러면 앞단의 완성된 800을 먼저 처리해주고 224의 찌꺼기가 남게 됩니다.
요 찌꺼기는 다음 턴에 나머지 데이터가 오면 마찬가지로 소모될 예정이니 신경쓸 필요 없습니다.
0
답변감사합니다!
커널레벨에 먼저 쌓이고 유저레벨에서 설정한 만큼 꺼내서 처리하는거군요.
그럼 커널레벨의 크기는 얼마인지도 알 수 있나요? 받기만하고 꺼내쓰지않는다면 어떻게 되나요?
0
커널 송수신 버퍼의 크기도 설정하는 함수가 있습니다.
그리고 받기만 하고 꺼내쓰지 않으면, 커널 버퍼가 꽉 차서
상대방이 더 이상 데이터를 보낼 수 없게 됩니다.
TCP 프로토콜 차원에서 상대방의 버퍼 여유 상황을 보고 보내기 때문이죠.
이 부분은 나중에 TCP/IP 이론에 대해 공부하면 알 수 있습니다.
TLS 질문드립니다.
0
57
2
SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.
0
57
2
Unity Span
0
82
2
XML, Dll 차이점
0
111
2
Session 질문입니다
0
84
1
Write Read 커서 키워드
0
79
1
더미 클라이언트 수에 따른 OnDisconnect 발생
0
76
2
네트워크 Send 전담 스레드 배치
0
100
2
UnhandledException 으로 서버 터지는 경우
0
91
2
컨텐츠 단, 엔진 단
0
108
1
질문 있습니다
0
78
2
C# 게임서버 3D MMORPG
0
153
2
유니티6 버전
0
100
2
receive하는 부분과 send하는 부분의 차이
0
135
2
커서의 위치의 중요성
0
105
2
C++ 전혀 모르는데 C# 서버
0
171
2
강의에 질문이 있습니다
0
89
2
멀티스레드 이해도 질문
0
98
1
500 vs 500
0
132
3
OnAcceptHandler 액션 함수
0
64
1
이 정도 서버의 객관적인 수준이 궁금합니다.
0
194
2
36. Serialization #3 에서 string (name) 코드 수정 질문
0
84
2
외부 컴퓨터와의 통신 방법이 궁금합니다
0
107
1
스핀락 질문.
0
111
2





