別忙,俗話說的好,買東西要貨比三家。大部分客戶在購物之前要看很多商品,比來比去,最後好不容易才下決心,點了下單按鈕。下單按鈕一按,就要開始建立連線。建立連線這個過程也挺複雜的,最終還要經過層層封裝,才構建出乙個完整的網路包。今天我們就來看這個過程。
4. 購物之前看,靜態資源cdn
我們部署電商應用的時候,一般會把靜態資源儲存在兩個地方,乙個是接入層nginx後面的varnish快取裡面,一般是靜態頁面;對於比較大的、不經常更新的靜態,會儲存在物件儲存裡面。這兩個地方的靜態資源都會配置cdn,將資源下發到邊緣節點。
配置了cdn之後,權威dns伺服器上,會為靜態資源設定乙個cname別名,指向另外乙個網域名稱cdn.com,返回給本地dns伺服器。
當本地dns伺服器拿到這個新的網域名稱時,需要繼續解析這個新的網域名稱。這個時候,再訪問的時候就不是原來的權威dns伺服器了,而是 cdn.com 的權威dns伺服器。這是cdn自己的權威dns伺服器。
在這個伺服器上,還是會設定乙個cname,指向另外乙個網域名稱,也即cdn網路的全域性負載均衡器。
5. 看上寶貝點下單,雙方開始建連線
當你瀏覽了很多,發現實在喜歡某個商品,於是決定下單購買。
電商**會對下單的情況提供restful的下單介面,而對於下單這種需要保密的操作,需要通過https協議進行請求。
在所有這些操作之前,首先要做的事情是建立連線。
儘管中間要經過很多的路由器和交換機,但是tcp的連線是端到端的。tcp這一層和更上層的https無法看到中間的包的過程。儘管建立連線的時候,所有的包都逃不過在這些路由器和交換機之間的**,**的細節我們放到那個下單請求的傳送過程中詳細解讀,這裡只看端到端的行為。
對於tcp連線來講,需要通過三次握手建立連線,為了維護這個連線,雙方都需要在tcp層維護乙個連線的狀態機。
一開始,客戶端和服務端都處於closed狀態。服務端先是主動監聽某個埠,處於listen狀態。然後客戶端主動發起連線syn,之後處於syn-sent狀態。服務端收到發起的連線,返回syn,並且ack客戶端的syn,之後處於syn-rcvd狀態。
客戶端收到服務端傳送的syn和ack之後,傳送ack的ack,之後處於established狀態。這是因為,它一發一收成功了。服務端收到ack的ack之後,處於established狀態,因為它的一發一收也成功了。
當tcp層的連線建立完畢之後,接下來輪到https層建立連線了,在https的交換過程中,tcp層始終處於established。
對於https,客戶端會傳送client hello訊息到伺服器,用明文傳輸tls版本資訊、加密套件候選列表、壓縮演算法候選列表等資訊。另外,還會有乙個隨機數,在協商對稱金鑰的時候使用。
然後,伺服器會返回server hello訊息,告訴客戶端,伺服器選擇使用的協議版本、加密套件、壓縮演算法等。這也有乙個隨機數,用於後續的金鑰協商。
然後,伺服器會給你乙個伺服器端的證書,然後說:「server hello done,我這裡就這些資訊了。」
客戶端當然不相信這個證書,於是你從自己信任的ca倉庫中,拿ca的證書裡面的公鑰去解密電商**的證書。如果能夠成功,則說明電商**是可信的。這個過程中,你可能會不斷往上追溯ca、ca的ca、ca的ca的ca,反正直到乙個授信的ca,就可以了。
證書驗證完畢之後,覺得這個服務端是可信的,於是客戶端計算產生隨機數字pre-master,傳送client key exchange,用證書中的公鑰加密,再傳送給伺服器,伺服器可以通過私鑰解密出來。
接下來,無論是客戶端還是伺服器,都有了三個隨機數,分別是:自己的、對端的,以及剛生成的pre-master隨機數。通過這三個隨機數,可以在客戶端和伺服器產生相同的對稱金鑰。
有了對稱金鑰,客戶端就可以說:「change cipher spec,咱們以後都採用協商的通訊金鑰和加密演算法進行加密通訊了。」
然後客戶端傳送乙個encrypted handshake message,將已經商定好的引數等,採用協商金鑰進行加密,傳送給伺服器用於資料與握手驗證。
同樣,伺服器也可以傳送change cipher spec,說:「沒問題,咱們以後都採用協商的通訊金鑰和加密演算法進行加密通訊了」,並且也傳送encrypted handshake message的訊息試試。
當雙方握手結束之後,就可以通過對稱金鑰進行加密傳輸了。
真正的下單請求封裝成網路包的傳送過程,我們先放一放,我們來接著講這個網路包的故事。
6. 傳送下單請求網路包,西行需要出閘道器
當客戶端和服務端之間建立了連線後,接下來就要傳送下單請求的網路包了。
在使用者層傳送的是http的網路包,因為服務端提供的是restful api,因而http層傳送的就是乙個請求。
http的報文大概分為三大部分。第一部分是請求行,第二部分是請求的首部,第三部分才是請求的正文實體。在請求行中,url就是 www.geektime.com/purchaseorder ,版本為http 1.1。
請求的型別叫作post,它需要主動告訴服務端一些資訊,而非獲取。需要告訴服務端什麼呢?一般會放在正文裡面。正文可以有各種各樣的格式,常見的格式是json。
請求行下面就是我們的首部字段。首部是key value,通過冒號分隔。
content-type是指正文的格式。例如,我們進行post的請求,如果正文是json,那麼我們就應該將這個值設定為json。
接下來是正文,這裡是乙個json字串,裡面通過文字的形式描述了,要買乙個課程,作者是誰,多少錢。
http協議是基於tcp協議的,所以它使用面向連線的方式傳送請求,通過stream二進位製流的方式傳給對方。當然,到了tcp層,它會把二進位製流變成乙個的報文段傳送給伺服器。
在tcp頭裡面,會有源埠號和目標埠號,目標埠號一般是服務端監聽的埠號,源埠號在手機端,往往是隨機分配乙個埠號。這個埠號在客戶端和服務端用於區分請求和返回,發給那個應用。
在ip頭裡面,都需要加上自己的位址(即源位址)和它想要去的地方(即目標位址)。當乙個手機上線的時候,pgw會給這個手機分配乙個ip位址,這就是源位址,而目標位址則是雲平台的負載均衡器的外網ip位址。
在ip層,客戶端需要檢視目標位址和自己是否是在同乙個區域網,計算是否是同乙個網段,往往需要通過cidr子網掩碼來計算。
對於這個下單場景,目標ip和源ip不會在同乙個網段,因而需要傳送到預設的閘道器。一般通過dhcp分配ip位址的時候,也會同時配置預設閘道器的ip位址。
但是客戶端不會直接使用預設閘道器的ip位址,而是傳送arp協議,來獲取閘道器的mac位址,然後將閘道器mac作為目標mac,自己的mac作為源mac,放入mac頭,傳送出去。
乙個完整的網路包的格式是這樣的。
真不容易啊,本來以為上篇就傳送下單包了,結果到中篇這個包還沒傳送出去,只是封裝了乙個如此長的網路包。別著急,你可以自己先預想一下,接下來該做什麼了?
網易雲免費體驗館,0成本體驗20+款雲產品!
入門人工智慧要掌握哪些內容
很多人想加入到it行業中來,可是it行業發展迅速,各種新名詞此起彼伏。身處這樣乙個熱點行業,學習是必須的。不打算成為終身學習者的程式設計師,失業就在明天。人工智慧要掌握哪些內容?1 要把分類弄清楚,然後搞乙個行業圖譜,並且能夠弄清楚它的上下游,這樣有助於你對行業的了解,也有助你進入行業交流也非常迅速...
人工智慧要學什麼 鄭州Python開發培訓怎麼樣
階段一是python語言 內容有基礎語法 物件導向 高階課程 經典課程 階段二是linux初級 內容有linux系統基本指令 常用服務安裝 階段三是web開發之diango 內容有前端 diango 階段四是web開發之flask 階段五是web框架之tornado 階段六是docker容器及服務發...
要多久人工智慧的夢想才能照進現實
在不少人看來,智慧型裝置的高度智慧型的乙個表現就是 可通過自然語言進行語音對話的互動方式,並且可以不斷學習進化。這種認識在業界得到了廣泛認可,而實現這一目標必須要構建更好的生態,這是因為語音可進入社會生活的每個角落,有人類活動的地方就有語音需求,單一的裝置廠商很難滿足語音的多場景化需求。dueros...