HTTP深入底層探究【高級篇】

1. HTTP各版本的區(qū)別

HTTP1.0

特點:默認(rèn)短鏈接,明文傳輸

HTTP1.1

特點: 默認(rèn)長連接
處理過程:支持管道通信(串行請求)今瀑,發(fā)送完一個請求程梦,不必等待另一個回來,可以繼續(xù)發(fā)送下一個
缺點:服務(wù)器按照順序響應(yīng)橘荠,如果前面的請求處理耗時屿附,后面的請求邊會延遲處理,形成隊頭阻塞

HTTP2.0

1.HPACK 算法:客戶端與服務(wù)端各維護header字段表哥童,發(fā)送的是header索引
2.頭信息幀和數(shù)據(jù)幀, 接收方不需要在對明文轉(zhuǎn)二進制挺份,可以直接解析二進制數(shù)據(jù)。
3.多路復(fù)用:數(shù)據(jù)包不再按照順序發(fā)出贮懈,一個連接可以發(fā)送多個請求和響應(yīng)
每個包叫做數(shù)據(jù)流匀泊,每個數(shù)據(jù)流都標(biāo)記著一個獨一無二的編號,其中規(guī)定客戶端發(fā)出的數(shù)據(jù)流編號為奇數(shù)朵你, 服務(wù)器發(fā)出的數(shù)據(jù)流編號為偶數(shù)
移除了 HTTP/1.1 中的串行請求各聘,不需要排隊等待,也就不會再出現(xiàn)「隊頭阻塞」問題抡医,降低了延遲躲因,大幅度提高了連接的利用率。
4.支持設(shè)置請求優(yōu)先級
5.服務(wù)器主動發(fā)送數(shù)據(jù)給客戶端
6.由于瀏覽器要求只有支持了https的網(wǎng)站才能升級HTTP2.0忌傻,所以也可以從這個角度說成大脉,HTTP2.0 基于HTTPS,是安全的水孩。
缺點:多個HTTP請求復(fù)用一個tcp 連接镰矿,如果發(fā)送丟包,就會觸發(fā)TCP丟包重傳的機制俘种,所有的請求秤标,都要等待丟的包回來再繼續(xù)

HTTP3.0

傳輸層的TCP绝淡,換成了UDP。UDP 是不管順序和不管丟包的抛杨,所以不會出現(xiàn)隊頭阻塞和丟包阻塞够委。
UDP 是不可靠傳輸?shù)模?UDP 的 QUIC 協(xié)議 可以實現(xiàn)類似 TCP 的可靠性傳輸怖现。當(dāng)某個流發(fā)生丟包時,只會阻塞這個流玉罐,其他流不會受到影響屈嗤。
QUIC 是一個在 UDP 之上的偽 TCP + TLS + HTTP/2 的多路復(fù)用的協(xié)議。
QUIC 是新協(xié)議吊输,對于很多網(wǎng)絡(luò)設(shè)備饶号,根本不知道什么是 QUIC,只會當(dāng)做 UDP季蚂,這樣會出現(xiàn)新的問題茫船。所以 HTTP/3 現(xiàn)在普及的進度非常的緩慢.

HTTP3.0

總結(jié)

HTTP1.0-HTTP3.0

2.HTTP

HTTP 是一個在計算機世界里專門在「兩點」之間「傳輸」文字、圖片扭屁、音頻算谈、視頻等「超文本」數(shù)據(jù)的「約定和規(guī)范」

HTTP

「200 OK」是最常見的成功狀態(tài)碼,表示一切正常料滥。如果是非 HEAD 請求然眼,服務(wù)器返回的響應(yīng)頭都會有 body 數(shù)據(jù)。
「204 No Content」也是常見的成功狀態(tài)碼葵腹,與 200 OK 基本相同高每,但響應(yīng)頭沒有 body 數(shù)據(jù)。
「206 Partial Content」是應(yīng)用于 HTTP 分塊下載或斷電續(xù)傳践宴,表示響應(yīng)返回的 body 數(shù)據(jù)并不是資源的全部鲸匿,而是其中的一部分,也是服務(wù)器處理成功的狀態(tài)阻肩。
「301 Moved Permanently」表示永久重定向带欢,說明請求的資源已經(jīng)不存在了,需改用新的 URL 再次訪問磺浙。
「302 Moved Permanently」表示臨時重定向洪囤,說明請求的資源還在,但暫時需要用另一個 URL 來訪問撕氧。
301 和 302 都會在響應(yīng)頭里使用字段 Location瘤缩,指明后續(xù)要跳轉(zhuǎn)的 URL,瀏覽器會自動重定向新的 URL伦泥。
「304 Not Modified」不具有跳轉(zhuǎn)的含義剥啤,表示資源未修改锦溪,重定向已存在的緩沖文件,也稱緩存重定向府怯,用于緩存控制刻诊。
「400 Bad Request」表示客戶端請求的報文有錯誤,但只是個籠統(tǒng)的錯誤牺丙。
「403 Forbidden」表示服務(wù)器禁止訪問資源则涯,并不是客戶端的請求出錯。
「404 Not Found」表示請求的資源在服務(wù)器上不存在或未找到冲簿,所以無法提供給客戶端粟判。
「500 Internal Server Error」與 400 類型,是個籠統(tǒng)通用的錯誤碼峦剔,服務(wù)器發(fā)生了什么錯誤档礁,我們并不知道。
「501 Not Implemented」表示客戶端請求的功能還不支持吝沫,類似“即將開業(yè)呻澜,敬請期待”的意思。
「502 Bad Gateway」通常是服務(wù)器作為網(wǎng)關(guān)或代理時返回的錯誤碼惨险,表示服務(wù)器自身工作正常羹幸,訪問后端服務(wù)器發(fā)生了錯誤。
「503 Service Unavailable」表示服務(wù)器當(dāng)前很忙平道,暫時無法響應(yīng)服務(wù)器睹欲,類似“網(wǎng)絡(luò)服務(wù)正忙,請稍后重試”的意思一屋。

常見字段

host: 域名

Connection 字段最常用于客戶端要求服務(wù)器使用 TCP 持久連接窘疮,以便其他請求復(fù)用。
HTTP/1.1 版本的默認(rèn)連接都是持久連接冀墨,但為了兼容老版本的 HTTP闸衫,需要指定 Connection 首部字段的值為 Keep-Alive。
Connection: keep-alive
Accept 字段, 客戶端聲明自己可以接受哪些數(shù)據(jù)格式诽嘉。
Accept: / 可以接受任何格式的數(shù)據(jù)蔚出。
Accept-Encoding 字段說明自己可以接受哪些壓縮方法
Accept-Encoding: gzip, deflate
Content-Type:告訴服務(wù)端,本次數(shù)據(jù)是什么格式(表單虫腋、文件骄酗、json/xml)
application/x-www-form-urlencoded:主要向服務(wù)器提交用戶隱私相關(guān)的信息(瀏覽器支持)
multipart/form-data: 向服務(wù)器上傳小文件(瀏覽器支持)
application/json:向后臺服務(wù)器提交結(jié)構(gòu)化數(shù)據(jù)(RESTful 設(shè)計風(fēng)格需要)
text/xml 向后臺服務(wù)器提交結(jié)構(gòu)化數(shù)據(jù)(RESTful 設(shè)計風(fēng)格需要)
application/octet-stream(8進制流),如果不想告訴服務(wù)器具體的文件類型悦冀,可以使用這個 Content-Type

Content-Length: 服務(wù)器返回給客戶端數(shù)據(jù)的時候趋翻,告訴數(shù)據(jù)占多少字節(jié)
Content-Length: 1000, 數(shù)據(jù)占1000字節(jié)
Content-Type 字段用于服務(wù)器回應(yīng)時,告訴客戶端盒蟆,本次數(shù)據(jù)是什么格式踏烙。(html/json/xml/圖片师骗、音頻、視頻讨惩、zip等 )
Content-Type: text/html; charset=utf-8, 發(fā)送的是網(wǎng)頁辟癌,而且編碼是UTF-8。
text/plain
image/jpg
image/png
image/gif
text/html
application/json
Content-Encoding 字段說明數(shù)據(jù)的壓縮方法荐捻。表示服務(wù)器返回的數(shù)據(jù)使用了什么壓縮格式

HTTP

post/get

get 獲取數(shù)據(jù)
不會修改服務(wù)器的資源黍少,所以是安全的。
每次操作的結(jié)果都一樣靴患,所以是冪等的仍侥。
GET請求能夠被緩存, 會保存在 Cache 目錄中 \bundleId 下 Cache.db 中
cfurl_cache_receiver_data,緩存所有的請求數(shù)據(jù)
cfurl_cache_response鸳君,緩存所有的響應(yīng)
不能發(fā)送敏感數(shù)據(jù),請求大小限制在2-8k
URL 字符串中如果包含中文、空格患蹂,需要添加百分號轉(zhuǎn)義[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
post 發(fā)送數(shù)據(jù)或颊,并且接收響應(yīng),會對服務(wù)器的資源有影響,所以是不安全的传于,
由于每次post 都會創(chuàng)建或者修改資源囱挑,所以也不是冪等的。
不能被緩存,發(fā)送敏感數(shù)據(jù)沼溜,安全,請求大小依賴于服務(wù)器的設(shè)置平挑,一般PHP = 2M
上傳文件:
請求格式

OC:
Content-Type: multipart/form-data; boundary=boundary

上傳的數(shù)據(jù)格式

//// ------ 單個文件上傳 -------

// name 服務(wù)器對應(yīng)的字段名;filename 上傳到服務(wù)器后的名字
--boundary
Content-Disposition: form-data; name="userfile"; filename="aaa.txt"
Content-Type: application/octet-stream
....要上傳文件的二進制數(shù)據(jù) ...
--boundary-- 
    
//// ------ 多個文件上傳 -------
--boundary
Content-Disposition: form-data; name="userfile[]"; filename="aaa.txt"
Content-Type: application/octet-stream

....要上傳文件的二進制數(shù)據(jù) ...


--boundary
Content-Disposition: form-data; name="userfile[]"; filename="aaa副本.txt"
Content-Type: application/octet-stream

....要上傳文件的二進制數(shù)據(jù) ...

--boundary
// status 是腳本文件接收參數(shù)的名稱
Content-Disposition: form-data; name="status"

....要上傳文件的二進制數(shù)據(jù) ...

--boundary--

上傳一個文件:

OC:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"001.png" withExtension:nil];
    NSData *data = [NSData dataWithContentsOfURL:fileURL];

    [self uploadFile:@"userfile" fileName:@"abc" fileData:data];
}

///  上傳單個文件
///
///  @param fieldName 服務(wù)器自短命
///  @param fileName  文件名
///  @param fileData  上傳文件二進制數(shù)據(jù)
- (void)uploadFile:(NSString *)fieldName fileName:(NSString *)fileName fileData:(NSData *)fileData {
    // 1. url - 負(fù)責(zé)上傳的腳本
    NSURL *url = [NSURL URLWithString:@"http://localhost/post/upload.php"];

    // 2. request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"POST";

    NSString *typeValue = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
    [request setValue:typeValue forHTTPHeaderField:@"Content-Type"];

    request.HTTPBody = [self formData:fieldName fileName:fileName fileData:fileData];

    // 3. connection
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

        NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL]);
    }];
}


///  生成 formData 二進制數(shù)據(jù)
///
///  @param fieldName 服務(wù)器字段名
///  @param fileName  文件名
///  @param fileData  上傳文件二進制數(shù)據(jù)
///
///  @return formData 二進制數(shù)據(jù)
- (NSData *)formData:(NSString *)fieldName fileName:(NSString *)fileName fileData:(NSData *)fileData {

    NSMutableData *dataM = [NSMutableData data];

    // 拼接數(shù)據(jù)
    NSMutableString *strM = [NSMutableString string];

    [strM appendFormat:@"--%@\r\n", boundary];
    [strM appendFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", fieldName, fileName];
    [strM appendString:@"Content-Type: application/octet-stream\r\n\r\n"];

    [dataM appendData:[strM dataUsingEncoding:NSUTF8StringEncoding]];
    [dataM appendData:fileData];

    NSString *tail = [NSString stringWithFormat:@"\r\n--%@--", boundary];
    [dataM appendData:[tail dataUsingEncoding:NSUTF8StringEncoding]];

    return dataM.copy;
}

青山不改系草,綠水長流通熄,后會有期,感謝每一位佳人的支持找都!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唇辨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子能耻,更是在濱河造成了極大的恐慌赏枚,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晓猛,死亡現(xiàn)場離奇詭異饿幅,居然都是意外死亡,警方通過查閱死者的電腦和手機戒职,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門栗恩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帕涌,你說我怎么就攤上這事摄凡⌒眨” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵亲澡,是天一觀的道長钦扭。 經(jīng)常有香客問我,道長床绪,這世上最難降的妖魔是什么客情? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮癞己,結(jié)果婚禮上膀斋,老公的妹妹穿的比我還像新娘。我一直安慰自己痹雅,他們只是感情好仰担,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绩社,像睡著了一般摔蓝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上愉耙,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天贮尉,我揣著相機與錄音,去河邊找鬼朴沿。 笑死猜谚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赌渣。 我是一名探鬼主播魏铅,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锡垄!你這毒婦竟也來了沦零?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤货岭,失蹤者是張志新(化名)和其女友劉穎路操,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體千贯,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡屯仗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搔谴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魁袜。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出峰弹,到底是詐尸還是另有隱情店量,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布鞠呈,位于F島的核電站融师,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蚁吝。R本人自食惡果不足惜旱爆,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窘茁。 院中可真熱鬧怀伦,春花似錦、人聲如沸山林。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驼抹。三九已至吴攒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砂蔽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工署惯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留左驾,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓极谊,卻偏偏與公主長得像诡右,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子轻猖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容