from http://blog.csdn.net/prsniper/article/details/6762145 2011.09 一般來說,網(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)速或者帶寬都是不準(zhǔn)確的,呵呵。比如: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都謝天謝地了??赐瓯疚?,你的帳就對了……
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位,經(jīng)常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.源始端口16位,范圍當(dāng)然是0-65535啦。 1-2.目的端口,同上。 2-1.數(shù)據(jù)序號32位,TCP為發(fā)送的每個字節(jié)都編一個號碼,這里存儲當(dāng)前數(shù)據(jù)包數(shù)據(jù)第一個字節(jié)的序號。 3-1.確認(rèn)序號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.確認(rèn)比特ACK—只有當(dāng)ACK=1時確認(rèn)號字段才有效。當(dāng)ACK=0時,確認(rèn)號無效。參考TCP三次握手 4-4.復(fù)位比特RST(Reset) —當(dāng)RST=1時,表明TCP連接中出現(xiàn)嚴(yán)重差錯(如由于主機崩潰或其他原因),必須釋放連接,然后再重新 建立運輸連接。參考TCP三次握手 4-5.同步比特SYN—同步比特SYN置為1,就表示這是一個連接請求或連接接受報文。參考TCP三次握手 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)確認(rèn)等等包裹,因 而算出來要比理論值要小。 另外網(wǎng)絡(luò)環(huán)境(包括穩(wěn)定因素和傳輸節(jié)點的轉(zhuǎn)發(fā)率)也是影響下載速度的重要原因……
呵呵,好了,就這么多吧! |
|