二、IP頭結構 我們知道,TCP/IP網絡數據全部是通過封裝在IP數據包中在Internet網上傳送的,也就是封裝建立起一個包含IP頭和數據的IP數據報。一般來說,網絡軟件總是以多個32位字產生IP頭,即使必須用附加的0填充IP頭。IP頭包含了傳輸IP數據包中封裝數據的所有必要信息。IP頭的數據結構和描述如下:
成員
長度(Bit)
描述
Version
4
IP頭的版本號,目前是IPv4,最新是IPv6
Header Length
4
IP頭的長度,若沒有特殊選擇,IP頭總是20字節長
Type of Service
8
服務類型,定義了數據傳輸的優先級、延遲、吞吐量和可靠性等特性
Total Packet Length
16
IP包的長度,若沒有特殊選項,一般為20字節長
Identification
16
IP包標識,主機使用它唯一確定每個發送的數據報
Flag
3
IP數據分割標志
Fragment Offset
13
IP數據分割偏移
Time to Live
8
數據報在網絡上的存活時間,每通過一個路由器,該數值減一
Protocol
8
TCP/IP協議類型,比如:ICMP為1,IGMP為2,TCP為6,UDP為17等
Header Checksum
16
頭部檢驗和
Source IP Address
32
源IP地址
Destination IP Address
32
目的IP地址
Other
?
其他選項
Data
?
數據
實現自己定義的IP頭是一件非常有意義的事情,比如,通過改變IP頭裡的TOS的優先級和TTL,你可以使自己的數據包有更強的傳輸能力和壽命,通過修改IP頭裡的源IP地址就可以隱藏自己機器的IP地址等等。象著名攻擊程序“淚滴TearDrop”就是通過故意制造系統不能處理的分片IP包而實現的,還有SYN Flooder和UDP Flooder就是通過產生隨機源IP實現欺騙的。
三、實現原理
一般來說,自定義IP頭是通過使用socket的庫函數setsockopt()的選項IP_HDRINCL來實現的,盡管這在unix和Linux平台上很容易實現,但遺憾的是在Windows平台的Winsock1.1和Winsock2.0函數庫裡setsockopt()不支持IP_HDRINCL選項,所以在Windows 9x/NT裡是無法通過Winsock函數庫來實現IP頭自定義的,當然可以通過編寫虛擬設備驅動程序來實現,不過比較復雜,但Windows 2000的出現打破了這種局面,Windows2000的Winsock2.2函數庫裡全面支持setsockopt()的選項IP_HDRINCL,使得我們輕松就可以實現自定義的IP頭。實現方法如下: