網絡層次模型,數據包的組成是學習scapy的基礎,下文主要關注模型中各個層次的用途,ethernet II和ip包數據結構。
1.五層模型簡介
名稱 | 作用 | 包含協議 |
---|---|---|
應用層 | 面向程序對程序的傳輸服務 (應用層更關注於ip協議中的數據包部分) |
HTTP,DNS,FTP,SMTP |
傳輸層 | 分割並重新組裝上層提供的數據流,為數據流提供端口到端口的傳輸服務。 (傳輸層關注端口號) |
TCP,UDP |
網絡層 | 1.通過包的分片適應最大傳輸單元長度 2.路由實現的方式和學習的方式 3.定義所有結點的邏輯地址(ip地址) (網絡層關注ip地址) |
IP,ARP,ICMP,DHCP |
數據鏈路層 | 1.把比特流組合成幀,然后發出去 2.判斷從那一幀開始到那一幀結束 3.通過一些方法(如效驗碼)來保證數據的正確性 (數據鏈路層關注MAC地址) |
Ethernet,IEEE 802.11 wireless LAN |
物理層 | 一套為上層數據鏈路層提供無差異化數據的規范 | 太底層了,不關注… |
2. Ethernet II數據包
數據鏈路層有很多協議,這里只關注一個我們最最常用的Ethernet II協議。
目的地址 | 源地址 | 類型 | 數據 | FCS |
---|---|---|---|---|
6 byte | 6 byte | 2 byte | 46~1500 byte | 4 byte |
目標地址:此數據包的目標MAC地址。
源地址:此數據包的源MAC地址。
協議類型:上層協議,表示網絡層使用的協議。(0x0800表示網絡層使用的是IP協議)
數據:高層協議、數據和填充符,范圍在46~1500字節。(如果數據長小於46字節,則要求“填充”,以使這個數據的長度達到46字節)
FCS:數據幀校驗序列,用於確定數據包在傳輸過程中是否損壞。
參考:https://en.wikipedia.org/wiki/Ethernet_frame#Ethernet_II
3.IP數據包
Offsets | 0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Version(4bit) | IHL(4bit) | DSCP(6bit) | ECN(2bit) | Total Length(16bit) | |||||||||||||||||||||||||||
4 | Identification(16bit) | Flags(3bit) | Fragment Offset(13bit) | |||||||||||||||||||||||||||||
8 | Time To Live(8bit) | Protocol(8bit) | Header Checksum(16bit) | |||||||||||||||||||||||||||||
12 | Source IP Address(32bit) | |||||||||||||||||||||||||||||||
16 | Destination IP Address(32bit) | |||||||||||||||||||||||||||||||
20 | Options(if IHL > 5) | padding | ||||||||||||||||||||||||||||||
Data |
幾個需要重點關注的對象:
1. 源地址,目的地址,ttl值在網絡層的ip數據包中。
2. Protocol字段定義了數據部分的上層協議類型(值參考https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers)
3. ip數據包包含頭部和數據部分。IHL(Internet Header Length)代表 ip包頭部長度占用4bit,值范圍是5-15,用IHL值*4字節就得到ip頭部長度(所以頭部長度一定是4字節的倍數)。Total Length是包括頭部和數據部分整個ip包的長度,占用16bit,其值以byte為單位。最小值 20 bytes (20字節頭部+ 0 bytes數據),最大值 65,535 bytes。
4. Header Checksum只包含頭部數據的錯誤校驗碼,當包經過路由器時可能會修改ip包頭部數據,此時需要重新計算此值。如果包含數據部分就太費時間了。
參考:https://en.wikipedia.org/wiki/IPv4#Packet_structure
4.校驗和(checksum)
checksum只要用於驗證數據在傳輸和存儲過程中的完整性而不是准確性,其中特別需要注意的是在計算校驗和時checksum字段的值應該為0。其計算方法如下:
SHORT checksum(USHORT* buffer, int size) { unsigned long cksum = 0; while(size>1) { cksum += *buffer++; size -= sizeof(USHORT); } if(size) { cksum += *(UCHAR*)buffer; } //處理當cksum大於16bit的情況,處理成16bit cksum = (cksum>>16) + (cksum&0xffff); cksum += (cksum>>16); // 處理上一步相加時可能產生的進位 return (USHORT)(~cksum); }
參考:http://www.thegeekstuff.com/2012/05/ip-header-checksum
轉自:http://blog.csdn.net/cracker_zhou/article/details/54645276