2009-04-24 5 views
2

현재 IP를 통해 텔레콤 응용 프로그램을 테스트하고 있습니다. Raw Socket을 열고 원격 측에서 메시지를받습니다 (msgrate @ 750 + msgs/IP를 제외한 약 180 바이트의 두 번째 크기).원시 소켓 수신 버퍼

Raw 소켓 위에 SCTP (TCP처럼)라는 레이어가 있으며,이 레이어는 모든 패킷을 잃어 버렸음을 나타냅니다. 이제 우리는 수신 노드에서 Wireshark를 실행 중이며 Wireshark에서 해당 패킷을 볼 수 있습니다.

소켓의 수신 버퍼가 작아서 IP (?)가 메시지를 삭제하게됩니다. 그러나 IP Pegs (netstat -sv)는 삭제 된 패킷이 없음을 보여줍니다. 성공적으로 소켓 수신 대기열을 40000으로 설정하려고했습니다.

IP 레이어를 구성해야하는 경우 어떤 옵션이 있는지, 또는 설정해야하는 특정 소켓 옵션이 있는지에 관해서는 필자가 어떤 조언을 주시면 감사하겠습니다.

답변

2

입력 해 주셔서 감사합니다. 그러나 우리는이 문제를 "해결할"수있었습니다. 앞에서 필자는 메시지를 읽는 방법을 설명했다. select가 돌아 오면 우리는 루프를 실행합니다 (이 경우 우리는 1보다 큰 원시 메시지 튜닝을 읽습니다). 1) ioctl (FIONREAD)를 호출하여 읽을 바이트 수를 찾습니다. 2)에 recvfrom (3)을 호출하여 많은 바이트) (점 4 IOCTL에서, 사용자 4)

그러나 단계를 반복 한 후 다시 루프로 가서 IOCTL 호출 (FIONREAD)를하고 개까지 FIONREAD를 바이트를 보내 읽기) 0을 반환하는 데 사용합니다. 우리 코드에는 방어 검사가있었습니다. 예상했던대로 ioctl (FIONREAD)의 0 바이트는 보낸 사람이 페이로드가 0 인 IP 헤더를 보내는 것을 의미합니다. 따라서 recvfrom (bytes to read = 0)을 호출하여 선택 항목이 다시 설정되지 않도록 IP 헤더를 플러시합니다.

시간이 t0 일 때 ioctl (FIONREAD)은 읽을 바이트 수를 0으로 반환합니다. 시간 t1에서 recvfrom (읽는 바이트 = 0)이 호출됩니다. 때로는 t0에서 t1 사이에 소켓 수신 큐에 대기중인 실제 데이터를 사용하고 recvFrom (bytes = 0)을 호출 할 때 폐기되도록 사용합니다.

설정하면 rawMsgsToRead = 1의 수가이 문제를 "해결했습니다". 그러나 내 생각에 그것은 우리의 성과에 영향을 미칠 것입니다.대기열의 옥텟과 페이로드가 0 인 IP 헤더를 구별 할 수있는 ioctl 호출은 무엇입니까

+0

문제가 해결되었습니다. 큐에있는 옥텟을 0으로 구분하고 페이로드 0으로 IP 헤더를 구별하는 것에 대해 추가 한 질문과 관련하여 새로운 질문을 만들어야합니다. 실제로 –

+0

을 분석 한 후 실제로 ioctl (FIONREAD)을 호출하면 대기중인 바이트 수는 너무 많은 시스템 호출입니다. 버퍼 크기를 우리가 기대하는 최대 값으로 설정하여 recv (UDP/Raw 패킷의 경우)를 수행하도록 코드를 변경했습니다. 그렇게함으로써 페이로드 0 시나리오의 IP 헤더에 대해 더 이상 걱정할 필요가 없습니다. 그래도 도와 ​​줘서 고마워. 그것은 올바른 방향으로 생각하고 있어요. –

1

몇 가지 질문을하고 몇 가지 사항을 생각해보십시오. 1) 어떤 OS에서 어떤 SCTP를 사용하고 있습니까? 일부 SCTP 구현은 다른 것보다 강력합니다. 2) SCTP는 삭제 된 패킷을 부정 적으로 확인합니까? wireshark에서 갭을 찾으십시오. 3) wireshark에서 삭제 된 패킷이 어디서 재전송이 아닌지 확인할 수 있습니까? 4) 시스템에서 wireshark 모니터링은 어디에 있습니까? 응용 프로그램과 동일한 회선에 있지 않은 경우 응용 프로그램에서 볼 수없는 메시지가 표시 될 수 있습니다. 5) SCTP에서 제공하는 표시는 정확히 무엇입니까?

IP 소켓 rx 버퍼가 오버플로된다고 생각되면 SCTP RX 창의 크기를 줄이는 것이 좋습니다. 이것은 종종 sctp 스택에서 구성 가능합니다. Rx 창은 확인 대기중인 데이터 양을 제한하여 결과적으로 IP 버퍼에있을 수있는 데이터의 양을 제한합니다. SCTP 작업의 우선 순위를 높여서 IP 버퍼에서 메시지를 더 빠르게 읽도록 할 수도 있습니다. (시도하는 것이 가장 쉬운 방법 일 수 있으며 좋은 방법입니다).

감사합니다.

+0

기본적으로 스택 공급 업체이므로 SCTP 구현은 우리 자신의 것입니다. OS는 Linux입니다. 예, wireshark는 Gap Ack 블록에서 패킷을 언급합니다. 수신 노드에서 실행중인 Wireshark는 패킷을 표시하지만 결코 SCTP에 도달하지 않습니다. 우리는 SCTP 계층 아래에 ​​소켓 래퍼를 가지고있다. SCTP에서는 수신 된 TSN을 출력하고 Wrapper에서는 IP 헤더의 Identification 필드를 인쇄했습니다. 나는 분명히 IP 패킷이 Wrapper를 타격하지 않는 것을 볼 수있다 (따라서 SCTP에서는 그렇지 않다). –

+0

IP에서 각각 txqueuelen 및 receviequeue len을 10000으로 늘 렸습니다. setsockopt를 40000으로 호출하여 소켓 수신 버퍼를 늘리려고 시도했습니다. IP 페그는 떨어 뜨린 메시지를 표시하지 않습니다. 어떤 아이디어라도 감사 할 것입니다. –

+0

어떤 회사에서 일하십니까? SCTP 작업의 우선 순위를 높이고 SCTP rx 창의 크기를 줄이려는 시도가 있습니까? 손실 된 청크가 별도의 sctp 메시지로 전송되었거나 번들로 제공됩니까? 문제가 고 부하에서만 발생합니까? 분실 한 메시지가 IP 래퍼를 치지 않는다는 것을 어떻게 알 수 있습니까? 감사합니다. –