你先在瀏覽器里面輸入 https://www.taobao,com,這是一個URL。瀏覽器只知道名字是“www.taobao.com”,但是不知道具體的地點,所以不知道應該如何訪問。於是,它打開地址簿去查找。可以使用一般的地址簿協議DNS去查找,還可以使用另一種更加精准的地址簿查找協議HTTPDNS。
無論用哪一種方法查找,最終都會得到這個地址:106.114.138.24。這個是IP地址,是互聯網世界的“門牌號”。
知道了目標地址,瀏覽器就開始打包它的請求。對於普通的瀏覽請求,往往會使用HTTP協議;但是對於購物的請求,往往需要進行加密傳輸,因而會使用HTTPS協議。無論是什么協議,里面都會寫明“你要買什么和買多少”。
DNS、HTTP、HTTPS 所在的層我們稱為應用層。經過應用層封裝后,瀏覽器會將應用層的包交給下一層去完成,通過 socket 編程來實現。下一層是傳輸層。傳輸層有兩種協議,一種是無連接的協議UDP,一種是面向連接的協議TCP。對於支付來講,往往使用 TCP 協議。所謂的面向連接就是,TCP 會保證這個包能夠到達目的地。如果不能到達,就會重新發送,直至到達。
TCP 協議里面會有兩個端口,一個是瀏覽器監聽的端口,一個是電商的服務器監聽的端口。操作系統往往通過端口來判斷,它得到的包應該給哪個進程。
傳輸層封裝完畢后,瀏覽器會將包交給操作系統的網絡層。網絡層的協議是 IP 協議。在 IP 協議里面會有源 IP 地址,即瀏覽器所在機器的 IP 地址和目標 IP 地址,也即電商網站所在服務器的 IP 地址。
於是操作系統將 IP 包交給了下一層,也就是MAC 層。網卡再將包發出去。由於這個包里面是有 MAC 地址的,因而它能夠到達網關。
總而言之:
網關收到包之后,會根據自己的知識,判斷下一步應該怎么走。網關往往是一個路由器,到某個 IP 地址應該怎么走,這個叫作路由表。
路由器有點像玄奘西行路過的一個個國家的一個個城關。每個城關都連着兩個國家,每個國家相當於一個局域網,在每個國家內部,都可以使用本地的地址 MAC 進行通信。
一旦跨越城關,就需要拿出 IP 頭來,里面寫着貧僧來自東土大唐(就是源 IP 地址),欲往西天拜佛求經(指的是目標 IP 地址)。路過寶地,借宿一晚,明日啟行,請問接下來該怎么走啊?
城關往往是知道這些“知識”的,因為城關和臨近的城關也會經常溝通。到哪里應該怎么走,這種溝通的協議稱為路由協議,常用的有OSPF和BGP。
城關與城關之間是一個國家,當網絡包知道了下一步去哪個城關,還是要使用國家內部的 MAC 地址,通過下一個城關的 MAC 地址,找到下一個城關,然后再問下一步的路怎么走,一直到走出最后一個城關。
最后一個城關知道這個網絡包要去的地方。於是,對着這個國家吼一聲,誰是目標 IP 啊?目標服務器就會回復一個 MAC 地址。網絡包過關后,通過這個 MAC 地址就能找到目標服務器。
目標服務器發現 MAC 地址對上了,取下 MAC 頭來,發送給操作系統的網絡層。發現 IP 也對上了,就取下 IP 頭。IP 頭里會寫上一層封裝的是 TCP 協議,然后將其交給傳輸層,即TCP 層。
在這一層里,對於收到的每個包,都會有一個回復的包說明收到了。這個回復的包絕非這次下單請求的結果,例如購物是否成功,扣了多少錢等,而僅僅是 TCP 層的一個說明,即收到之后的回復。當然這個回復,會沿着剛才來的方向走回去,報個平安。
因為一旦出了國門,西行路上千難萬險,如果在這個過程中,網絡包走丟了,例如進了大沙漠,或者被強盜搶劫殺害怎么辦呢?因而到了要報個平安。
如果過一段時間還是沒到,發送端的 TCP 層會重新發送這個包,還是上面的過程,直到有一天收到平安到達的回復。這個重試絕非你的瀏覽器重新將下單這個動作重新請求一次。對於瀏覽器來講,就發送了一次下單請求,TCP 層不斷自己悶頭重試。除非 TCP 這一層出了問題,例如連接斷了,才輪到瀏覽器的應用層重新發送下單請求。
當網絡包平安到達 TCP 層之后,TCP 頭中有目標端口號,通過這個端口號,可以找到電商網站的進程正在監聽這個端口號,假設一個 Tomcat,將這個包發給電商網站。
電商網站的進程得到 HTTP 請求的內容,知道了要買東西,買多少。往往一個電商網站最初接待請求的這個 Tomcat 只是個接待員,負責統籌處理這個請求,而不是所有的事情都自己做。例如,這個接待員要告訴專門管理訂單的進程,登記要買某個商品,買多少,要告訴管理庫存的進程,庫存要減少多少,要告訴支付的進程,應該付多少錢,等等。
如何告訴相關的進程呢?往往通過 RPC 調用,即遠程過程調用的方式來實現。遠程過程調用就是當告訴管理訂單進程的時候,接待員不用關心中間的網絡互連問題,會由 RPC 框架統一處理。RPC 框架有很多種,有基於 HTTP 協議放在 HTTP 的報文里面的,有直接封裝在 TCP 報文里面的。
當接待員發現相應的部門都處理完畢,就回復一個 HTTPS 的包,告知下單成功。這個 HTTPS 的包,會像來的時候一樣,經過千難萬險到達你的個人電腦,最終進入瀏覽器,顯示支付成功。