在tcp/ip的模型圖中 , 讀者可以看到 , http協議位於最上層的應用層 , 它是網際網路上應用最為廣泛的一種網路協議 , 所有 www 檔案都必須遵守這個協議 .
http 是乙個由請求和響應組成的 , 標準的客戶端/服務端模型(b/s結構) . http 協議永遠是由客戶端發起請求 , 服務端給與響應 , 如下圖所示 .
http 是一種無狀態協議 . 無狀態是指客戶端和服務端之間不需要建立持久的連線 , 客戶端發起乙個請求 , 伺服器端返回響應 , 這個連線就會被關閉 , 在伺服器端不會保留該請求的有關資訊 .
http的工作流程如下 :
1 . 位址解析
http協議是通過標準url來請求指定的伺服器中指定服務的 . 乙個標的 url 如下 :
下面來解析一下 url , 看看這些組成都是做什麼的 :
(1) http: 協議型別 . 這裡指的是要傳送的是什麼協議,還可以是ftp等其他協議 . 而這裡請求的是伺服器中的網頁,所以使用的是常見的http協議 .
(2) www.baidu.com:主機名 . 通過主機名,可以準確定位到要訪問的那台伺服器 . 而在前面說的網路通訊中,ip是可以唯一表示伺服器位址的,但ip煩瑣複雜,很難記憶,所以人們就想了個辦法,通過熟悉的英文、數字等來表示一台伺服器的位址,稱為網域名稱。這樣就需要乙個檔案(作為乙個資料倉儲)把ip和網域名稱一一對應起來 . 在很早的時候,我們確實是這麼做的,不過隨著ip越來越多,檔案也變得越來越大,不堪負重 . 於是人們就想到了把這些一一對應的關係都放到一台統一的伺服器上,這台伺服器被稱為dns網域名稱解析系統,它會把網域名稱解析成對應的ip .
(3) 80:埠號 . 使用者已經可以通過網域名稱或者ip訪問到一台伺服器了,但是一台伺服器裡有那麼多的服務和應用,怎樣才能準確找到使用者需要訪問的那個服務或應用呢?在伺服器中,每個服務和應用都會開啟乙個程序,都會有乙個程序號(pid),如果對外提供服務,則還會有乙個唯一的埠號,這讓外部應用可以直接通過這個埠號訪問到指定的服務和應用。埠號的範圍是0~65 535,一些常用的服務和應用都有預設的埠號,一般不能輕易更改,比如web伺服器的80埠、遠端連線ssh服務的22埠、資料庫mysql的3306埠等等。因為80埠是web伺服器的預設埠,所以在寫http請求的url的時候,80埠一般是省略的 .
(4) index.html:請求的檔名 . 使用者通過網域名稱和埠號已經能訪問到web伺服器了,接下來就可以通過檔名來訪問指定的檔案了 . web伺服器一般都做好了路由,不同的路由所提供的訪問檔案的形式可能不一樣,但核心都是一樣的 .
(5) ?name=tom&age=18:請求引數 . 即使同乙個網頁,可能針對不同的使用者,伺服器要返回給客戶端的資訊也是不一樣的 . 而伺服器就是通過url中「?」後面攜帶的引數不同來響應不同的使用者或者同乙個使用者的不同請求的 .
2 . 封裝http 請求
這一步把上面寫的 url 以及本機的一些資訊封裝成乙個 http 請求資料報
3 . 封裝 tcp 包
第三步就是封裝 tcp 包 , 建立 tcp 連線 , 也就是常說的"三次握手" . 由於http位於最上層的應用層 , 所以http在工作之前要由 tcp 和 ip 協議建立網路連線 , 這就是tcp/ip協議族 , 因此網際網路又稱為 tcp/ip 網路 .
這裡就少tcp/ip協議的"三次握手" , 首先由客戶端傳送建立連線的請求 , 客戶端傳送乙個 syn 包 , 等待服務端的響應 ; 服務端收到 syn 包之後 , 返回給客戶端乙個表示確認的 syn 包 和 ack 包 , 最後客戶端收到之後向服務端傳送 ack 包 , 傳送完之後開始建立連線 , 如下圖所示
tcp/ip三次握手
4 . 客戶端傳送請求命令
第四步就是在連線建立之後 , 客戶端傳送 http 請求到服務端與請求相關的資訊都會包含在請求頭和請求體中傳送給伺服器端 .
5 . 伺服器端響應
伺服器端在收到請求之後 , 根據客戶端的請求傳送給客戶端相應的資訊 , 相關的響應資訊都會放在響應頭和響應體中 .
6.關閉連線
伺服器端在傳送完響應之後 , 就會關閉連線 , 如果過客戶端的請求的頭部資訊中有 connection-alive , 那麼客戶端在響應完這個請求之後不會關閉連線 , 知道客戶端的所有請求都響應完畢 , 才會關閉連線 , 這樣大大節省了頻寬和 io 資源 .
請求和響應
http請求室友兩部分組成 : http訊息頭和 http訊息體 . 訊息頭告訴伺服器該請求是做什麼的 , 訊息體高速伺服器怎麼做 , 比如訪問乙個網頁 , 頭部資訊可以到瀏覽器中的除錯中心看 , 而訊息體需要使用者單機滑鼠右鍵檢視原始碼 , 那些html**就是伺服器返回給客戶端的訊息體 .
http的請求頭由三部分組成 : 請求行 , 請求頭和請求正文, 如下圖 :
請求行請求的第一行是請求行 , 裡面有請求方法 , url , 協議版本等 , 比如上圖中 , 請求的方法是 get , 請求的url是/ , 協議版本是http/1.1 .
常見的請求方式有get 和 post , get 方式主要用於請求網路資源 , post 方式主要用於表單提交 , 由於get方式的引數是在位址列中的 , 所以總是可見的 , 不是很安全 , 而且長度也有限制 (2048個字元) , 而 post 方式的引數是封裝成實體之後傳送給伺服器的 , 是不可見的 , 相對比較安全 , 使用者的敏感資訊一般採用post 方式提交 .
請求頭每個頭域都由乙個頭網域名稱 , 冒號和值域組成 , 下面介紹一些最常見的頭域 :
(1) connection : 表示是否需要持久連線 , 如果伺服器看到它的值為 keep-alive , 或者請求協議使用的是http/1.1(預設使用持久連線) , 同乙個頁面如果包含多個資源 , 則只會使用乙個連線 , 如connection : keep-alive . 如果設定了 connetion:close , 則每乙個請求結束都會關閉連線 , 新的請求又會重新建立連線 , 乙個網頁至少有幾十個資源請求 , 這樣會浪費頻寬和時間 .
(2) host : 這個是必需的 , 表示請求的伺服器位址是什麼 , 是從url 中提取出來的 . 比如 的host 就是 www.baidu.com , 這裡是80埠 , 預設省略 ; 如果是其他埠 , 比如 , 則host是 www.baidu.com:8080 .
(3) accept : 瀏覽器可以接受的**型別(mime) , 如 accept:text/html 代表可以接受html文件 , " * "代表接受任何型別 , 如 accept:/ .
(4) accept-encoding : 瀏覽器申明自己接受的編碼方法 , 通常指定壓縮方法 , 是否支援壓縮 , 支援什麼格式的壓縮 .
請求正文
也叫請求資料 , 在使用post請求表單資料的時候 , 這些表單資料就會被放在 http 請求的請求正文中 , 以加密的形式向伺服器傳輸 .
http協議的三次握手過程
這個結合上面的發信和收信,能夠很好理解這個三次握手過程。這個問題,面試過程經常被問到,所以,平時自己還是需要準備一下,用自己能夠理解的語句去描述三次握手過程。
http協議工作過程
協議名 https 主機名 www.baidu.com 伺服器名www 網域名稱baidu.com 埠 443 根目錄 1 網域名稱解析 通過dns把網域名稱解析成ip位址 並且從url中找出埠號 沒有,則預設http預設為80,https為403 2 建立連線 根據得到的ip和埠,建立socket...
DHCP協議工作過程
複習一下 dhcp協議工作過程 動態主機配置協議,客戶端udp埠為68,伺服器的udp埠為67。1 發現階段 客戶端以廣播方式傳送dhcp discovery報文來尋找dhcp伺服器。即向255.255.255.255傳送廣播資訊,網路中每一台tcp ip協議主機都會接收到該報文,但只有dhcp伺服...
HTTP工作過程與原理
工作過程 協議定義 web客戶端如何從 web伺服器請求 web頁面,以及伺服器如何把 web頁面傳送給客戶端。協議採用了請求 響應模型。客戶端向伺服器傳送乙個請求報文,請求報文包含請求的方法 url 協議版本 請求頭部和請求資料。伺服器以乙個狀態行作為響應,響應的內容包括協議的版本 成功或者錯誤 ...