編程隨記 ---- 拼包程序(三)

編程隨記 ---- 拼包程序(三)

    顯然拼包程序主要考慮性能和正確性。顯然正確性應該放在第一位,所以先
保證程序的正確性,再在此基礎上考慮怎樣提高性能。
    根據上面所描述的,基本上就能把拼包程序寫出來了。爲每個socket保留一
個緩存區,顯然每個連接應該有兩個緩存區,一個方向一個。每次收到一個數據
包:
1、判斷是否是現有保存的連接,是轉2;否轉3
2、狀態爲接收數據:察看其標誌位,如果是SYN包,直接丟棄,如果不是,
                   判斷其ACK號是否是當前SEQ+1,是則增加到當前緩存區內;
                   不是直接丟棄,如果標誌位有FIN標誌,則將這個連接終止。
   狀態爲初始狀態:察看其標誌位,如果不是SYN-ACK包,直接丟棄;是將狀態
                   標誌爲SYN_ACK
   狀態爲SYN_ACK: 察看其標誌爲,判斷是否是ACK包,不是,直接丟棄,是則
                   判讀ACK是否是SEQ+1,是則狀態置爲接收數據。
   轉4                                 
3、創建兩個新的連接,一個方向一個,設置爲初始狀態:SYN(用來判斷三次握手)
4、結束。

    現在可以通過上述邏輯過程來編寫代碼。編寫完用windump截獲瀏覽網頁的數據
包,然後用這個拼包程序解析一下,將兩者結果比較一下,就能驗證拼包程序的正
確性。
  
    然後我們再來考慮一下性能方面。顯然其中判斷是否有現有連接部分需要妥善
處理,這是個瓶頸所在。幸好可以採用STL中的map來實現查找過程。將每個連接保
存到map中,以socket爲索引。這樣就可以提高效率。
    顯然內存是有限的,而連接是無限的,所以肯定需要對內存緩存區進行管理,
每次刪除連接,建立連接會將內存緩存區中的空餘位置打亂,不連續。如何快速的
在內存緩存區中找到未用空間是個小技巧。具體參見《編程心得 ---- 內存管理》
一文。
    到了這一步,從MIT網上下載了幾百兆的用tcpdump捕獲的數據包,用來測試自
己寫的拼包程序,一切OK。速度和正確性都能得到保證。可惜自以爲已經解決這個
問題的我還是想的太簡單了。隨後老大的一番教誨使我感到一陣陣寒冷,不過那是
後話了。下次再細說。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章