超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最爲普遍的一種網絡協議。全部的WWW文件都必須遵照這個標準。設計HTTP最初的目的是爲了提供一種發佈和接收HTML頁面的方法。1960年美國人Ted Nelson構思了一種經過計算機處理文本信息的方法,並稱之爲超文本(hypertext),這成爲了HTTP超文本傳輸協議標準架構的發展根基。nginx
以上並不是這次文章重點,更詳細的http介紹請移步 www.baidu.comweb
Http是一種網絡協議,並且是無狀態的超文本協議,基於Tcp/Ip協議的應用層協議。面試
當用戶請求某個域名的資源,好比在瀏覽器敲入http://www.qq.com的時候,瀏覽器首先會根據輸入的域名去查詢IP地址。去哪查呢?這裏就須要引入DNS的概念,能夠把DNS看作是域名映射IP的帳簿。 當客戶端發送一個DNS請求的時候,首先本地的DNS服務器會接收到請求,會在本地先查詢緩存中有沒有當前域名和IP的映射關係,若是有則直接返回IP信息,若是沒有,則會詢問其餘DNS服務器,這裏簡單說一下網絡上DNS服務器的結構,DNS服務器在網絡上是樹狀結構的,存在一個根服務器,根服務器的子節點是一級域名服務器(好比 .com, .cn),一級域名服務器的子節點又稱爲權威(權限)DNS服務器 瀏覽器
當本地DNS服務器沒有相關查詢信息的時候會依照以上樹的順序查詢域名和IP的對應關係,查到以後會緩存到本地DNS,這個過程最終的結果就是獲取到相關域名對應的IP地址,若是客戶端輸入的是IP地址信息,則省略了以上查詢IP的過程了。緩存
訪問互聯網的任何網站本質上都是依據IP來尋址的。服務器
當一個http請求發出以後,而且獲取到了正確的服務器IP地址,這個時候就能夠創建鏈接了。有一點須要明確:http協議是基於Tcp協議的。因此第一步就須要創建Tcp鏈接,這個過程就是不少網絡文章所說的三次握手: Client:Hi,我是 Client。 Server:您好 Client,我是 Server。 Client:您好 Server...網絡
這裏是三次握手能夠以這樣的順序來表示:client的問->server的答->client的答架構
有的面試官無聊會問爲何是三次握手而不是兩次或者四次五次呢?你能夠理解,當兩我的A和B要想互相聯繫的時候,最簡單的方式就是A提問而後能收到B的回答,B提問能收到A的回答。這也是三次握手的核心。tcp
平時所說的Tcp是面向鏈接的,這裏的鏈接實際上是雙方約定必定格式來進行通訊的過程(包括髮包的順序,buffer的大小等約定),在邏輯上好像是維持了一條鏈接而已。網站
一旦Tcp鏈接創建起來,http請求就能夠組織數據發送報文了。目前http協議的版本大部分是1.1,在這個版本中有一個屬性 Keep-Alive,這個屬性標示要保持此http鏈接創建的TCP鏈接,默認是開啓的。
網絡上有文章大篇幅描述http的長鏈接信息,實際上是錯誤的說法,長鏈接是針對tcp鏈接,http鏈接打開keepalive選項只不過保持了tcp鏈接不斷開而已。
HTTP 的報文大概分爲三大部分。第一部分是請求行,第二部分是請求頭(header),第三部分是請求體(body)。這裏具體的http協議其餘概念再也不展開討論,由於內容有點多。http協議位於應用層,因此要發送的報文首先會把http協議相關的內容包含在包中,而後傳給下一層。
下一層是傳輸層,這一層主要有兩個協議:Tcp和Udp,http協議選擇的是tcp協議,tcp會有兩個端口信息,一個是源端口,一個是目標端口,好比http請求通常目標端口是80。傳輸層把端口信息封裝完畢,接着把請求包傳給網絡層。
網絡層的協議是IP協議,在這一層會把源Ip地址和目標IP地址封裝進去(目標IP就是請求的網站ip,查詢dns得到)。
操做系統知道了要發往的IP地址,會判斷這個ip是否在本地局域網內(根據子網掩碼來判斷),若是不在的話,則須要網關把這個請求發送出去(網關的ip通常是DHCP協議配置的)。操做系統怎麼獲取網關在哪呢?這個過程基本上靠的是廣播,應用的協議是ARP協議,當局域網內的全部設備接收到ARP協議的內容以後會判斷ip是否和網關ip相同,若是相同就會回覆,通過這個過程,系統找到了網關,獲取到了網關的MAC地址,並把網關的MAc地址和本機的MAc地址封裝進請求包,發給下一層MAC層,最後網卡把消息發往網關。
MAC地址主要用在同一個局域網內定位某個計算機,是在局域網內纔有效的地址
請求包到達網關,網關會根據消息的MAC地址來判斷是否和本身的mac相同,若是相同則把消息接收下來。接着會判斷消息中目標IP,若是目標IP未在本身的局域網中,則須要根據本身的路由規則把消息發送給下一個相連的網關。網關和網關之間是通訊的,至於網關怎麼計算出最優路徑這裏再也不展開。咱們以常見的家庭路由器爲例,每一個路由器的網關IP實際上是運營商給分配的,而且網絡包發送出去通常都是採用修改IP的方式(NAT)。具體步驟:
網關(路由器)之間經過路由表來決定下一個跳躍的網關地址
以上只是http請求的一個大概過程,其實每一步都很是複雜,沒有詳細展開。好比:路由協議、ip的分配 等等。
添加關注,查看更精美版本,收穫更多精彩