一個標準的 URL 語法一般都創建在由 9 部分構成的通用格式上,瀏覽器會從用戶輸入的 URL 字符串中解析對應的內容:php
<schema>://<user>:<password>@<host>:<port>;<params>?<query>#<frag>
複製代碼
其中比較重要的有:html
若是上面提到的 host
部分爲域名,則須要經過 DNS
對其進行解析。nginx
用戶能夠在本地的 host 文件中指定域名和 IP 地址的對應關係,因此瀏覽器會先去本地的 host 文件中尋找是否存在對應的 IP 地址,若是存在,則向該地址發送請求。apache
最終,咱們經過 DNS 解析得到了主機的 IP 地址瀏覽器
三次握手的過程是老生常談了,資料比較多,這裏就不具體贅述了,只列出大體過程:緩存
SYN
報文,請求創建鏈接ACK
報文和 SYN
報文,表示贊成客戶端的創建鏈接請求,同時本身也請求創建鏈接ACK
報文,表示請求已收到在以太網中,一臺主機要把數據幀發送到同一局域網上的另外一臺主機時,設備驅動程序必須知道以太網地址才能發送數據。而咱們只知道IP地址,這時就須要採用 ARP 協議將 IP 地址映射爲以太網地址。 在發送第一個 SYN 報文時,IP 層會經過 ARP 協議查詢出目標主機的 MAC 地址。 (TCP/IP協議——ARP詳解)bash
在第一次握手時發送的第一個 SYN
報文首先會經過 connect()
函數到達 IP 層,以後 IP 層會經過查詢路由表獲取目標主機的 MAC 地址並將其緩存,而後該 MAC 地址會被經過 send()
函數交給網絡接口進行封裝,最終將數據發送出去。
PS:引用資料的文章很是詳細的解釋了不一樣狀況下該過程的工做細節,建議認真閱讀一遍。服務器
若是請求使用的是 HTTPS
協議,則在創建 TCP 鏈接後,須要經過四次握手在其之上再創建一條加密隧道,即 SSL
。網絡
client random
)並傳輸給服務端數字證書
server random
)並傳輸給客戶端數字證書
premaster secret
),使用公鑰對其進行加密後傳輸給服務端client random
、server random
、premaster secret
生成 會話密鑰(session key
)premaster secret
client random
、server random
、premaster secret
生成 會話密鑰(session key
)四次握手經過非對稱加密的方式使客戶端和服務端得到並持有相同的 session key
,並經過該 key 值對以後的會話過程進行對稱加密。session
瀏覽器使用前兩步得到的信息構造請求報文
,並經過第三步創建起來的 TCP 鏈接向服務端發送 HTTP 請求。 其中,請求報文
的基本格式爲:
<method><request-URL><version>
<headers>
<entity-body>
複製代碼
這三部分分別爲起始行、首部和主體,經過瀏覽器請求發起的默認爲 GET
請求,因此沒有主體部分。
下面展現了一個假想的 HTTP 報文,其中第一行爲起始行,二三行爲首部:
GET /index.html HTTP/1.1
Accept: text/html
Host: www.foo.com
複製代碼
服務端代理即爲 nginx
、apache
等服務器軟件,它們會根據配置文件將請求映射爲服務器上具體的文件,並根據文件類型對其進行處理返回。
若是文件是類型爲 .html
、 .txt
、.xml
的靜態文件,則只需將其內容做爲響應的 entity-body
直接返回給客戶端。
若是文件類型爲 .php
、.jsp
、.asp
等動態文件,則須要對其進行解析。這裏咱們只講解對 .php
文件的操做,以 nginx
服務器爲例。
Fast-CGI
模塊,構造 Fast-CGI 請求PHP-FPM
發送 Fast-CGI 請求,此時 nginx 至關於一個反向代理服務器master 進程
收到請求worker 進程
PHP-CGI
解釋器對 PHP 文件進行解析,返回結果並生成對 nginx 的響應nginx 生成響應報文,返回給客戶端。響應報文和請求報文只有起始行的語法有所不一樣:
<version><status><reason-phrase>
<headers>
<entity-body>
複製代碼
老生常談喜聞樂見的四次揮手環節,由於相關資料實在是太多了,這裏也不具體贅述了,只列出大體過程:
FIN
報文,表示本身的全部數據已傳輸完畢ACK
報文,表示請求已收到FIN
報文,表示本身的全部數據也都已經傳輸完畢ACK
報文,表示請求已收到,並進入 TIME_WAIT
狀態瀏覽器會解析返回的 HTML / CSS / JS 等文件,並最終將頁面展示在用戶面前。