一、HTTP 是一種超文本傳輸協議,全名hypertext transfer protocol,從字面意思上可以看出該協議用於規定客戶端與服務端之間的傳輸規則,
傳輸的內容不限於文本(任意類型的數據)。
二、HTTp請求與響應的內容
1、可以用火狐瀏覽器安裝一個插件可以看到你的http請求的全部內容{
-請求 :請求行, -響應:狀態行、
請求頭(headerField), 響應頭、
請求體(body), 實體內容,
}
現在逐個解釋下
*請求行{
請求方法(POST/GET/HEAD/PUT...)
請求統一資源標識符(url,除去host剩下的部分,請求資源在服務器本地上的路徑)
HTTP版本號,目前主流的版本1.1,最新的2.0
}
*請求頭{
HTTP請求在iOS中用NSURLRequest與NSMutableRequest表示;HTTP響應用NSHTTPURLResponse表示。
-
Host: 目標服務器的網絡地址
-
Accept: 讓服務端知道客戶端所能接收的數據類型,如text/html */*
-
Content-Type: body中的數據類型,如application/json; charset=UTF-8
-
Accept-Language: 客戶端的語言環境,如zh-cn
-
Accept-Encoding: 客戶端支持的數據壓縮格式,如gzip
-
User-Agent: 客戶端的軟件環境,我們可以更改該字段為自己客戶端的名字,比如QQ music v1.11,比如瀏覽器Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Maxthon/4.5.2
-
Connection: keep-alive,該字段是從HTTP 1.1才開始有的,用來告訴服務端這是一個持久連接,“請服務端不要在發出響應后立即斷開TCP連接”。關於該字段的更多解釋將在后面的HTTP版本簡介中展開。
-
Content-Length: body的長度,如果body為空則該字段值為0。該字段一般在POST請求中才會有。
- Cookie:記錄着用戶信息的保存在本地的用戶數據,如果有會被自動附上
這里強調下在iOS中當你發送一個任意請求時,不管你做不做,NSURLRequest都會自動幫你記錄你所訪問的URL上設置的cookie。 iOS中用NSHTTPCooikeStrorage表示,是一個單利。
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (NSHTTPCookie *cookie in [cookieJar cookies]) { NSLog(@"%@", cookie); }
}
*請求體{
真正需要發給服務端的數據,在使用POST-multipart上傳請求中請求體就是上傳文件的二進制NSData類型數據;在GET請求中請求體為空;在普通的POST 請求中請求體就是一些表單數據。在iOS中一般用NSURLRequest與NSMutableURLRequest的HTTPBody屬性表示,添加body用
- [NSMutableURLRequest setHTTPBody:]。
}
*響應狀態{
狀太行是服務器端返回給客戶端的狀態信息,包含HTTP版本號、狀態碼、狀態嗎對應的英文。
eg、:HTTP/1.1 200 ok
這個部分需要講的是錯誤碼。事實上HTTP請求錯誤碼可以根據錯誤碼從左往右第一個數字大致分為以下幾類:
1XX:信息提示。不代表成功或者失敗,表示臨時響應,比如100表示繼續,101表示切換協議
2XX: 成功
3XX: 重定向
4XX:客戶端錯誤,很有可能是客戶端發生問題,如親切可愛的404表示未找到文件,說明你的URI是有問題的,服務器機子上該目錄是沒有該文件的;414URI 太長
5XX: 服務器錯誤,比如504網關超時
錯誤碼是不用去記的,出錯了再查對應的錯誤碼含義就行。但是知道上面的分類有助於第一時間做出大體的判斷,起碼你能清楚是服務端還是客戶端的原因。
}
*響應頭與響應實體{
跟請求部分的大致一樣,及時響應頭的field 有少許不同
}
/*********************************************fuck work***************************************/
HTTP、Socket、TCP的區別
介紹完HTTP 現在主要說標題的東西啦,上面的鋪墊還是很有用的
我們都知道HTTP 是應用層的協議,更靠近用戶端;
TCP 是傳輸層的協議;
Socket 是從傳輸層上抽象出來的一個抽象層,本質是接口。
so本質上這三個還是比較好區分的。
那么我們經常會搞不清HTTP連接、TCP連接、socket連接有什么區別
1、tcp連接與HTTP連接的區別
HTTP是基於TCP的,客戶端往服務端發送一個HTTP請求時第一步就是要建立與服務端的tcp連接,也就是先來三次握手。那么現在我們可以知道“HTTP基於TCP”
2、TCP連接與socket連接的區別
socket層只是在TCP/UDP傳輸層上的抽象接口層,因次一個socket連接可以基於TCP也可以基於UDP。UDP協議是不需要建立連接過程的,不管對方收不收到消息我都發,不可靠的傳輸(即時通訊)所以“socket也是基於TCP”
3、HTTP連接與socket連接區別
---HTTP是短連接,socket(基於tcp的)是長連接。雖然HTTP1.1支持持久連接,但是不能保證連接不斷,而socket連接一旦建立tcp,除非一端主動斷開,否則連接狀態一直保持。
---HTTP連接服務器端無法主動發消息,Socket連接雙發請求的發送沒有先后限制(隨便發)。
好了總結就到這
祝大家工作順利