我們寫的解決我們實際問題的網絡程序都是在應用層。
今天我們詳細來了解一下應用層的HTTP協議。
協議就是一種約定,socket apide 接口,在讀寫數據時,都是按字符串的方式來發送接收的。如果我們要傳輸一些結構化的數據怎麼辦呢?
我們可以約定:
定義一個結構體來標識我們需要交互的信息,發送數據時將這個結構體按照一個規則轉換成字符串,接收到數據的時候再按照相同的規則把字符串轉化爲結構體。
這個過程叫做“序列化”和“反序列化”。
當然了,我們也可以有其他的約定方案並且按照約定執行,只要能夠保證,一端發送時構造的數據在另一端能夠正確的進行解析,這就是可行的,這種約定就是應用層協議。
HTTP協議:超文本傳輸協議
首先我們需要認識一下URL:平時我們所說的網址就是URL
urlencode和urldecode
像 /?:等這樣的字符,已經被url當做特殊意義理解了,因此這些字符不能隨意出現。比如某個參數中需要帶有這些特殊字符,就必須先對特殊字符進行轉義。
轉義規則:將需要轉碼的字符轉爲16進制,然後從右到左取4位(不足4爲的直接處理),每兩位做一次前面加上%,編碼成%XY格式。
就比如我們搜索C++時,發現這裏的+就被轉義成%2B。
urldecode就是urlencode的逆過程。
HTTP協議格式
HTTP請求
http的請求方法:
方法 | 說明 | 支持的HTTP協議版本 |
---|---|---|
GET(最常用) | 獲取資源 | 1.0、1.1 |
POST(最常用) | 傳輸實體文件 | 1.0、1.1 |
PUT | 傳輸文件 | 1.0、1.1 |
HEAD | 獲得報文首部 | 1.0、1.1 |
DELETE | 刪除文件 | 1.0、1.1 |
OPTIONS | 詢問支持的方法 | 1.1 |
TRACE | 追蹤路徑 | 1.1 |
CONNECT | 要求用隧道協議連接代理 | 1.1 |
LINK | 建立和資源之間的聯繫 | 1.0 |
UNLINE | 斷開連接關係 | 1.0 |
請求報頭(Header):請求的屬性,爲一對冒號分割的鍵值對,屬性與屬性之間用\n分割;如果遇到空行表示Header部分結束。
請求正文(Body):空行後面的內容都是正文部分,允許爲空字符串。一旦正文存在,則Header中的Content-Length實行用來表示Body的長度。
HTTP響應
響應行:版本號+空格+狀態碼+空格+狀態碼解釋
響應報頭(Header):請求的屬性,冒號分割的鍵值對,每組屬性之間使用\n分割;遇到空行表示Header部分結束
響應正文(Body):空行後面的內容都是Body,允許爲空字符串,如果Body存在則在Header中會有一個Content-Length屬性來標識Body的長度;如果服務器返回了一個HTML頁面,那麼頁面內容就是在Body中。
http的狀態碼:HTTP狀態碼查詢大全
/ | 類別 | 原因短語 |
---|---|---|
1XX | informational(信息性狀態碼) | 接受的請求正在處理 |
2XX | Success(成功狀態碼) | 請求正常處理完畢 |
3XX | Redirection(重定向狀態碼) | 需要進行附加操作以完成請求 |
4XX | Client Error(客戶端錯誤狀態碼) | 服務器無法處理請求 |
5XX | Server Error(服務器錯誤狀態碼) | 服務器處理請求出錯 |
常見的狀態碼:200(OK),404(Not Found)403(Forbidden),302(Redirect重定向),504(Bad Gateway)。
HTTP的Header常見屬性:
1、Content-Type:數據類型(text/HTML等)
2:、Content-Length:Body的長度
3、Host:客戶端告知服務器,所請求的資源是在那個主機的那個端口上
4:、User-Agent:聲明用戶的操作系統和瀏覽器版本信息
5、referer:當前頁面是從那個頁面跳轉過來的
6、location:搭配3XX狀態碼使用,告訴客戶端接下來要去哪裏訪問
7、Connection屬性:該屬性有兩種取值(close和keep-alive),keep-alive也就是長鏈接,所謂的長連接就是一次鏈接好了就長時間保持不斷開,要知道http是基於tcp實現的,而tcp獲得一個鏈接就要經過3次握手,而斷開更是要經過4次揮手,如果我們獲得一個鏈接完成了一件事情以後就斷開鏈接想要再完成別的事情時就需要再次獲得鏈接,試想如果需要完成的事情有很多很多,那麼就會有很多的時間花費在鏈接的連接和斷開上,這樣的話性能就會大大的降低。因此使用長鏈接在很多情況下能夠重用連接,減少資源消耗,縮短響應時間,從而提高性能。
8、Cokie:保存在用戶瀏覽器端的一個本地文件,用來存儲用戶信息從而標識一個用戶,例如保存用戶的賬號和密碼,會話ID等信息。瀏覽器接收了cookie以後,這個cookie和對遠端Web服務器的連續請求將一起被瀏覽器發送給服務器。