TCP/IP數(shù)據(jù)包結(jié)構(gòu)具體解釋
一般來說,網(wǎng)絡(luò)編程我們僅僅須要調(diào)用一些封裝好的函數(shù)或者組件就能完畢大部分的工作,可是一些特殊的情況下,就須要深入的理解網(wǎng)絡(luò)數(shù)據(jù)包的結(jié)構(gòu),以及協(xié)議分析。如:網(wǎng)絡(luò)監(jiān)控,故障排查等……
IP包是不安全的,可是它是互聯(lián)網(wǎng)的基礎(chǔ),在各方面都有廣泛的應(yīng)用。由IP協(xié)議衍生的協(xié)議族有10數(shù)種(據(jù)我所知),以后還會出現(xiàn)很多其它的基于IP的協(xié)議…
先從實際出發(fā)吧!
一般我們在談上網(wǎng)速度的時候,專業(yè)上用帶寬來描寫敘述,事實上不管說網(wǎng)速或者帶寬都是不準確的,呵呵。比方:1兆,512K……有些在學(xué)校的學(xué)生,或許會有疑問,明明我的業(yè)務(wù)是1M,為什么下載速度到100K就飆不上去了?512K的為什么50多K就封頂了?…
這里所說的1M是指1Mbps = 1 Million Bits Per Second,也就是1M比特每秒,即一秒鐘傳輸1048576個二進制位。我們知道一個字節(jié)是8個二進制位。
好,又來問題了。即便這樣子,1M=1048756÷8=131072÷1024=128K。那也應(yīng)該有128K啊,為什么下載速度還是非常少到120K,110K都謝天謝地了??赐瓯疚模愕膸ぞ蛯α?hellip;…
IP數(shù)據(jù)包結(jié)構(gòu):
如圖,一個刻度表示1個二進制位(比特)
1-1.版本號4位,表示版本號號,眼下最廣泛的是4=B1000,即常說的IPv4;相信IPv6以后會廣泛應(yīng)用,它能給世界上每一個紐扣都分配一個IP地址。
1-2.頭長4位,數(shù)據(jù)包頭部長度。它表示數(shù)據(jù)包頭部包含多少個32位長整型,也就是多少個4字節(jié)的數(shù)據(jù)。無選項則為5(紅色部分)。
1-3.服務(wù)類型,包含8個二進制位,每一個位的意義例如以下:
* 過程字段:3位,設(shè)置了數(shù)據(jù)包的重要性,取值越大數(shù)據(jù)越重要,取值范圍為:0(正常)~ 7(網(wǎng)絡(luò)控制)
* 延遲字段:1位,取值:0(正常)、1(期特低的延遲)
* 流量字段:1位,取值:0(正常)、1(期特高的流量)
* 可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)
* 成本字段:1位,取值:0(正常)、1(期特最小成本)
* 保留字段:1位 ,未使用
1-4.包裹總長16位,當(dāng)前數(shù)據(jù)包的總長度,單位是字節(jié)。當(dāng)然最大僅僅能是65535,及64KB。
2-1.重組標(biāo)識16位,發(fā)送主機賦予的標(biāo)識,以便接收方進行分片重組。
2-2.標(biāo)志3位,他們各自的意義例如以下:
* 保留段位(2):1位,未使用
* 不分段位(1):1位,取值:0(同意數(shù)據(jù)報分段)、1(數(shù)據(jù)報不能分段)
* 很多其它段位(0):1位,取值:0(數(shù)據(jù)包后面沒有包,該包為最后的包)、1(數(shù)據(jù)包后面有很多其它的包)
2-3.段偏移量13位,與很多其它段位組合,幫助接收方組合分段的報文,以字節(jié)為單位。
3-1.生存時間8位,常常ping命令看到的TTL(Time To Live)就是這個,每經(jīng)過一個路由器,該值就減一,到零丟棄。
3-2.協(xié)議代碼8位,表明使用該包裹的上層協(xié)議,如TCP=6,ICMP=1,UDP=17等。
3-3.頭檢驗和16位,是IPv4數(shù)據(jù)包頭部的校驗和。
4-1.源始地址,32位4字節(jié),我們??吹降腎P是將每一個字節(jié)用點(.)分開,如此而已。
5-1.目的地址,32位,同上。
6-1.可選選項,主要是給一些特殊的情況使用,往往安全路由會當(dāng)作攻擊而過濾掉,普聯(lián)(TP_LINK)的TL-ER5110路由就能這么做。
7-1.用戶數(shù)據(jù)。
TCP數(shù)據(jù)包結(jié)構(gòu):
1-1.源始port16位,范圍當(dāng)然是0-65535啦。
1-2.目的port,同上。
2-1.數(shù)據(jù)序號32位,TCP為發(fā)送的每一個字節(jié)都編一個號碼,這里存儲當(dāng)前數(shù)據(jù)包數(shù)據(jù)第一個字節(jié)的序號。
3-1.確認序號32位,為了安全,TCP告訴接受者希望他下次接到數(shù)據(jù)包的第一個字節(jié)的序號。
4-1.偏移4位,類似IP,表明數(shù)據(jù)距包頭有多少個32位。
4-2.保留6位,未使用,應(yīng)置零。
4-3.緊急比特URG—當(dāng)URG=1時,表明緊急指針字段有效。它告訴系統(tǒng)此報文段中有緊急數(shù)據(jù),應(yīng)盡快傳送(相當(dāng)于高優(yōu)先級的數(shù)據(jù))。
4-3.確認比特ACK—僅僅有當(dāng)ACK=1時確認號字段才有效。當(dāng)ACK=0時,確認號無效。
4-4.復(fù)位比特RST(Reset) —當(dāng)RST=1時,表明TCP連接中出現(xiàn)嚴重差錯(如因為主機崩潰或其它原因),必須釋放連接,然后再又一次建立運輸連接。
4-5.同步比特SYN—同步比特SYN置為1,就表示這是一個連接請求或連接接受報文。
4-6.終止比特FIN(FINal)—用來釋放一個連接。當(dāng)FIN=1時,表明此報文段的發(fā)送端的數(shù)據(jù)已發(fā)送完成,并要求釋放運輸連接。
4-7.窗體字段16位,窗體字段用來控制對方發(fā)送的數(shù)據(jù)量,單位為字節(jié)。TCP連接的一端依據(jù)設(shè)置的緩存空間大小確定自己的接收窗體大小,然后通知對方以確定對方的發(fā)送窗體的上限。
5-1.包校驗和16位,包含首部和數(shù)據(jù)這兩部分。在計算檢驗和時,要在TCP報文段的前面加上12字節(jié)的偽首部。
5-2.緊急指針16位,緊急指針指出在本報文段中的緊急數(shù)據(jù)的最后一個字節(jié)的序號。
6-1.可選選項24位,類似IP,是可選選項。
6-2.填充8位,使選項湊足32位。
7-1.用戶數(shù)據(jù)……
能夠看出,每一個IP包至少要20字節(jié)的頭部長度,這些與下載內(nèi)容無關(guān),加上眼下多數(shù)傳輸,包含http協(xié)議(就是IE直接下載),都是基于TCP協(xié)議的,所以IP包裹還要從用戶數(shù)據(jù)中扣除20字節(jié)的TCP包頭,這里已經(jīng)是40字節(jié),加上其它程序的連接,狀態(tài)確認等等包裹,因而算出來要比理論值要小。
另外網(wǎng)絡(luò)環(huán)境(包含穩(wěn)定因素和傳輸節(jié)點的轉(zhuǎn)發(fā)率)也是影響下載速度的重要原因……