HTTP協議在規範文檔裏詳細定義了報文的格式,規定了組成部分,解析規則,還有處理策略,所以可以在 TCP/IP層之上實現更靈活豐富的功能,例如連接控制,緩存管理、數據編碼、內容協商等等。
拿TCP報文來舉例,它在實際要傳輸的數據之前附加了壹個20字節 的頭部數據,存儲TCP協議必須的額外信息,例如發送方的端口號、接收方的端口號、包序號、標誌位等等。有了這個附加的TCP頭,數據包才能夠正確傳輸,到了目的地後把頭部去掉,就可以拿到真正的數據。
HTTP協議也是與TCP/UDP類似,同樣也需要在實際傳輸的數據前附加壹些頭數據,不過與TCP/UDP不同的 是,它是壹個“ 純文本 ”的協議,所以頭數據都是ASCII碼的文本.
HTTP協議的請求報文和響應報文的結構基本相同,由三大部分組成:
這其中前兩部分起始行和頭部字段經常又合稱為“ 請求頭 ”或“ 響應頭 ”,消息正文又稱為“實體”,但與“header”對應,很多時候就直接稱為“ body ”。
HTTP協議規定報文 必須有header ,但可以 沒有body ,而且在header之後必須要有壹個“空行”,也就 是“ CRLF ”,十六機制的“0D0A”。
了解了HTTP報文的基本結構後,我們來看看請求報文裏的起始行也就是請求行(request line),它簡要地描述了客戶端想要如何操作服務器端的資源。
請求行由三部分構成:
這三個部分通常使用空格(space)來分隔,最後要用CRLF換行表示結束。
看完了請求行,我們再看響應報文裏的起始行,在這裏它不叫“響應行”,而是叫“狀態行”(status line),意思是服務器響應的狀態。
比起請求行來說,狀態行要簡單壹些,同樣也是由三部分構成:
請求行或狀態行再加上頭部字段集合就構成了HTTP報文裏完整的請求頭或響應頭
頭部字段是key-value的形式,key和value之間用“:”分隔,最後用CRLF換行表示字段結束。比如在“Host: 127.0.0.1”這壹行裏key就是“Host”,value就是“127.0.0.1”。HTTP頭字段非常靈活,不僅可以使用標準裏的Host、Connection等已有頭, 也可以任意添加自定義頭 ,這 就給HTTP協議帶來了無限的擴展可能。