iOS -讀書筆記-網絡請求

知道「3次握手」嗎?忽然想起這個詞編程

什麼是3次握手?
TCP三次握手/四次揮手詳解 這裏是3次握手的詳解
3次握手就是爲了可靠的傳送數據,TCP(什麼是TCP呢?TCP就是一種可靠傳輸的協議)在發送數據以前。兩臺主機之間進行3次握手。3次握手完畢後才發送數據。緩存

預備知識: 位碼即tcp標誌位,有6種標示:SYN(synchronous創建聯機) ACK(acknowledgement 確認) PSH(push傳送) FIN(finish結束) RST(reset重置) URG(urgent緊急)
Sequence number(順序號碼) Acknowledge number(確認號碼)
第一次握手:主機A發送位碼爲syn=1,隨機產生seq number=1234567的數據包到server,主機B由SYN=1知道。A要求創建聯機。
第二次握手:主機B收到請求後要確認聯機信息。向A發送ack number=(主機A的seq+1),syn=1,ack=1,隨機產生seq=7654321的包
第三次握手:主機A收到後檢查ack number是否正確,即第一次發送的seq number+1,以及位碼ack是否爲1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到後確認seq值與ack=1則鏈接創建成功。
完畢三次握手。主機A與主機B開始傳送數據。安全

進入正題:
iOS 中首選的通訊方式是HTTP。iOS提供的最方便的網絡API也是針對HTTP的。bash


上文中說的「三次握手」就是爲了創建一個TCP鏈接,HTTP請求和響應就是在TCP鏈接上來完畢的,TCP鏈接可以重用,也就是說。並不是每次HTTP請求都需要創建TCP鏈接,僅僅要TCP鏈接不斷開,HTTP請求就可以一直使用。markdown

HTTP和HTTPS的區別在什麼地方?
安全。事實上HTTPS協議就是SSL+HTTP協議。網絡

HTTPS和HTTP之間最重要的區別在於會話的創建階段。TCP鏈接創建好以後,HTTP請求發送以前。client與server之間必須創建SSL(那麼SSL又是什麼呢?如下說)會話。會話創建完畢後,在TCP鏈接之上傳輸的所有數據都是加密的。異步

SSL是什麼?
SSL (Secure Socket Layer),是一種保證server和client安全通訊的協議。使用HTTPS協議。所有的HTTP數據都是在SSL協議封裝之上傳輸的。忽然冒出另一個詞TLS,事實上TLS是SSL標準化的產物,事實上咱們現在用的都是TLS。但因爲歷史上習慣了SSL這個稱呼尋常仍是以SSL爲多。關於SSL的介紹看下這篇文章講的很是好SSL/TLS協議執行機制的概述tcp

iOS 最高層的HTTP APIpost

NSURL 、NSURLRequest 、NSURLConnection 、NSURLResponse 對象ui

1 NSURL

經過NSURL 對象輕鬆方便的訪問URL所指向的內容,NSURL 可以指向文件資源,也可以指向網絡資源。


NSURL *url = [NSURL URLWithString:@」「];
NSData *data = [NSData dataWithContentsOfURL:url];
即可以獲取網絡資源又可以獲文件資源。

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    NSInputStream *inStream = [NSInputStream inputStreamWithFileAtPath:@"文件路徑"];
    [request setHTTPBodyStream:inStream];

NSURL還提供了很是多方法來讀取URL各個部分的值,比方url.port獲取一下url的端口。
在建立NSURL對象前需要對URL字符串進行百分號編碼。RFC3986文檔規定,Url中僅僅贊成包括英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字符以及所有保留字符。相關更具體的看百分號編碼

2 NSURLRequest

建立好NSURL對象後接下來就需要執行下一步:建立NSURLRequest對象。NSURLRequest 對象包括了載入URL內容所需的信息。iOS中的URL載入系統支持HTTP 、HTTPS、FTP和FILE URL內容的載入
URL載入系統提供了一種擴展方式一處理新的協議,方式就是建立NSURLProtocol的子類。而後將返回的結果提供給URL載入系統。

NSURL *url = [NSURL URLWithString:@"www.baidu.com"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

採用默認的參數來建立對象。

假設是HTTP或者HTTPS 那麼請求方法是GET,並且使用操做系統提供的默認頭。

NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30];

設置緩存策略和請求時間,NSURLRequest也提供了不少方法來獲取請求的屬性。但是不能設置,假設想要設置,那麼來用NSMutableRequest。

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[@"body" dataUsingEncoding:NSUTF8StringEncoding]];
    [request setAllHTTPHeaderFields:@{@"":@""}];

NSMutableRequest 設置各類參數。


發送大容量內容可以使用NSInputSteam,使用該對象提供請求體而無需將整個內容載入到內存中。發送圖片或者視頻這是最佳的選擇。

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    NSInputStream *inStream = [NSInputStream inputStreamWithFileAtPath:@"文件路徑"];
    [request setHTTPBodyStream:inStream];

3 NSURLConnection

NSURLConnection 對象是URL載入通通活動的中心。用於鏈接server獲取響應。

提供了同步、異步、隊列異步的操做模式。

同步最簡單,但是會有阻塞線程等缺點。異步模式下調用託付代理來處理數據。

4 NSURLReponse

NSURLResponse 對象會在URL載入請求完畢後返回。NSError對象與DSData對象,假設請求出現故障或server問題會返回NSError對象,假設有響應返回NSData對象就會包括響應體.
NSURLReponse提供了很是多屬性信息。
MIMEType 結果數據的MIME類型。該值來源於server。
expectedContentLenth 返回內容的大小,可能與實際不符。
suggestedFilename 提供的文件名稱,要麼來自server提供的內容的文件名稱,要麼來自URL和MIME類型。


URL 返回內容的URL。

因爲成定向的緣由,URL可能與請求提供的URL不一樣。


textEncodingName 最初數據源所用的文本編碼名。
HSHTTPURLResponse 是NSURLResponse的子類,它包括特定於HTTP請求的屬性。


響應頭 - allHeaderFields
HTTP狀態碼 - statusCode

文章來自《iOS高級編程》 掃盲

相關文章
相關標籤/搜索