瀏覽器
- 用戶在瀏覽器中輸入 URL 網(wǎng)址
- 瀏覽器解析用戶輸入的 URL 地址 => 域名 + 端口
- 瀏覽器會先檢查本地緩存中有沒有這個域名 => IP
- 如果有, 則直接使用IP進行訪問
- 如果沒有, 則瀏覽器發(fā)起一個 DNS 系統(tǒng)調(diào)用(操作系統(tǒng)進行查找)
- 操作系統(tǒng)檢查自己的緩存里有沒有這個域名
- 沒有的話找系統(tǒng)的 hosts 文件中有沒有這個域名
- 如果都沒有找到, 會對 DNS 服務(wù)器發(fā)起一個系統(tǒng)調(diào)用
- 瀏覽器通過一個本機的隨機端口建立一個與服務(wù)器指定端口(80)之間的連接通道
- 瀏覽器會將客戶端的一些信息打上一個“包”, 將這個“包”通過這個連接通道發(fā)送到服務(wù)端
- 打開服務(wù)端返回過來的“包”, 找到 Content-type, 決定如何處理響應(yīng)的內(nèi)容
- 如果是 HTML 則渲染到界面上
- “包”的概念是請求報文
注: 谷歌使用 chrome://net-intermals 查看瀏覽器緩存
服務(wù)器
- 打開客戶端提交過來的“包”, 拿到“包”里面的請求路徑
- 根據(jù)請求的路徑對應(yīng)文件擴展名找到文件的類型(MIME Type)
- 判斷文件類型是否為靜態(tài)文件
- 如果是靜態(tài)文件, 則直接讀取這個文件的內(nèi)容
- 如果不是靜態(tài)文件, 則交給“外包公司”執(zhí)行代碼
- 服務(wù)端拿到執(zhí)行的結(jié)果, 把要發(fā)給客戶端的數(shù)據(jù)打上一個“包”
- 將這個“包”再通過之前的連接通道發(fā)給客戶端
請求報文

image
響應(yīng)報文

image
可以利用 PHP 對響應(yīng)頭進行一些配置
<?php
// php 中 header 函數(shù)專門用于設(shè)置響應(yīng)頭, 不能設(shè)置兩個相同的, 會被覆蓋
// 設(shè)置響應(yīng)類型
header('Content-type: text/css');
// 設(shè)置跳轉(zhuǎn)(重定向)頁面
header('location: xxx.php');
// 讓文件下載
header('Content-type: application/octet-stream');
// 設(shè)置默認下載文件名
header('Content-Disposition: attachment; filename=demo.txt');
// 設(shè)置cookie
header('Set-Cookie: key=value');
?>