我們想象一下,使用者輸入**進行http請求,dns伺服器找到網域名稱對應的ip位址,連線ip位址對應的伺服器,那麼伺服器是如何知道使用者是通過a網域名稱還是b網域名稱找到自己的呢?
本文旨在通過通訊協議的例子讓你更加深入了解http以及一些小技巧,包括反向**,http報文,三次握手,dns解析,dns汙染/劫持,https等。需要注意的是,本文碎片化的知識點實際上涵蓋了很多方向和領域,大家可以針對自己的愛好進行有深度的涉獵。
從實際應用到理論支援,我們由」深」入」淺」,透過現象尋找本質。
反向**的作用就是作為中間層來訪問內**點,防止了直接將內容伺服器暴露給外網,起到了安全防護的作用,也同樣可以實現負載均衡、限流。
我們看一下nginx上多網域名稱配置的**:
server
}server
}
如上**所示,a/b網域名稱分別對應主機11111/22222埠。
可以看出,反向**nginx可以獲取到http請求中的網域名稱。由此可以推斷出dns解析並不是單純的將域明轉換成ip位址。那麼我們看一下http報文是什麼樣子。
我們開啟chrome監控http請求,可以看到下圖所示:
其中request中host屬性在整個http請求中始終存在,並且不可更改,這也就是nginx反向**伺服器所判斷網域名稱的依據。
http的request和response的全部屬性如下圖所示:
http協議(應用層)是基於tcp協議(傳輸層)的,並非從屬關係。http通訊同樣需要三次握手。
舉個例子:
a:請求通話。(syn)b:請求通話。收到。(syn+ack)
a:收到。(ack)
其中syn代表同步,ack代表確認。三次握手本身的設計就像是乙個君子協議,之所以進行三次握手而非兩次握手是為了解決網路延遲所造成的重新分組問題(可以理解為聊天過程中網路延遲導致的答非所問)。
三次握手與專案管理中的溝通模型一樣:
細細體會,現實溝通中的」傳遞資訊」,」告知收悉」,」反饋資訊」和三次握手是一樣的。
dns伺服器是key-value(網域名稱-ip位址)對應的快取伺服器,當http請求中host記錄不在本地快取時,向根(root)伺服器轉移解析請求。
dns劫持
劫持dns伺服器,進而修改其解析結果。
dns汙染
對dns查詢進行入侵檢測,發現與黑名單上匹配的請求,該伺服器就偽裝成dns伺服器,給查詢者返回虛假結果。它利用了udp協議是無連線不可靠性。
dns解析、cdn加速、vpn閘道器,這些通訊層的東西面涉及到很多知識,我就不過多闡述了。我只說一點,大多數成熟的黑客技術都是基於網際網路協議的。
https中的s代表secure,也可以理解為
https = http + ssl
。http預設80埠,https預設443埠。同時,https對傳輸的資料進行加密。
更直觀的感受是,訪問https站點需要確認伺服器的公鑰和加密的證書,進而保證了資料傳輸的安全。
通訊協議層的東西比較散,我並沒有在上下文中進行較強的因果邏輯推斷,因而顯得知識點比較碎片化。通訊層的東西本身和程式設計關係不大,但這些容易被程式設計師忽略的知識,往往像是乙個紐帶一樣連線程式設計概念中的各個知識體系。希望本文對你有所幫助。
網域名稱解析及HTTP
超文字傳輸協議 http 正規表示式 url 統一資源定位符 www.sina.com.cn 202.60.121.55,include struct hostent gethostbyname char const name 返回主機條目資訊結構指標,失敗返回null。hostent h name...
DNS網域名稱解析基礎知識
dns domain name system,網域名稱系統 網際網路上作為網域名稱和ip位址相互對映的乙個分布式資料庫,能夠使使用者更方便的訪問網際網路,而不用去記住能夠被機器直接讀取的ip數串。通過主機名,最終得到該主機名對應的ip位址的過程叫做網域名稱解析 或主機名解析 2 cname 通常稱別...
不懂就問 網域名稱與網域名稱解析知識掃盲!
網域名稱的存在是為了方便訪問 是通過伺服器ip來標識的,你不想記住每個 的ip吧 你也記不住 於是就用乙個好記的 名稱 網域名稱 跟ip關聯起來。網域名稱就是abc.com org 這種形式,也就是說一級網域名稱。乙個abc.com根本滿足不了需求,因此我們可以通過a記錄方式,增加不限數量的二級網域...