2012-10-24 55 views
11

我正在看看使用PF_RING在我的應用程序中發送和接收。TCP和PF_RING

如果我打算使用PF_RING來維護TCP連接,看起來我需要自己手動「僞造」IP和TCP消息,因爲pfring_send發送原始數據包。這是否意味着我必須在PF_RING之上手動重新實現TCP?

我明白接收使用PF_RING有明顯優勢,有沒有人試過用PF_RING發送數據?與普通發送呼叫相比,是否有明顯的優勢?

注意:我沒有使用DNA(直接網卡訪問),我只是使用帶有NIC識別驅動程序的內核部分旁路。

回答

11

要回答你的第一個問題,是的,你將不得不從頭開始建立TCP/IP消息,MAC地址和全部。例如,請從ntop.org查看pfsend.c

ntop.org也提供了一個PF_RING user guide包含解釋。

至於使用PF_RING發送數據,這是絕對有可能的,這個想法是繞過網絡上實際數據的任何和所有概念,並儘可能快地發送,參見ntop.org的wire speed traffic generation。與使用TCP/IP內核的普通發送調用相比,它唯一的優點是可以發送數據1.速度更快,並且2.完全未格式化到線路上。 2可以很方便,例如,當您想要將先前捕獲的數據包/多個數據包播放到網絡中時。


除非你有一個需要你拿不干預內核訪問原始基礎數據是絕對沒有好理由以任何方式使用PF_RING具體的使用情況。你最好的選擇是使用可用的標準socket(),在大多數情況下,你可以達到的性能綽綽有餘。

你有什麼具體的用例?

+0

性能優勢與普通套接字發送相比如何?我正在尋找消除正常套接字發送中的不一致性。通常我會看到平均需要0-> 1 usec,但是有很大的異常值(由於內核活動),有時會導致高達100個usecs。我正試圖消除這個系統調用。 – Alex

+0

您正在用戶空間中重新實現TCP/IP協議棧,幾乎沒有任何情況會比內置內置協議更快或更高效,特別是在傳輸失敗時重新發送數據包,或照顧所有的邊緣情況。你想優化什麼特定的用例?什麼是最終目標? –

+0

最終目標是減少發送性能中的異常值。我的應用程序在發送的性質上是「突發的」(可能會連續發送一串,然後等待一會再發送 - 一會兒意味着1ms +)。你可能在問我的應用程序做什麼,恐怕我不能說。 – Alex