1. 程式人生 > 其它 >協議分析之原始套接字

協議分析之原始套接字

sniffer 實現

稍稍回顧

前幾天瞭解到流量的實現實際上還是通過通用的協議棧進行解析,將資料包傳送接收後,計算機進行了按規定的解析。如Tcp/ip協議棧,就是在將資料頭一步步的解開,最後解析到資料再發送到應用層。其原理實際上和pe檔案解析類似。

前幾天雖然瞭解了原理,也使用了原始套接字進行了資料的接收和攔截,但是,並沒有對資料包進行解析,只是使用了監聽資料包。

在定義了結構體後,確實把資料的內容按正確的格式輸出出來了,但是還有一點感覺不踏實。

raw socket介紹及核心處理

raw socket

工作在網路層或資料鏈路。當網絡卡處於混雜模式下,可以接收所有經過網絡卡的資料,包括廣播的資料包和發向自己的資料包。

核心接收後的處理

  • 工作在網路層上的raw socket不使用udp和tcp協議,所以系統接收到tcp和udp協議的資料包不會發送到工作在網路層上的raw socket。

  • 工作在網路層上的raw socket經常使用ICMP等協議,所以如果系統受到ICMP和EGP等使用IP資料包承載資料又在傳輸層之下的協議型別的資料包,系統會將這些包複製一份傳送給對應協議型別的raw socket 進行處理(即沒有使用bind和connect繫結解析則會用raw socket協議解析所有包)

  • 如果工作在網路層上的raw socket使用bind 綁定了,那系統只將受到目的地址位bind所繫結地址的ICMP等傳輸層之下的協議的資料包傳送給raw socket處理

  • 如果工作在網路層上的raw socket使用connect函式遠端連線到其他機器地址,那麼系統只將該地址和協議為ICMP等傳輸層之下的協議的資料包傳送給raw socket處理

  • 對於不能識別協議型別的資料包,系統會進行必要的校驗,然後檢查有沒有匹配協議型別的raw socket,如果有的話,就複製一份給raw socket,如果沒有就丟棄,並返回一個主機不可達的ICMP給源主機

raw socket建立和使用

int mSocket = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);//網路層使用的原始套接字
int mSocket2 = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP));//鏈路層