我們想象一下,使用者輸入網址進行HTTP請求,DNS伺服器找到域名對應的IP地址,連線IP地址對應的伺服器,那麼伺服器是如何知道使用者是通過A域名還是B域名找到自己的呢?
本文旨在通過通訊協議的例子讓你更加深入瞭解HTTP以及一些小技巧,包括反向代理,HTTP報文,三次握手,DNS解析,DNS汙染/劫持,HTTPS等。需要注意的是,本文碎片化的知識點實際上涵蓋了很多方向和領域,大家可以針對自己的愛好進行有深度的涉獵。
從實際應用到理論支援,我們由”深”入”淺”,透過現象尋找本質。
反向代理解析多域名
反向代理的作用就是作為中間層來訪問內網站點,防止了直接將內容伺服器暴露給外網,起到了安全防護的作用,也同樣可以實現負載均衡、限流。
我們看一下Nginx上多域名配置的程式碼:
server
{
listen 80;
server_name A.com;
location / {
proxy_pass http://localhost:11111;
}
}
server
{
listen 80;
server_name B.com;
location / {
proxy_pass http://localhost:22222;
}
}
複製程式碼
如上程式碼所示,A/B域名分別對應主機11111/22222埠。
可以看出,反向代理Nginx可以獲取到HTTP請求中的域名。由此可以推斷出DNS解析並不是單純的將域明轉換成IP地址。那麼我們看一下HTTP報文是什麼樣子。
HTTP報文
我們開啟Chrome監控HTTP請求,可以看到下圖所示:
其中request中Host屬性在整個HTTP請求中始終存在,並且不可更改,這也就是Nginx反向代理伺服器所判斷域名的依據。
HTTP的Request和Response的全部屬性如下圖所示:
TCP三次握手
HTTP協議(應用層)是基於TCP協議(傳輸層)的,並非從屬關係。HTTP通訊同樣需要三次握手。
舉個例子:
A:請求通話。(SYN)
B:請求通話。收到。(SYN+ACK)
A:收到。(ACK)
其中SYN代表同步,ACK代表確認。三次握手本身的設計就像是一個君子協議,之所以進行三次握手而非兩次握手是為了解決網路延遲所造成的重新分組問題(可以理解為聊天過程中網路延遲導致的答非所問)。
三次握手與專案管理中的溝通模型一樣:
細細體會,現實溝通中的”傳遞資訊”,”告知收悉”,”反饋資訊”和三次握手是一樣的。
DNS解析
DNS伺服器是key-value(域名-IP地址)對應的快取伺服器,當HTTP請求中host記錄不在本地快取時,向根(root)伺服器轉移解析請求。
DNS劫持
劫持DNS伺服器,進而修改其解析結果。
DNS汙染
對DNS查詢進行入侵檢測,發現與黑名單上匹配的請求,該伺服器就偽裝成DNS伺服器,給查詢者返回虛假結果。它利用了UDP協議是無連線不可靠性。
DNS解析、CDN加速、VPN閘道器,這些通訊層的東西面涉及到很多知識,我就不過多闡述了。我只說一點,大多數成熟的黑客技術都是基於網際網路協議的。
HTTP與HTTPS
HTTPS中的s代表secure,也可以理解為HTTPS = HTTP + SSL
。
HTTP預設80埠,HTTPS預設443埠。同時,HTTPS對傳輸的資料進行加密。
更直觀的感受是,訪問HTTPS站點需要確認伺服器的公鑰和加密的證書,進而保證了資料傳輸的安全。
通訊協議層的東西比較散,我並沒有在上下文中進行較強的因果邏輯推斷,因而顯得知識點比較碎片化。通訊層的東西本身和程式設計關係不大,但這些容易被程式設計師忽略的知識,往往像是一個紐帶一樣連線程式設計概念中的各個知識體系。希望本文對你有所幫助。