HTTP協(xié)議 超文本傳輸協(xié)議 由萬維網(wǎng)制定(w3c)
是瀏覽器與服務(wù)器通訊的應(yīng)用層協(xié)議,規(guī)定了瀏覽器與服務(wù)器之間的交互規(guī)則以及交互數(shù)據(jù)的格式信息等。
報文
HTTP協(xié)議對于客戶端與服務(wù)端之間的交互規(guī)則有以下定義:
要求瀏覽器與服務(wù)端之間必須遵循一問一答的規(guī)則,即:瀏覽器與服務(wù)端建立TCP連接后需要先發(fā)送一個請求(問)然后服務(wù)端接收到請求并予以處理后再發(fā)送響應(yīng)(答)。注意,服務(wù)端永遠不會主動給瀏覽器發(fā)送信息。
HTTP要求瀏覽器與服務(wù)端的傳輸層協(xié)議必須是可靠的傳輸,因此是使用TCP協(xié)議作為傳輸層協(xié)議的。
- HTTP協(xié)議對于瀏覽器與服務(wù)端之間交互的數(shù)據(jù)格式,內(nèi)容也有一定的要求。
- 瀏覽器給服務(wù)端發(fā)送的內(nèi)容稱為請求Request
- 服務(wù)端給瀏覽器發(fā)送的內(nèi)容稱為響應(yīng)Response
http協(xié)議
請求和響應(yīng)中大部分內(nèi)容都是文本信息(字符串),并且這些文本數(shù)據(jù)使用的字符集為:ISO8859-1.這是一個歐洲的字符集,里面是不支持中文的!!!。而實際上請求和響應(yīng)出現(xiàn)的字符也就是英文,數(shù)字,符號。
請求Request
請求是瀏覽器發(fā)送給服務(wù)端的內(nèi)容,HTTP協(xié)議中一個請求由三部分構(gòu)成:
分別是:請求行,消息頭,消息正文。消息正文部分可以沒有。
請求部分
1:請求行
- 請求行是一行字符串,以連續(xù)的兩個字符(回車符和換行符)作為結(jié)束這一行的標志。
- 回車符:在ASC編碼中2進制內(nèi)容對應(yīng)的整數(shù)是13.回車符通常用cr表示。
- 換行符:在ASC編碼中2進制內(nèi)容對應(yīng)的整數(shù)是10.換行符通常用lf表示。
- 回車符和換行符實際上都是不可見字符。
請求行分為三部分:
- 請求方式(SP)抽象路徑(SP)協(xié)議版本(CRLF) 注:SP是空格
- GET /myweb/index.html HTTP/1.1
- GET / HTTP/1.1
URL地址格式:
- 協(xié)議://主機地址信息/抽象路徑
- http://localhost:8088/TeduStore/index
- GET /TeduStore/index.html HTTP/1.1
2:消息頭
消息頭是瀏覽器可以給服務(wù)端發(fā)送的一些附加信息,有的用來說明瀏覽器自身內(nèi)容,有的用來告知服務(wù)端交互細節(jié),有的告知服務(wù)端消息正文詳情等。
- 消息頭由若干行組成,每行結(jié)束也是以CRLF標志。
- 每個消息頭的格式為:消息頭的名字(:SP)消息的值(CRLF)
- 消息頭部分結(jié)束是以單獨的(CRLF)標志。
//例如:
Host: localhost:8088(CRLF)
Connection: keep-alive(CRLF)
Upgrade-Insecure-Requests: 1(CRLF)
User-Agent: Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36(CRLF)
Sec-Fetch-User: ?1(CRLF)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng;q=0.8,application/signed-exchange;v=b3;q=0.9(CRLF)
Sec-Fetch-Site: none(CRLF)
Sec-Fetch-Mode: navigate(CRLF)
Accept-Encoding: gzip, deflate, br(CRLF)
Accept-Language: zh-CN,zh;q=0.9(CRLF)(CRLF)
3:消息正文
消息正文是2進制數(shù)據(jù),通常是用戶上傳的信息,比如:在頁面輸入的注冊信息,上傳的附件等內(nèi)容。
GET /myweb/index.html HTTP/1.1
Host: localhost:8088
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
1010101101001.....
HTTP響應(yīng)Response
響應(yīng)是服務(wù)端發(fā)送給客戶端的內(nèi)容。一個響應(yīng)包含三部分:狀態(tài)行,響應(yīng)頭,響應(yīng)正文
1:狀態(tài)行
狀態(tài)行是一行字符串(CRLF結(jié)尾),并且狀態(tài)行由三部分組成,格式為:
protocol(SP)statusCode(SP)statusReason(CRLF)
協(xié)議版本(SP)狀態(tài)代碼(SP)狀態(tài)描述(CRLF)
狀態(tài)代碼是一個3位數(shù)字,分為5類:
- 1xx:保留
- 2xx:成功,表示處理成功,并正常響應(yīng)
- 3xx:重定向,表示處理成功,但是需要瀏覽器進一步請求
- 4xx:客戶端錯誤,表示客戶端請求錯誤導(dǎo)致服務(wù)端無法處理
- 5xx:服務(wù)端錯誤,表示服務(wù)端處理請求過程出現(xiàn)了錯誤
具體的數(shù)字在HTTP協(xié)議手冊中有相關(guān)的定義,可參閱。
常用狀態(tài)圖
響應(yīng)頭: 響應(yīng)頭與請求中的消息頭格式一致,表示的是服務(wù)端發(fā)送給客戶端的附加信息。
響應(yīng)正文: 2進制數(shù)據(jù)部分,包含的通常是客戶端實際請求的資源內(nèi)容。
響應(yīng)的大致內(nèi)容:
HTTP/1.1 200 OK(CRLF)
Content-Type: text/html(CRLF)
Content-Length: 2546(CRLF)(CRLF)
1011101010101010101......
兩個響應(yīng)頭:
Content-Type是用來告知瀏覽器響應(yīng)正文中的內(nèi)容是什么類型的數(shù)據(jù)(圖片,頁面等等)不同的類型對應(yīng)的值是不同的,比如:
常見的媒體格式類型如下:
- text/html : HTML格式
- text/plain :純文本格式
- text/xml : XML格式
- image/gif :gif圖片格式
- image/jpeg :jpg圖片格式
- image/png:png圖片格式
以application開頭的媒體格式類型:
- application/xhtml+xml :XHTML格式
- application/xml : XML數(shù)據(jù)格式
- application/atom+xml :Atom XML聚合格式
- application/json : JSON數(shù)據(jù)格式
- application/pdf :pdf格式
- application/msword : Word文檔格式
- application/octet-stream : 二進制流數(shù)據(jù)(如常見的文件下載)
- application/x-www-form-urlencoded : <form encType=””>中默認的encType,form表單數(shù)據(jù)被編碼為key/value格式發(fā)送到服務(wù)器(表單默認的提交數(shù)據(jù)的格式)
get和post的區(qū)別
- GET提交的數(shù)據(jù)會放在URL之后,以‘?’分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的數(shù)據(jù)放在HTTP包的Body中.
- GET提交的數(shù)據(jù)大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的數(shù)據(jù)沒有限制.
- GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值。
- GET方式提交數(shù)據(jù),會帶來安全問題,比如一個登錄頁面,通過GET方式提交數(shù)據(jù)時,用戶名和密碼將出現(xiàn)在URL上,如果頁面可以被緩存或者其他人可以訪問這臺機器,就可以從歷史記錄獲得該用戶的賬號和密碼.
HTTP 與 HTTPS 區(qū)別
- HTTP 明文傳輸,數(shù)據(jù)都是未加密的,安全性較差,HTTPS(SSL+HTTP) 數(shù)據(jù)傳輸過程是加密的,安全性較好。
- 使用 HTTPS 協(xié)議需要到 CA(Certificate Authority,數(shù)字證書認證機構(gòu)) 申請證書,一般免費證書較少,因而需要一定費用。證書頒發(fā)機構(gòu)如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。
- HTTP 頁面響應(yīng)速度比 HTTPS 快,主要是因為 HTTP 使用 TCP 三次握手建立連接,客戶端和服務(wù)器需要交換 3 個包,而 HTTPS除了 TCP 的三個包,還要加上 ssl 握手需要的 9 個包,所以一共是 12 個包。
- http 和 https 使用的是完全不同的連接方式,用的端口也不一樣,前者是 80,后者是 443。
- HTTPS 其實就是建構(gòu)在 SSL/TLS 之上的 HTTP 協(xié)議,所以,要比較 HTTPS 比 HTTP 要更耗費服務(wù)器資源。
https與http
UDP協(xié)議和TCP協(xié)議都是傳輸層的協(xié)議,TCP協(xié)議提供可靠的通信傳輸,而UDP則是常常被用于讓廣播和細節(jié)控制的交給應(yīng)用的通信傳輸
tcp與udp
學(xué)習(xí)記錄,如有侵權(quán)請聯(lián)系刪除