一般來說,網路編程我們只需要調用一些封裝好的函數或者組件就能完成大部分的工作,但是一些特殊的情況下,就需要深入的理解
網路資料包的結構,以及協議分析。如:網路監控,故障排查等……
IP包是不安全的,但是它是互連網的基礎,在各方面都有廣泛的應用。由IP協議衍生的協議族有10數種(據我所知),以後還會出現
更多的基於IP的協議…
先從實際出發吧!
一般我們在談上網速度的時候,專業上用頻寬來描述,其實無論說網速或者頻寬都是不準確的,呵呵。比如:1兆,512K……
有些在學校的學生,也許會有疑問,明明我的業務是1M,為什麼下載速度到100K就飆不上去了?512K的為什麼50多K就封頂了?…
這裡所說的1M是指1Mbps = 1 Million Bits Per Second,也就是1M位元每秒,即一秒鐘傳輸1048576個二進位位。我們知道一個位元組
是8個二進位位。
好,又來問題了。即便這樣子,1M=1048756÷8=131072÷1024=128K。那也應該有128K啊,為什麼下載速度還是很少到120K,
110K都謝天謝地了。看完本文,你的帳就對了……
1 .協議層次圖
協議棧:
| OSI中的層 |
功能 |
TCP/IP協議族 |
| 應用程式層 |
檔案傳輸,電子郵件,檔案服務,虛擬終端 |
TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 |
| 展示層 |
資料格式化,代碼轉換,資料加密 |
沒有協議 |
| 會話層 |
解除或建立與別的接點的聯絡 |
沒有協議 |
| 傳輸層 |
提供端對端的介面 |
TCP,UDP |
| 網路層 |
為資料包選擇路由 |
IP,ICMP,OSPF,EIGRP,IGMP,RIP |
| 資料連結層 |
傳輸有地址的幀以及錯誤偵測功能 |
SLIP,CSLIP,PPP,MTU,ARP,RARP |
| 物理層 |
以位元據形式在物理媒體上傳輸資料 |
ISO2110,IEEE802,IEEE802.2 |
注意tcp本身不具有資料轉送中噪音導致的錯誤偵測功能,但是實現逾時的錯誤重傳功能;
資料格式:
鏈路層資料幀:幀頭+IP資料包+幀尾 (幀頭包括源和目標主機MAC地址及類型,幀尾是校正字) IP資料包:IP頭部+TCP資料資訊(IP頭包括源和目標主機IP地址、類型、生存期等) TCP資料資訊:TCP頭部+實際資料 (TCP頭包括源和目標主機連接埠號碼、順序號、確認號、校正字等)
乙太網路的框架格式如下所示
其中的源地址和目的地址是指網卡的硬體地址(也叫MAC地址),長度是48位,是在網卡出廠時固化的。用ifconfig命令看一下,“HWaddr 00:15:F2:14:9E:3F”部分就是硬體地址。類型欄位有三種值,分別對應IP、ARP、RARP。幀末尾是CRC校正碼。
乙太網路幀中的資料長度規定最小46位元組,最大1500位元組,ARP和RARP資料包的長度不夠46位元組,要在後面補填充位。最大值1500稱為乙太網路的傳輸單元最大值(MTU),不同的網路類型有不同的MTU,如果一個資料包從乙太網路路由到撥號鏈路上,資料包長度大於撥號鏈路的MTU了,則需要對資料包進行分區(fragmentation)。ifconfig命令的輸出中也有“MTU:1500”。注意,MTU這個概念指資料幀中有效載荷的最大長度,不包括幀首部的長度。
IP資料包結構:
,一個刻度表示1個二進位位(位元)。
1-1.版本4位,表示版本號碼,目前最廣泛的是4=B1000,即常說的IPv4;相信IPv6以後會廣泛應用,它能給世界上每個紐扣都分配
一個IP地址。
1-2.頭長4位,資料包頭部長度。它表示資料包頭部包括多少個32位長整型,也就是多少個4位元組的資料。無選項則為5(紅色部分)。
1-3.服務類型,包括8個二進位位,每個位的意義如下:
過程欄位:3位,設定了資料包的重要性,取值越大資料越重要,取值範圍為:0(正常)~ 7(網路控制)
延遲欄位:1位,取值:0(正常)、1(期特低的延遲)
流量欄位:1位,取值:0(正常)、1(期特高的流量)
可靠性欄位:1位,取值:0(正常)、1(期特高的可靠性)
成本欄位:1位,取值:0(正常)、1(期特最小成本)
保留欄位:1位 ,未使用
1-4.包裹總長16位,當前資料包的總長度,單位是位元組。當然最大隻能是65535,及64KB。
2-1.重組標識16位,發送主機賦予的標識,以便接收方進行分區重組。
2-2.標誌3位,他們各自的意義如下:
保留段位(2):1位,未使用
不分段位(1):1位,取值:0(允許資料報分段)、1(資料報不能分段)
更多段位(0):1位,取值:0(資料包後面沒有包,該包為最後的包)、1(資料包後面有更多的包)
2-3.段位移量13位,與更多段位組合,協助接收方組合分段的報文,以位元組為單位。
3-1.存留時間8位,經常ping命令看到的TTL(Time To Live)就是這個,每經過一個路由器,該值就減一,到零丟棄。
3-2.協議代碼8位,表明使用該包裹的上層協議,如TCP=6,ICMP=1,UDP=17等。
3-3.頭檢驗和16位,是IPv4資料包頭部的校正和。
4-1.源始地址,32位4位元組,我們常看到的IP是將每個位元組用點(.)分開,如此而已。
5-1.目的地址,32位,同上。
6-1.可選選項,主要是給一些特殊的情況使用,往往安全路由會當作攻擊而過濾掉,普聯(TP_LINK)的TL-ER5110路由就能這麼做。
7-1.使用者資料。
TCP資料包結構:
1-1.源始連接埠16位,範圍當然是0-65535啦。
1-2.目的連接埠,同上。
2-1.資料序號32位,TCP為發送的每個位元組都編一個號碼,這裡儲存當前資料包資料第一個位元組的序號。
3-1.確認序號32位,為了安全,TCP告訴接受者希望他下次接到資料包的第一個位元組的序號。
4-1.位移4位,類似IP,表明資料距包頭有多少個32位。
4-2.保留6位,未使用,應置零。
4-3.緊急位元URG—當URG=1時,表明緊急指標欄位有效。它告訴系統此報文段中有緊急資料,應儘快傳送(相當於高優先順序的資料)。
4-3.確認位元ACK—只有當ACK=1時確認號欄位才有效。當ACK=0時,確認號無效。參考TCP三向交握
4-4.複位位元RST(Reset) —當RST=1時,表明TCP串連中出現嚴重差錯(如由於主機崩潰或其他原因),必須釋放串連,然後再重新
建立運輸串連。參考TCP三向交握
4-5.同步位元SYN—同步位元SYN置為1,就表示這是一個串連請求或串連接受報文。參考TCP三向交握
4-6.終止位元FIN(FINal)—用來釋放一個串連。當FIN=1時,表明此報文段的發送端的資料已發送完畢,並要求釋放運輸串連。
4-7.視窗欄位16位,視窗欄位用來控制對方發送的資料量,單位為位元組。TCP串連的一端根據設定的緩衝空間大小確定自己的接收視窗
大小,然後通知對方以確定對方的發送視窗的上限。
5-1.包校正和16位,包括首部和資料這兩部分。在計算檢驗和時,要在TCP報文段的前面加上12位元組的偽首部。
5-2.緊急指標16位,緊急指標指出在本報文段中的緊急資料的最後一個位元組的序號。
6-1.可選選項24位,類似IP,是可選選項。
6-2.填充8位,使選項湊足32位。
7-1.使用者資料……