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)在普及的進度非常的緩慢.
總結(jié)
2.HTTP
HTTP 是一個在計算機世界里專門在「兩點」之間「傳輸」文字、圖片扭屁、音頻算谈、視頻等「超文本」數(shù)據(jù)的「約定和規(guī)范」
「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ù)使用了什么壓縮格式
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;
}
青山不改系草,綠水長流通熄,后會有期,感謝每一位佳人的支持找都!