回覆列表
  • 1 # 使用者5120111836029

    tcpdump是透過libpcap來抓取報文的,libpcap在不同平臺有不同的實現,下面僅以Linux平臺來作說明。首先Linux平臺在使用者態獲取報文的Mac地址等鏈路層資訊並不是什麼特殊的事情,透過AF_PACK套接字就可以實現,而tcpdump或libpcap也正是用這種方式抓取報文的(可以strace tcpdump的系統呼叫來驗證)。關於AF_PACK的細節,可檢視man 7 packet。其次,上面已經提到tcpdumap使用的是AF_PACK套接字,不是Netfilter。使用Netfilter至少有2點不合理的地方:

    1. 資料包進入Netfilter時其實已經在協議棧做過一些處理了,資料包可能已經發生一些改變了。比較明顯的一個例子,進入Netfilter前需要重組分片,所以Netfilter中無法抓取到原始的報文分片。而在傳送方向,報文離開Netfilter時也未完全結束協議棧的處理,所以抓取到的報文也會有不完整的可能。

    2. 在Netfilter抓取的報文,向用戶態遞送時也會較為複雜。Netfilter的程式碼處在中斷上下文和程序上下文兩種執行環境,無法使用傳統系統呼叫,簡單的做法就是使用Netlink。而這還不如直接用AF_PACKET抓取報文來得簡單(對核心和使用者態程式都是如此)。

  • 中秋節和大豐收的關聯?
  • 沙漏是誰在什麼時候發明的?