我們電腦上的數(shù)據(jù)蟀给,是如何“走”到遠端的另一臺電腦的呢?這是個最基礎的問題随夸,可能很多人回答不上來,盡管我們每天都在使用網(wǎng)絡甥郑。這里我們以一個最簡單的“ping”命令逃魄,來解釋一個數(shù)據(jù)包“旅程”。
假設:我的電腦A澜搅,向遠在外地的朋友電腦B傳輸數(shù)據(jù)假栓,最簡單的就是“ping”一下,看看這個家伙的那一端網(wǎng)絡通不通道偷。A與B之間只有一臺路由器瓮下。(路由器可能放在學校,社區(qū)或者電信機房饵溅,無所謂妨退,基本原理是一樣的)
具體過程如下------
1.“ping”命令所產(chǎn)生的數(shù)據(jù)包,我們歸類為ICMP協(xié)議蜕企。說白了就是向目的地發(fā)送一個數(shù)據(jù)包咬荷,然后等待回應,如果回應正常則目的地的網(wǎng)絡就是通的轻掩。當我們輸入了“ping”命令之后幸乒,我們的機器(電腦A)就生成了一個包含ICMP協(xié)議域的數(shù)據(jù)包,姑且稱之為“小德”吧~~~~
2.“小德”已經(jīng)將ICMP協(xié)議打包到數(shù)據(jù)段里了唇牧,可是還不能發(fā)送罕扎,因為一個數(shù)據(jù)要想向外面?zhèn)魉停€得經(jīng)過“有關(guān)部門”的批準------IP協(xié)議丐重。IP要將你的“寫信人地址”和“收信人地址”寫到數(shù)據(jù)段上面腔召,即:將數(shù)據(jù)的源IP地址和目的IP地址分別打包在“小德”的頭部和尾部,這樣一來扮惦,大家才知道你的數(shù)據(jù)是要送到哪里臀蛛。
3.準備工作還沒有完。接下來還有部門要審核------ARP崖蜜。ARP屬于數(shù)據(jù)鏈路層協(xié)議掺栅,主要負責把IP地址對應到硬件地址。直接說吧纳猪,都怪交換機太“傻”氧卧,不能根據(jù)IP地址直接找到相應的計算機,只能根據(jù)硬件地址來找氏堤。于是沙绝,交換機就經(jīng)常保留一張IP地址與硬件地址的對應表以便其查找目的地搏明。而ARP就是用來生成這張表的。比如:當“小德”被送到ARP手里之后闪檬,ARP就要在表里面查找星著,看看“小德”的IP地址與交換機的哪個端口對應,然后轉(zhuǎn)發(fā)過去粗悯。如果沒找到虚循,則發(fā)一個廣播給所有其他的交換機端口,問這是誰的IP地址样傍,如果有人回答横缔,就轉(zhuǎn)發(fā)給它。
4.經(jīng)過一番折騰衫哥,“小德”終于要走出這個倒霉的局域網(wǎng)了茎刚。可在此之前撤逢,它們還沒忘給“小德”屁股后面蓋個“戳”膛锭,說是什么CRC校驗值,怕“小德”在旅行途中缺胳膊少腿蚊荣,還得麻煩它們重新發(fā)送初狰。。互例。跷究。。我靠~~~~注:很多人弄不清FCS和CRC敲霍。所謂的CRC是一種校驗方法,用來確保數(shù)據(jù)在傳輸過程中不會丟包丁存,損壞等等肩杈,F(xiàn)CS是數(shù)據(jù)包(準確的說是frame)里的一個區(qū)域,用來存放CRC的計算結(jié)果的解寝。到了目的地之后扩然,目的計算機要檢查FCS里的CRC值,如果與原來的相同聋伦,則說明數(shù)據(jù)在途中沒有損壞夫偶。
5.在走出去之前,那些家伙最后折磨了一次“小德”------把小德身上眾多的0和1觉增,弄成了什么“高電壓”“低電壓”兵拢,在雙絞線上傳送了出去。暈~~出趟門就這么麻煩嗎逾礁?
6.坐著雙絞線旅游说铃,爽!可當看到很多人坐著同軸電纜,還有坐光纖的時候腻扇,小德又感覺不是那么爽了债热。就在這時,來到了旅途的中轉(zhuǎn)站------路由器幼苛。這地方可是高級場所窒篱,人家直接查看IP地址!剩下的一概不管舶沿,交給下面的人去做墙杯。夠牛吧?路由器的內(nèi)部也有一張表暑椰,叫做路由表霍转,里面標識著哪一個網(wǎng)絡的IP對應著路由器的哪一個端口。這個表也不是天生就有的一汽,而是靠路由器之間互相“學習”之后生成的避消,當然也可以由管理員手工設定。這個“學習”的過程是依靠路由協(xié)議來完成的召夹,比如RIP岩喷,EIGRP,OSPF等等监憎。
7.當路由器查看了“小德”的IP地址以后纱意,根據(jù)路由表知道了小德要去的網(wǎng)絡,接著就把小德轉(zhuǎn)到了相應的端口了鲸阔。至此偷霉,路由器的主要工作完成,下面又是打包褐筛,封裝成frame类少,轉(zhuǎn)換成電壓信號等一系列“折騰”的活,就由數(shù)據(jù)鏈路層和物理層的模塊去干吧渔扎。
8.小德從路由器的出口出來硫狞,便來到了目的地----電腦B----所屬的網(wǎng)絡的默認網(wǎng)關(guān)。默認網(wǎng)關(guān)可以是路由器的一個端口晃痴,也可以是局域網(wǎng)里的各種服務器残吩。不管怎樣,下面的過程還是一樣的:到交換機里的ARP表查詢“小德”的IP地址倘核,看看屬于哪個局域網(wǎng)段或端口泣侮,然后就轉(zhuǎn)發(fā)到B了。
9.進了B的網(wǎng)卡之后紧唱,還要層層“剝皮”旁瘫,基本上和從A出來的程序是一樣的------電腦B先校驗一下CRC值祖凫,看看數(shù)據(jù)是否完整;然后檢查一下frame的封裝酬凳,看到是IP協(xié)議之后惠况,就把“小德”交給IP“部門”了;IP協(xié)議一看目的地址宁仔,正確稠屠,再看看應用協(xié)議,是ICMP翎苫。于是知道了該怎么做了------產(chǎn)生一個回應數(shù)據(jù)包权埠,(可以命名為“回應小德”),并準備以同樣的順序向遠端的A發(fā)送煎谍。攘蔽。至于剛剛收到的那個數(shù)據(jù)包就丟棄了。
10.“回應小德”這個數(shù)據(jù)包又開始了上述同樣的循環(huán)呐粘,只不過這次發(fā)送者是B而接收者是A了满俗。
以上是一個最簡單的路由過程,任何復雜的網(wǎng)絡都是在次基礎之上實現(xiàn)的作岖。
網(wǎng)絡數(shù)據(jù)包大小
用UDP協(xié)議發(fā)送時唆垃,用sendto函數(shù)最大能發(fā)送數(shù)據(jù)的長度為:65535-20-8=65507字節(jié),其中20字節(jié)為IP包頭長度痘儡,8字節(jié)為UDP包頭長度辕万。用sendto函數(shù)發(fā)送數(shù)據(jù)時,如果指的的數(shù)據(jù)長度大于該值沉删,則函數(shù)會返回錯誤渐尿。
用TCP協(xié)議發(fā)送時,由于TCP是數(shù)據(jù)流協(xié)議矾瑰,因此不存在包大小的限制(暫不考慮緩沖區(qū)的大凶┤住),這是指在用send函數(shù)時脯倚,數(shù)據(jù)長度參數(shù)不受限制。而實際上嵌屎,所指定的這段數(shù)據(jù)并不一定會一次性發(fā)送出去推正,如果這段數(shù)據(jù)比較長,可能會被分段發(fā)送宝惰,如果比較短植榕,可能會等待和下一次數(shù)據(jù)一起發(fā)送。我在測試的時候尼夺,發(fā)現(xiàn)長度一般會被切成16384(16K)或49152(48K)尊残,不知道這兩個值有什么意義炒瘸。
轉(zhuǎn)載地址: