官术网_书友最值得收藏!

1.6 分布式系統的基石:TCP/IP

TCP/IP(Transmission Control Protocol/Internet Protocol,傳輸控制協議/互聯網絡協議)是Internet的基本協議,簡單地說,由底層的IP和TCP組成。TCP/IP的開發工作始于20世紀70年代,該協議是用于互聯網的第一套協議。TCP/IP結合DNS、路由協議等一系列相關協議,最終實現了網絡之間任意兩點間的數據通信問題。我們來看看在訪問百度首頁時,數據包是如何從計算機傳送到百度的服務器上的。

在命令行中運行ipconfig/all,查看到當前計算機配置的TCP/IP參數,可以看到默認網關和DNS服務器的信息,如下所示。

在瀏覽器中輸入http://baidu.com,瀏覽器會發現URL的主機部分有一個域名(domain name),就查找我們的本機配置的DNS服務器16.110.135.52,用UDP向DNS服務器發送DNS查詢命令,DNS服務器在獲取查詢命令后從數據庫中查詢該域名所對應的主機的IP地址。我們可以通過在命令行中運行nslookup來完成同樣的查詢結果。下圖解釋了目前依然被廣泛使用的基于DNS的負載均衡機制的原理。

當瀏覽器獲知220.181.111.85是baidu.com的IP地址時,就向這個地址的80端口發起TCP連接,由于220.181.111.85這個地址不是計算機所在的局域網,而是廣域網的一個地址,所以此時,另外一個重要概念“路由”產生了。互聯網是多個相互隔離的小網絡無限延伸而組成的一個大網,路由器負責將多個網絡連接,并相互交換路由表信息來確定一個IP報文要經過哪個路由器的端口發出到另外一個互聯的子網。為了防止一個數據包在轉發過程中形成死循環,IP包中的TTL的字段每經過路由器轉發一次就會減一,當TTL為零時被丟棄,認為網絡不可達,一般默認最大跳數為30。在通常情況下,只有網絡管理員和路由器知道一個報文應該被轉發給哪一個互聯的下一個路由器,但在網絡產生問題以后,我們需要追蹤是哪里出了問題,此時,tracert就成了排查此問題的重要工具。

tracert利用ICMP來確定一個IP報文到達目標地址所經過的路由器節點,程序發出的前3個數據包的TTL值是1,之后3個是2,依此類推,便得到一連串數據包路徑,路徑上的每一個IP地址都是一個路由器的IP。

從上圖來看,數據包首先被發往網關(本機發現百度的IP地址不是本機所在局域網的網絡,就將報文發給網關處理),網關之后繼續進行轉發。但不幸的是遍布網絡的很多防火墻、路由器等設備屏蔽了ICMP報文,于是我們看到7以后的跳數都是未知的。另外,被廣泛使用的Ping命令也是采用ICMP來實現的,因此,Ping不通主機不代表主機不是存活的,但大多數時候,兩者還是等價的,特別是在企業內部的網絡中。

通過上面的解釋,我們初步明白了IP報文的路由問題,接下來著名的Socket出場了。Socket是一個IP地址與端口的組合,代表計算機上的一個遠程通信接口,本地的一個Socket與遠程的一個Socket建立連接的過程,就是著名的3次握手過程,一旦連接建立,數據流就可以穿越網絡并進行雙向通信了。以上面的例子來說,百度的Web服務器有一個進程綁定在80端口的Socket上,用來接收我們發起的HTTP請求并將請求的響應轉換為HTML文本流返回給瀏覽器,瀏覽器則通過解析HTML標簽,完成可視化的頁面展現,最終我們看到百度搜索的主頁。但實際上,這個過程還是極為復雜的。

主站蜘蛛池模板: 曲松县| 昭苏县| 边坝县| 涟源市| 本溪| 洛川县| 栖霞市| 五指山市| 怀来县| 灵璧县| 新密市| 邻水| 巴中市| 宁乡县| 永新县| 雅安市| 永济市| 将乐县| 哈尔滨市| 平泉县| 天等县| 上杭县| 同江市| 阿克苏市| 富平县| 宜州市| 潜江市| 定西市| 闽清县| 民勤县| 恩施市| 昭通市| 格尔木市| 洪江市| 乌苏市| 乌恰县| 武义县| 儋州市| 华池县| 兴城市| 渝北区|