2009-04-18 4 views
2

순서가 잘못된 패킷을 처리하는 방법을 설명해 줄 수 있습니까? 예를 들어, 내가 패킷을 캡처, 그들이 와서 그들을 분석 원시 소켓을 사용하고 있지만, 그들 중 일부는 잘못된 순서로 제공 :C# : 순서가 잘못된 TCP 패킷을 처리하는 방법은 무엇입니까?

  1. 아이디 ........... 플래그
  2. 16,390 (PSH, ACK)
  3. 16,535 (PSH, ACK)
  4. 16,638 (ACK)
  5. 16,640 (PSH, ACK)
  6. 16,639 (ACK)
  7. 16,695 (PSH, ACK)

ID가있는 패킷 : 16390, 16535, 16695는 별도의 패킷이며 자유롭게 처리 할 수 ​​있습니다. ID가있는 패킷 : 16638, 16640, 16639는 패킷 시퀀스이며 분석하기 전에 오름차순으로 넣어야합니다.

푸시 플래그가있는 패킷을 가끔씩 먼저 만들어서 파서에 전달하면 파서는 패킷을 앞에두고 파서는 손상된 패킷을 그냥 버립니다.

처리 방법이 있습니까?

+1

귀하의 질문에 더 잘 답변 할 수 있도록 귀하의 행동을 정확하게 설명하십시오. –

+0

원시 소켓을 사용하지 마십시오. –

+0

이것은 슬픈 것입니다. 원시 패킷을 처리하는 방법을 말씀 드렸습니다. 허용 된 응답은 8 표를 얻었지만 기본적으로 질문에 대답하지 않은 반면 3 개의 표를 얻었습니다 ... – Unknown

답변

5

TCP는 주문을 보장합니다. 그래서 저는 여러분이 IP에 대해 이야기하고 있다고 가정 할 것입니다.

시도 할 수있는 한 가지 방법은 패킷을 최소 힙에 넣은 다음 원하는 다음 패킷 ID 번호를 사용할 수있을 때까지 기다리는 것입니다.

푸시 패킷의 경우 주문에 대한 제한없이 가능한 한 빨리 수신되도록되어 있으므로 이전 푸시 패킷을 받을지 기다리는 시간을 결정해야합니다 .

11

TCP 세그먼트는 이전 ACK에 응답 할 때까지 다음 세그먼트가 전송되지 않기 때문에 순서가 잘못되지 않습니다.

TCP 번호가 순서가 도착할 경우 TCP 엔티티 그들을 재정렬 할 수 있도록이 특정한 목적지 포트 순차적 를 전송 세그먼트.

이것은 TCP 아래의 전송 계층에서 발생하기 때문에 모든 TCP 연결에서 이러한 일이 발생하지 않습니다. TCP의 관점에서 그들은 항상 순서에 있습니다. 따라서 순서가 맞지 않으면 TCP 전송 계층에서 작업하지 않습니다. 낮은 수준입니다. 또한

는 FYI ...

  • TCP 데이터는 "세그먼트"
  • IP 데이터는 "데이터 그램"
  • 네트워크 레벨은 "패킷"

이다는 것이다 편집 : 제공 한 링크는 IP 데이터 그램 스트림을 제공하므로 사용자가 직접 TCP 스트림을 처리해야합니다. 나는 쉽지 않은 척하고 여기서 설명하려고 노력할 것입니다.

+1

난 그냥 원시 소켓을 사용하여 클라이언트와 서버 사이의 패킷을 냄새, 그래서 아무것도 ACK를하지 않습니다. 처음에 사용 된 코드는 다음과 같습니다. http://www.codeproject.com/KB/IP/CSNetworkSniffer.aspx 용어를 엉망으로해서 죄송합니다. –

4

정상적인 tcp 소켓을 사용하지 않는 이유는 무엇입니까?

+1

그는 패킷을 스니핑하고 있습니다. 즉, 중간에 서버와 클라이언트가 아니기 때문에 대화를 듣고 있으며 원시 소켓에서만 가능합니다. –

1

순서 번호가 순서를 표시합니다. 그것은 4G에서 랩핑되므로 당신은 그것을 설명해야합니다. 그리고 TCP가 사용하는 것과 동일한 기본 루틴을 사용해야합니다. 순서가 잘못된 패킷을 버퍼링하고 중복 된 패킷을 버립니다. 시퀀스 번호 + 페이로드의 Len은 nexxt 시퀀스 번호입니다.

TCP/IP Illistrated vol 2 또는 TCP.c?

관련 문제