HTTP是什么
HTTP是HyperText Transfer Protocol的縮寫,中文就是超文本傳輸協議,所謂的超,是個學術用語,是基于某種事物增加了更多的信息維度,比如超像素xxx之類的.
協議是什么,協議說白了就是約定,約定就是模板,就是表格,就和你去銀行辦手續一樣,客戶不知道要提供什么信息,銀行又不能一個客戶一個客戶教,所以就準備一樣表格.
HTTP的腦洞(無事實根據)
為什么會有HTTP叫做報文呢,因為我覺得以前最早大家都是通過電報機來遠程快速傳遞信息.由于每個字都老貴了,所以能簡短就簡短.就有了報文這個東西,一般包含以下信息
發件人
收件人
干什么
所以說到了現在都超文本這么吊的東西了,說白了還是和電報一樣,滴滴滴,你發給服務器一個電報,服務器看看,然后滴滴滴,回給你一個電報.這就是所謂的超文本傳輸協議.
但是吊就吊在這個超字上,現在電腦便宜了,大街上一百塊一臺,所以說可以發更多的信息了,所謂更多的信息,就是除了文本本身的內容外,還可以攜帶一些網絡參數以及約定的信息等,是指的信息維度的增加(除去內容還有其它維度),而不是文本內容變長了.
所以說HTTP通信,本質上和以前的電報還是沒有什么區別的,唉,人類真是聰明又愚蠢啊.
HTTP報文格式
就像剛剛說的,一張白紙,怎么寫才能讓兩邊指導什么寫的是什么呢?就牽扯到格式了,這種格式約定就是協議.HTTP其實就是一張這樣的表單
HTTP報文頭
就如同剛剛腦洞中以電報舉例一樣,HTTP的報頭主要是一些參數信息,類似于
發件人
收件人
并不包含實際文本內容
HTTP報文頭首行有3個數據,來分辨這個是Request報文還是Response報文,接下來每行是一個字段和一個內容,這些字段都是W3C規定好的,你當然可以自定義,但是只不過通用標準不認罷了.所以說字段相當于表格中
姓名: some SB
里的姓名,”some SB”這個內容可能會變,但是不管怎么發報文,姓名這一欄不會變.
HTTP報文體
HTTP報文體是開始于HTTP報文頭遇到一個僅有換行的空行開始,這也是為什么會有CRLF換行符注入這種攻擊,因為報文都是通過換行符來判斷哪里是內容開始,報文頭結束.可以通過換行符的注入,當報文頭提前結束,進入報文體.
HTTP的Request和Response
就像剛剛說的一樣,雖然HTTP都是基于報文,但是你發給服務器的電報和服務器返回給你的電報是不同的,他們的主要區別在于兩點
報文頭的字段
報文體是否可以省略
在Request中報文體并不是必須的,有些Request方法中可以省略,而Response中是不可以省略的,如果報文體因為各種情況沒有了,那么就是空返回.
HTTP報文頭的字段
通用字段Connection
Content-Encoding
Content-Length
Content-Type
Transfer-Encoding
請求Request字段Accept
Accept-Encoding
Authorization
Cookie
Host
If-Modified-Since
If-None-Match
Origin
Referer
User-Agent
響應Response字段Access-Control-Allow-Origin
Cache-Control
ETag
Expires
Location
Pragma
Server
Set-Cookie
WWW-Authenticate
X-Frame-Options
HTTP的Request方法
HTTP一共有六種Request方法,其中最重要的是GET和POST方法,除了這兩個外還有剩下四種,但是不太常用.
HEAD
TRACE
OPTIONS
PUT
雖然不太常用,并不是不用注意
比如有根據TRACE的機制進行攻擊的方法.TRACE方法主要用于診斷,服務器會返回Request里所有的報文頭誒報文內容信息,所以在某下情況下,如果本地無法獲取到Request的報文頭,可以通過偽造鏈接,使用TRACE方法從返回報文里都出來Request中的信息.