我們電腦上的數(shù)據(jù),是如何“走”到遠(yuǎn)端的另一臺(tái)電腦的呢?這是個(gè)最基礎(chǔ)的問(wèn)題,可能很多人回答不上來(lái),盡管我們每天都在使用網(wǎng)絡(luò)。這里我們以一個(gè)最簡(jiǎn)單的“ping”命令,來(lái)解釋一個(gè)數(shù)據(jù)包“旅程”。
假設(shè):我的電腦A,向遠(yuǎn)在外地的朋友電腦B傳輸數(shù)據(jù),最簡(jiǎn)單的就是“ping”一下,看看這個(gè)家伙的那一端網(wǎng)絡(luò)通不通。A與B之間只有一臺(tái)路由器。(路由器可能放在學(xué)校,社區(qū)或者電信機(jī)房,無(wú)所謂,基本原理是一樣的)
具體過(guò)程如下------
1.“ping”命令所產(chǎn)生的數(shù)據(jù)包,我們歸類為ICMP協(xié)議。說(shuō)白了就是向目的地發(fā)送一個(gè)數(shù)據(jù)包,然后等待回應(yīng),如果回應(yīng)正常則目的地的網(wǎng)絡(luò)就是通的。當(dāng)我們輸入了“ping”命令之后,我們的機(jī)器(電腦A)就生成了一個(gè)包含ICMP協(xié)議域的數(shù)據(jù)包,姑且稱之為“小德”吧~~~~
2.“小德”已經(jīng)將ICMP協(xié)議打包到數(shù)據(jù)段里了,可是還不能發(fā)送,因?yàn)橐粋€(gè)數(shù)據(jù)要想向外面?zhèn)魉?,還得經(jīng)過(guò)“有關(guān)部門”的批準(zhǔn)------IP協(xié)議。IP要將你的“寫信人地址”和“收信人地址”寫到數(shù)據(jù)段上面,即:將數(shù)據(jù)的源IP地址和目的IP地址分別打包在“小德”的頭部和尾部,這樣一來(lái),大家才知道你的數(shù)據(jù)是要送到哪里。
3.準(zhǔn)備工作還沒(méi)有完。接下來(lái)還有部門要審核------ARP。ARP屬于數(shù)據(jù)鏈路層協(xié)議,主要負(fù)責(zé)把IP地址對(duì)應(yīng)到硬件地址。直接說(shuō)吧,都怪交換機(jī)太“傻”,不能根據(jù)IP地址直接找到相應(yīng)的計(jì)算機(jī),只能根據(jù)硬件地址來(lái)找。于是,交換機(jī)就經(jīng)常保留一張IP地址與硬件地址的對(duì)應(yīng)表以便其查找目的地。而ARP就是用來(lái)生成這張表的。比如:當(dāng)“小德”被送到ARP手里之后,ARP就要在表里面查找,看看“小德”的IP地址與交換機(jī)的哪個(gè)端口對(duì)應(yīng),然后轉(zhuǎn)發(fā)過(guò)去。如果沒(méi)找到,則發(fā)一個(gè)廣播給所有其他的交換機(jī)端口,問(wèn)這是誰(shuí)的IP地址,如果有人回答,就轉(zhuǎn)發(fā)給它。
4.經(jīng)過(guò)一番折騰,“小德”終于要走出這個(gè)倒霉的局域網(wǎng)了??稍诖酥埃鼈冞€沒(méi)忘給“小德”屁股后面蓋個(gè)“戳”,說(shuō)是什么CRC校驗(yàn)值,怕“小德”在旅行途中缺胳膊少腿,還得麻煩它們重新發(fā)送。。。。。我靠~~~~注:很多人弄不清FCS和CRC。所謂的CRC是一種校驗(yàn)方法,用來(lái)確保數(shù)據(jù)在傳輸過(guò)程中不會(huì)丟包,損壞等等,F(xiàn)CS是數(shù)據(jù)包(準(zhǔn)確的說(shuō)是frame)里的一個(gè)區(qū)域,用來(lái)存放CRC的計(jì)算結(jié)果的。到了目的地之后,目的計(jì)算機(jī)要檢查FCS里的CRC值,如果與原來(lái)的相同,則說(shuō)明數(shù)據(jù)在途中沒(méi)有損壞。
5.在走出去之前,那些家伙最后折磨了一次“小德”------把小德身上眾多的0和1,弄成了什么“高電壓”“低電壓”,在雙絞線上傳送了出去。暈~~出趟門就這么麻煩嗎?
6.坐著雙絞線旅游,爽!可當(dāng)看到很多人坐著同軸電纜,還有坐光纖的時(shí)候,小德又感覺(jué)不是那么爽了。就在這時(shí),來(lái)到了旅途的中轉(zhuǎn)站------路由器。這地方可是高級(jí)場(chǎng)所,人家直接查看IP地址!剩下的一概不管,交給下面的人去做。夠牛吧?路由器的內(nèi)部也有一張表,叫做路由表,里面標(biāo)識(shí)著哪一個(gè)網(wǎng)絡(luò)的IP對(duì)應(yīng)著路由器的哪一個(gè)端口。這個(gè)表也不是天生就有的,而是靠路由器之間互相“學(xué)習(xí)”之后生成的,當(dāng)然也可以由管理員手工設(shè)定。這個(gè)“學(xué)習(xí)”的過(guò)程是依靠路由協(xié)議來(lái)完成的,比如RIP,EIGRP,OSPF等等。
7.當(dāng)路由器查看了“小德”的IP地址以后,根據(jù)路由表知道了小德要去的網(wǎng)絡(luò),接著就把小德轉(zhuǎn)到了相應(yīng)的端口了。至此,路由器的主要工作完成,下面又是打包,封裝成frame,轉(zhuǎn)換成電壓信號(hào)等一系列“折騰”的活,就由數(shù)據(jù)鏈路層和物理層的模塊去干吧。
8.小德從路由器的出口出來(lái),便來(lái)到了目的地----電腦B----所屬的網(wǎng)絡(luò)的默認(rèn)網(wǎng)關(guān)。默認(rèn)網(wǎng)關(guān)可以是路由器的一個(gè)端口,也可以是局域網(wǎng)里的各種服務(wù)器。不管怎樣,下面的過(guò)程還是一樣的:到交換機(jī)里的ARP表查詢“小德”的IP地址,看看屬于哪個(gè)局域網(wǎng)段或端口,然后就轉(zhuǎn)發(fā)到B了。
9.進(jìn)了B的網(wǎng)卡之后,還要層層“剝皮”,基本上和從A出來(lái)的程序是一樣的------電腦B先校驗(yàn)一下CRC值,看看數(shù)據(jù)是否完整;然后檢查一下frame的封裝,看到是IP協(xié)議之后,就把“小德”交給IP“部門”了;IP協(xié)議一看目的地址,正確,再看看應(yīng)用協(xié)議,是ICMP。于是知道了該怎么做了------產(chǎn)生一個(gè)回應(yīng)數(shù)據(jù)包,(可以命名為“回應(yīng)小德”),并準(zhǔn)備以同樣的順序向遠(yuǎn)端的A發(fā)送。。至于剛剛收到的那個(gè)數(shù)據(jù)包就丟棄了。
10.“回應(yīng)小德”這個(gè)數(shù)據(jù)包又開始了上述同樣的循環(huán),只不過(guò)這次發(fā)送者是B而接收者是A了。
以上是一個(gè)最簡(jiǎn)單的路由過(guò)程,任何復(fù)雜的網(wǎng)絡(luò)都是在次基礎(chǔ)之上實(shí)現(xiàn)的。
網(wǎng)絡(luò)數(shù)據(jù)包大小
用UDP協(xié)議發(fā)送時(shí),用sendto函數(shù)最大能發(fā)送數(shù)據(jù)的長(zhǎng)度為:65535-20-8=65507字節(jié),其中20字節(jié)為IP包頭長(zhǎng)度,8字節(jié)為UDP包頭長(zhǎng)度。用sendto函數(shù)發(fā)送數(shù)據(jù)時(shí),如果指的的數(shù)據(jù)長(zhǎng)度大于該值,則函數(shù)會(huì)返回錯(cuò)誤。
用TCP協(xié)議發(fā)送時(shí),由于TCP是數(shù)據(jù)流協(xié)議,因此不存在包大小的限制(暫不考慮緩沖區(qū)的大?。?,這是指在用send函數(shù)時(shí),數(shù)據(jù)長(zhǎng)度參數(shù)不受限制。而實(shí)際上,所指定的這段數(shù)據(jù)并不一定會(huì)一次性發(fā)送出去,如果這段數(shù)據(jù)比較長(zhǎng),可能會(huì)被分段發(fā)送,如果比較短,可能會(huì)等待和下一次數(shù)據(jù)一起發(fā)送。我在測(cè)試的時(shí)候,發(fā)現(xiàn)長(zhǎng)度一般會(huì)被切成16384(16K)或49152(48K),不知道這兩個(gè)值有什么意義。
轉(zhuǎn)載地址: