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