打開百度要用幾步
要把大象裝冰箱,只需要三步。但想打開百度確需要n多步,本文討論一下詳細的步驟和其中牽扯的技術。
1、突破內網
PC在開機時就通過DHCP獲取到了IP地址和DNS地址,並通過ARP獲取到網關的MAC地址,以太網的二層網絡中通信需要對端的MAC地址。
通過NAT將內網地址轉換為公網地址。
路由器通過PPPoE撥號認證。
1.1 DHCP詳細流程:
查看/釋放/重獲取ip地址
ipconfig /all
ipconfig /release
ipconfig /renew
DHCP是應用層協議,客戶端使用UDP68端口,服務端使用67端口。
1.1.1 DHCP discover
PC發出DHCP Discover廣播報文
向整個廣播域內廣播請求DHCP服務器(這裏就是家庭路由器)的地址回復
1.1.2 DHCP Offer單播報文
DHCP服務器收到Discover數據包時,從地址池中獲取一個地址,給客戶端單播回復一個包含此地址的回復
1.1.3 DHCP Request廣播報文
客戶端接收到此地址後,向整個內網廣播,告訴所有DHCP服務器自己已經做出選擇,接受了某個DHCP服務器的租約。但目前還無法使用。
1.1.4 DHCP ACK單播報文
服務器接收到ACK時,向客戶端回復確認,此時客戶端就可以快樂的上網了。
1.2 ARP 的作用
在內網的二層環境下,需要使用MAC地址進行轉發,所以需要PC和路由器都需要使用ARP將對端設備的MAC地址記錄在本地的ARP表
查看/清空arp緩存
arp -a
arp –d
1.2.1 PC廣播ARP廣播報文查詢網關的MAC
1.2.2 網關單播ARP報文回復
1.3 NAT地址轉換
訪問公網需要使用公網地址,但由於IPV4地址數量緊張,運營商只會給每戶分配一個地址,想要內網中復數臺終端上網就需要通過NAT技術將私網地址轉換為公網地址。
這裏使用的是端口復用模式。私網地址通過NAT轉換為公網地址加上端口號的模式。
2、公網遨遊
通過路由器後進入接入網的範圍,這裏數據包封裝為PPPoE+QinQ模式。在BAS設備處終結。
進入傳輸網後,通過各種路由協議路由到百度的數據中心。
獲取了百度的IP地址後,數據包就可以路由到百度的數據中心了。
查詢經過訪問路徑
tracert -d www.baidu.com
3、找到百度真身
雖然我們有了到達百度數據中心的能力,但是不知道百度的IP地址也沒用,通過DNS獲取到百度的IP地址。
DNS是應用層協議,同時使用TCP和UDP的53端口傳輸數據。
3.1 DNS的詳細過程:
由於我們的DNS服務器地址是網關地址,所以DNS的叠代查詢由路由器和其余DNS服務器交流。
3.1.1 獲取百度的權威服務器地址
查看dns查詢過程,查詢到權威dns
dig www.baidu.com +trace
其實這些都是路由器幫我們完成的工作,但使用此命令也可以看到
這裏按照.,com.,baidu.com.的順序查找DNS服務器,這裏的回復結果全部都是各種NS記錄,最終回復百度的權威DNS服務器的A記錄和NS記錄還有CNAME記錄。
我們可以看到百度有5臺DNS服務器,系統最終會選擇最早的回復。
3.2 查詢百度的權威服務器
獲取百度的IP地址,也就是A記錄,這個由PC來完成,並記錄到本地的DNS緩存中。
查看/清空dns緩存
ipconfig /displaydns
ipconfig /flushdns
這裏可以看到百度的CNAME,也就是別名。還有a記錄,也就IP地址了
4、打開網站
通過各種設備,anti-DDOS,鏈路負載,防火墻,服務器負載,WAF,服務器
Web服務器:Nginx,Apache,IIS
後端:各種中間件,後端程序
和web服務器進行TCP連接TCP三次握手
http get請求
http response (HTML,CSS,JS)
和web服務器TCP四次揮手
瀏覽器渲染
4.1 HTTP交互數據的詳細流程
這裏是POST方法獲取目標站點資源的流程(由於百度現在都是HTTPS鏈接了,就用個別的吧,原理是一樣的)。
143-145號包是TCP三次握手的包,三次握手用來建立TCP連接
146是瀏覽器發送HTTP POST請求的包
147是Web服務器收到146號包回復的確認包,在TCP數據傳輸中,收到數據包就會回復對方一個ACK包表示確認收到
148是Web服務器回復POST請求的回復包,HTTP狀態碼為200,表示正常回復
149-153號包是TCP四次揮手的包,四次揮手用來結束TCP連接,其中149包含了對148的ACK
至此完成了一次完成的請求過程
4.2 數據中心裏的亂七八糟的設備
數據包在進入百度的數據中心後還要經過N多設備的洗禮,經過各種拆包封包後才會給到Web服務器
簡單的拓撲是這樣,實際中比這個還要復雜些
一般第一個設備就是anti-DDos設備,專門用來防禦DDos攻擊,當發現數據流的攻擊特征後采用路由註入的方式將DDos的數據引入黑洞路由中
鏈路負載,負責依據客戶端的源地址從相應的運營商鏈路中送回去
防火墻,五元組,會話的方式保護內部,主要監測下四層,限制不受歡迎的IP進入,同時做目的NAT,將內部的真實地址隱藏起來
SSL卸載,將HTTPS包解密為普通的HTTP數據包
服務器負載,引據各種算法,將數據包引流到最健壯的服務器上
IDS,即入侵檢測,旁路在交換機上,檢查數據包的特征指紋,判斷其是否是攻擊包,主要監測上三層
交換機,純轉發
WAF,在應用層面上保護web應用,防禦針對web應用的攻擊,防止SQL註入,框架攻擊等等
4.3 服務器裏面發生了什麽
總算進到了服務器裏面,外面硬件設備的工作暫告一段落,各種軟件的工作才剛剛開始
4.3.1 Web服務器
Web服務器為每一個到來的HTTP請求開一個新的線程,來進行並發的處理
Web服務器只負責處理HTTP協議,只能發送靜態頁面的內容。而JSP,ASP,
PHP等動態內容需要通過CGI、FastCGI、ISAPI等接口交給各種後端程序去處理。
4.3.2 後端程序
後端程序負責處理各種邏輯,然後生成HTML文件,然後交還給Web服務器,最後再由Web服務器帶上靜態內容(如圖片,css,js等)返回給客戶端,有些數據還需要去數據庫中進行操作
4.3.3 數據庫
需要長期保存的數據都要保存在數據庫中,在需要時由後端程序向數據庫進行各種增刪改查的操作,數據庫將結果返回給後端程序
4.4.4 緩存
對於某些經常被訪問的資源,每次都查詢數據庫,後端處理就很麻煩了,可以將其存入緩存中,下次再請求相同的資源就可以由Web服務器直接調用緩存中的靜態資源返回給客戶端
4.5 瀏覽器渲染
其實Web服務器返回給我們的是一堆代碼和地址
是由HTML,JS,CSS和文字圖片之類的構成的
右鍵查看源代碼,這個才是我們實際收到的東西,最後由瀏覽器渲染成了我們看到的樣子
5、總結
可以看出來簡單的訪問一個百度,中間經歷了這麽多的步驟,算上中間的每一跳轉發設備,幾百步總是有了,然而這麽多的步驟(由於本人的水平有限,中間應該還省略了很多步驟),最終經歷不過1秒鐘
打開百度要用幾步