向 xxxhub 發(fā)了一個數(shù)據(jù)包,發(fā)現(xiàn)了···
大家好,我是軒轅。
那天,我突然想到一個問題:
當(dāng)我訪問那個讓萬千宅男程序員為之著迷的GitHub時,我電腦發(fā)出的數(shù)據(jù)包是如何抵達(dá)大洋彼岸的GitHub服務(wù)器的呢,這中間又要經(jīng)過哪些節(jié)點呢?
讓我們一起來探究下這個問題,請注意系好安全帶,軒轅的計算機(jī)網(wǎng)絡(luò)快車要發(fā)車了···
IP報文
互聯(lián)網(wǎng)把無數(shù)的手機(jī)、電腦、服務(wù)器、路由器、交換機(jī)等各種設(shè)備連接在一塊兒,那這些設(shè)備之間要通過網(wǎng)絡(luò)通信,自然就需要一套通信協(xié)議,TCP/IP就是這樣一套協(xié)議。
包括瀏覽器在內(nèi)的這些應(yīng)用程序發(fā)出的數(shù)據(jù),被HTTP、TCP、IP協(xié)議層層封裝,最終形成一個個的IP報文,交給底層網(wǎng)卡發(fā)出去。
IP報文經(jīng)過網(wǎng)絡(luò)中節(jié)點的不斷路由轉(zhuǎn)發(fā),最終來到了目標(biāo)服務(wù)器。
那如何知道路由轉(zhuǎn)發(fā)過程中,都經(jīng)過了哪些網(wǎng)絡(luò)節(jié)點呢?
Windows上的tracert程序和Linux上的traceroute程序就能夠做到。
它們是如何做到的呢?
IP報文總不能無限制轉(zhuǎn)發(fā)吧,萬一搞了個循環(huán)轉(zhuǎn)發(fā),那不就沒完沒了了?網(wǎng)絡(luò)中的IP報文有一個生存時間的概念,位于IP報文頭部字段中——TTL:time to live。
每經(jīng)過一次轉(zhuǎn)發(fā),TTL的值就會減1。如果某一個節(jié)點發(fā)現(xiàn)TTL變成了0,就會丟掉這個IP報文,并給這個數(shù)據(jù)報文的發(fā)送者發(fā)一個超時的通知消息過去。
tracert和traceroute正是利用了IP協(xié)議中的這個特點,將TTL的值從1開始遞增,觀察都是誰給自己發(fā)回了這個通知,就能判斷路由過程中經(jīng)歷了哪些節(jié)點了。
這兩個程序的區(qū)別在于,tracert發(fā)送的是ICMP報文,traceroute發(fā)送的則是UDP報文。
路由跟蹤
好了,基礎(chǔ)知識交代完畢,趕緊來試一下,訪問GitHub的情況。
首先ping了一下,拿到了GitHub的IP地址:140.80.121.3。注意,這個地址,不同地區(qū)的人拿到的可能不一樣。
接下來路由跟蹤一下吧:
- F:\work>tracert 140.82.121.3
- 通過最多 30 個躍點跟蹤
- 到 lb-140-82-121-3-fra.github.com [140.82.121.3] 的路由:
- 1 <1 毫秒 <1 毫秒 <1 毫秒 10.??.??.1
- 2 <1 毫秒 <1 毫秒 <1 毫秒 10.??.??.??
- 3 2 ms 1 ms 1 ms 182.150.63.1
- 4 * * * 請求超時。
- 5 1 ms * 2 ms 171.208.199.81
- 6 * 25 ms * 202.97.29.45
- 7 * * * 請求超時。
- 8 36 ms 37 ms 36 ms 202.97.91.190
- 9 184 ms 191 ms 185 ms 202.97.27.242
- 10 195 ms 194 ms 194 ms xe-10-0-0.mpr4.sjc7.us.zip.zayo.com [64.125.14.45]
- 11 190 ms 190 ms 190 ms ae16.cr2.sjc2.us.zip.zayo.com [64.125.31.14]
- 12 324 ms 325 ms 324 ms ae27.cs2.sjc2.us.eth.zayo.com [64.125.30.232]
- 13 * * 333 ms ae16.cs2.den5.us.zip.zayo.com [64.125.28.215]
- 14 334 ms * * ae5.cs4.ord2.us.eth.zayo.com [64.125.29.217]
- 15 * 327 ms 325 ms ae3.cs2.lga5.us.eth.zayo.com [64.125.29.212]
- 16 * * * 請求超時。
- 17 * * * 請求超時。
- 18 332 ms 332 ms 340 ms ae0.cs1.lhr15.uk.eth.zayo.com [64.125.29.119]
- 19 * * * 請求超時。
- 20 343 ms 338 ms * ae4.cs1.ams17.nl.eth.zayo.com [64.125.28.36]
- 21 355 ms 353 ms 353 ms ae2.cs1.fra6.de.eth.zayo.com [64.125.29.58]
- 22 335 ms 334 ms 338 ms ae1.mcs1.fra6.de.eth.zayo.com [64.125.29.57]
- 23 340 ms 341 ms 341 ms 82.98.193.31
- 24 * * * 請求超時。
- 25 * * * 請求超時。
- 26 335 ms 343 ms 343 ms lb-140-82-121-3-fra.github.com [140.82.121.3]
可以看到,經(jīng)過了26個節(jié)點的轉(zhuǎn)發(fā)后,最終到達(dá)了GitHub服務(wù)器。也就是說,你電腦發(fā)出的IP報文的TTL至少要大于等于26才能抵達(dá)GitHub,否則就會中道崩殂。
接下來,咱們來看一下,這一路都去了哪里?
1-2數(shù)據(jù)包從我的計算機(jī)發(fā)出后,遇到的第一個轉(zhuǎn)發(fā)節(jié)點就是我的本地局域網(wǎng)網(wǎng)關(guān):10.??.??.1。為了安全性,我把IP地址進(jìn)行了脫敏,中間兩段用?代替。
這之后第二個節(jié)點還是局域網(wǎng)的地址,由此可見,我所在的網(wǎng)絡(luò)格局,經(jīng)過了兩級局域網(wǎng)路由轉(zhuǎn)發(fā)才上了公網(wǎng)。
3第三個轉(zhuǎn)發(fā)節(jié)點是一個公網(wǎng)地址:182.150.63.1,查了一下發(fā)現(xiàn)位于成都市武侯區(qū),這和我的實際情況相符。
4接下來的第四個路由節(jié)點就有點迷了,三個時間點都是*,tracert顯示請求超時。出現(xiàn)這個意味著tracert程序在將TTL設(shè)置為4后,沒有收到通知,或者等待的時間太久。網(wǎng)絡(luò)中的有一些節(jié)點出于安全考慮可能并不會發(fā)送超時通知。
如此一來,tracert便無法知道這第四個節(jié)點到底是誰。
5第五個節(jié)點是:171.208.199.81,仍然還在成都。
6第六個節(jié)點時:202.97.29.45,到了北京了。
7第七個節(jié)點和第四個一樣,也看不到。
8第八個節(jié)點:202.97.91.190,來到上海了。
9第九個節(jié)點:202.97.27.242,還在上海。
10第十個節(jié)點:出國了,美國加利福尼亞州。
后面的咱就不看了,就是在美國境內(nèi)各個節(jié)點的轉(zhuǎn)發(fā)了。
接下來看一下,這是一條什么樣的路徑呢?
ChinaNet
網(wǎng)絡(luò)數(shù)據(jù)包出了咱們本地的局域網(wǎng)后,就會通過電信運營商提供的城域網(wǎng)最終接入到更大的骨干網(wǎng)。
中國大陸地區(qū)的民用骨干網(wǎng)主要有四個:
- ChinaNet:中國電信163骨干網(wǎng)
- CN2:中國電信下一代承載網(wǎng)
- CHINA169:中國聯(lián)通169骨干網(wǎng)
- CMNET:中國移動骨干網(wǎng)
其中中國電信的163骨干網(wǎng)和中國聯(lián)通的169骨干網(wǎng)是最主要的兩個骨干網(wǎng),承載了中國互聯(lián)網(wǎng)絕大多數(shù)的流量。
我所在的網(wǎng)絡(luò),最后接入的就是中國電信的163骨干網(wǎng),下面是163骨干網(wǎng)的一個大致網(wǎng)絡(luò)拓?fù)鋱D。
163骨干網(wǎng)在全國總共有9個核心節(jié)點:
- 超級核心:北京、上海、廣州
- 普通核心:天津、西安、南京、杭州、武漢、成都
9個核心節(jié)點各自負(fù)責(zé)中國大陸的一部分區(qū)域。
在北京、上海、廣州三個超級核心下還掛有國際網(wǎng)間互聯(lián)設(shè)備(X路由器) ,ChinaNet通過X路由器與世界上其他運營商互聯(lián)和流量互訪。
因此,通過163網(wǎng)絡(luò)出國,必然經(jīng)過北上廣三個核心節(jié)點之一。
GitHub的服務(wù)器位于美國,對于一個要出國的數(shù)據(jù)包,它在出國前的大致旅程是這樣的:
本地局域網(wǎng) -> 市級網(wǎng)絡(luò) -> 省級網(wǎng)絡(luò) -> 核心節(jié)點 -> 國際出口 -> 境外接入點
這個過程跟我們上面tracert追蹤到的路徑是吻合的。
想不到吧,就那么一回車,數(shù)據(jù)包竟然就跑了這么多地方,計算機(jī)網(wǎng)絡(luò)真是一個神奇的玩意。
本文轉(zhuǎn)載自微信公眾號「編程技術(shù)宇宙」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系編程技術(shù)宇宙公眾號。