程式設計隨記 拼包程式(二)

2021-04-01 17:15:44 字數 1378 閱讀 2822

程式設計隨記 ---- 拼包程式(二)

找來了richard stevens的經典著作《tcp/ip祥解 卷1:協議》仔細的

翻閱tcp和ip協議部分。從而發現截獲到的資料報前面包含若干頭:

wpcap header + ethernet header + ip header + tcp header + data

前面已經分析了wpcap的頭部。由於只需要分析tcp資料報,所以乙太網包

頭部只需解析一下型別字段,看是不是後面封裝的ip包(型別字段是不是

0800)。然後分析一下ip頭,找到源和目的ip位址。再檢視8位協議字段,

看ip包封裝的是否是tcp包,當協議欄位的值為6時,為tcp包。再相應解析

tcp頭,解析出源和目的ip的埠號,並需要儲存seq,ack,flag,已備後

面分析三次握手協議和斷開連線時作準備。

上述過程很簡單,看了具體的協議內容就可以實現。但是接下來分析

tcp連線過程時則相應比較麻煩些。tcp建立連線過程必須滿足三次握手協

議:1、源端傳送乙個syn:seq1的tcp包;

2、目的端收到上面的包後,返回乙個syn:seq2:ack2的tcp包,其中ack2

值為seq1+1;

3、源端收到目的端的tcp包後,再傳送乙個ack1的tcp包,其中ack1的

值為seq2+1。

這樣,經過三個tcp包才能正常建立乙個tcp連線。而且這個連線是雙向的,

所以需要對每個方向分別儲存資料。顯然可以使用srcip + desip + srcport

+ desport來唯一標示乙個半連線。用socket來簡記。

而對於每個socket必須標記該狀態,記錄達到那個步驟。

因此,當發現乙個syn的tcp包時,需要檢視以前有沒有該socket,有則

看該socket的狀態,從而來判斷上述協議。

同樣,斷開連線也需要兩個階段:

1、源端傳送乙個fin:seq1的tcp包;

2、目的端傳送乙個ack2的tcp包,其中ack2=seq1+1;

注意,這個階段只是斷開乙個方向的連線。如果另外乙個方向需要斷開連線

同樣需要上述階段。

這樣,乙個拼包程式的整體框架就有了。下面需要解決的只是細節和性

能問題。

附:(一些頭定義)

/* ethernet header */

typedef struct sniff_ethernet tethernethead;

/* ipv4 header */

typedef struct ip_headerip_header;

typedef struct udp_headerudp_header;

typedef struct tcphdr tcp_header;

程式設計隨記 拼包程式(一)

程式設計隨記 拼包程式 一 六月中旬的某一天,老大的一封郵件把我招進了實驗室,開始研究和專案為主的 實驗室生活。剛進去,彼此互不熟悉。老大就讓我編寫乙個拼包程式,以此來瞧瞧我的程式設計能 力。給我講了功能之後,還給了我乙個工程框架。讓我以此作為基礎和環境來coding。為了給我一些壓力,老大還給了乙...

C語言隨記(二) 結構化程式設計

if 條件a 如果表示式a的值為真,則執行語句a,如果為假,則不執行。if 條件a else如果條件a的值為真,則執行語句a,如果為假,則執行語句b。if 條件a else if 條件b else 如果條件a的值為真,則執行語句a,如果為假且條件b為真,則執行語句b,否則執行語句c。tip 在三種i...

c 隨記二(黑馬程式設計師學習筆記)(繼承篇)

25 繼承語法 class 子類 派生類 public 繼承方式 父類 基類 繼承方式有公共繼承 保護繼承 私有繼承三種。26 父類中所有非靜態的成員屬性都會被繼承下去,父類中私有的成員屬性是被編譯器隱藏了雖然訪問不到但是會繼承下去。可以用開發人員命令提示工具檢視物件模型,先跳轉到具體路徑下,cl ...