2012-04-05 3 views
0

I 오전병합 데이터/IP 패킷

 <?xml><a></a><?xml><a></a><?xml><a></a><?xml><a></a> 

는 패킷이 다음과 같은 순서로 수신 가정하면, 서버에서 일부 XML 데이터는 말할 수 가정

 <?xml><a> 
    </a><?xml><a></a><?xml> 
    <a></a> 

방법 이런 종류의 데이터를 구문 분석하기위한 논리를 공식화 할 수 있습니까?

답변

2

짧은 대답은 주문에 대해 걱정할 필요가 없다는 것입니다. TCP가 리 어셈블리를 처리합니다.

TCP는 스트리밍 프로토콜이며 각 패킷에는 네트워크 스택이 들어오는 패킷을 올바른 순서로 재구성 할 수 있도록하는 시퀀스 번호가 들어 있습니다. 또한 전송 중에 손실되거나 손상된 패킷을 자동으로 다시 보냅니다. 그러나 한 번에 전체 메시지를 전송하는 UDP와 달리 TCP는 개별 메시지의 프로토콜 수준 개념이없는 연결이 종료 될 때까지 데이터를 계속 전송합니다.

귀하의 질문은 주문에 관한 것이 아니라 모든 데이터를 받았을 때를 아는 것에 관한 것입니다. 그것에 관해서는 일반적으로 두 가지 방법이 있습니다.

먼저 서버는 데이터 전송이 끝나면 연결을 닫을 수 있습니다. 클라이언트는 요청을하고 연결이 닫힐 때까지 응답을 축적 한 다음 수신 한 모든 데이터를 응용 프로그램에 전달합니다.

두 번째로, 응용 프로그램은 각 메시지의 끝을 표시하거나 각 메시지의 시작 부분에 바이트 수를 삽입하여 데이터 자체를 프레임 할 수 있습니다. 수신자는 도착한 바이트 수를 기다리고 응용 프로그램에 전달합니다.

실제로 세 번째 방법이 있지만 오류가 발생하기 쉽고 일반적으로 빈약 한 방법으로 간주됩니다. 클라이언트는 제한 시간이 메시지의 끝을 나타내는 것으로 가정하고 일정 시간 동안 데이터 수신을 중지 할 때까지 기다릴 수 있습니다. 그러나 클라이언트가 시간 초과를 기다리는 동안 불필요한 지연이 발생할 수 있으며 네트워크에 많은 지연이있는 경우 메시지의 끝을 조기에 나타낼 수도 있습니다. 서버가 메시지의 도중에 버려지면 클라이언트가 멈추지 않도록하는 훼일 세이프 (fail-safe)를 고려해야합니다. 그렇지 않으면 다른 방법을 사용할 수 없으면 최후의 수단으로 사용할 수 있습니다. 그러나 간헐적으로 실패 할 수있는 좋은 기회가 있습니다. 그래서 나에게서 그 소식을들은 사람에게 말하지 마십시오. :-)

행운을 빌어 요!