網絡乾貨

 

1、OSI七層模型javascript

  OSI七層模型(五層):本質:每一層都與不少的網絡協議html

(1) 應用層  :最接近用戶,將應用程序呈現給用戶,HTTP,FTP,POP3,SMTP,telnet ,DHCP java

(2)表示層  :解決不一樣系統間的通訊ios

(3)會話層  :創建和管理應用程序間的通訊數據庫

(4)傳輸層  : 創建端口間通訊, TCP(三次握手),UDP(不可靠)apache

(5)網絡層  : 創建主機間的通訊,IP編程

(6)數據鏈路層 :肯定數據的分組和解讀方式,提供錯誤檢測,造成、拆分數據幀,以太網協議,ARPjson

(7)物理層 : 肯定物理接口、傳輸電信號(一、0的高低電平)後端

  

2、socket瀏覽器

一、是什麼

(1)用於網絡設備間應用程序數據通訊的基本模型,封裝了進程端口號和主機地址。是TCP/IP協議的抽象,爲上層協議提供接口。

(2)自己不是協議,經過socket咱們才能使用TCP/IP,socket是一組接口。

(3)socket 是基於傳輸層和應用層間的抽象層(5層模型)

二、怎麼用

(1)在http請求中,已經集成了socket的一種應用。

(2)創建一條雙向的通訊須要兩個socket

(3)OC沒有對socket進行單獨封裝,使用流程:

   <1> 建立客戶端Socket(網絡地址類型、端口、傳輸協議)

   <2> 建立服務器Socket (服務端地址、端口、地址類型)       

   <3> 鏈接到服務器(客戶端socket、服務端socket、服務端socket長度)    

   <4> 發送數據給服務器(發送內容地址、長度,客戶端socket)

       <5> 接收服務器返回的數據 (客戶端socket、接收緩存區、緩存區長度、接收方式)       

       <6> 關閉 Socket      

   

 

三、擴充

(1)socket編程

  socket編程是利用socket接口爲應用層自定協議用於應用進程的網路通訊。那爲何要自定義呢,自定義目的是知足本身的應用需求。例如http協議是應用層使用最多最普遍的協議,http是單工阻塞性質的協議,若是你須要一個全雙工,無阻塞的雙向傳輸,那http就知足不了。http定義本身的包頭,你要是以爲傳輸效率極其重要,這樣的包頭太臃腫,你也須要自定義協議。自定義應用層協議就須要socket編程,目前應用的場景有,即時通信,社交訂閱更新,視頻會議,網絡遊戲,股票基金實時價格等等。

 

(2)系統調用(system call)和應用程序接口(API)的概念。

  系統調用就是應用程序和操做系統之間傳遞控制權。當應用程序啓動系統調用時,就把控制權從應用程序傳遞給系統調用接口,此接口又把控制權傳遞給操做系統,操做系統執行內部的操做,執行完畢控制權又經過系統調用返回給應用程序。這個系統調用接口就是API。API定義了不少系統調用的函數,經過請求調用就能夠得到操做系統的服務。目前最著名就是伯克利爲UNIX定義的socket interface。(層)

       回到網絡中,傳輸層TCP協議和網絡層的IP協議已經集成到操做系統中,應用程序在應用層,這就涉及到應用進程與操做系統的調用,而socket interface就做爲應用進程和運輸層協議之間的接口。所以,應用進程要使用TCP/IP協議進行通訊就必須經過socket和操做系統進行調用請求服務。Socket把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來講,一組簡單的接口就是所有,讓Socket去組織數據,以符合指定的協議。

 

(3)socket起源的理解

         socket起源於Unix,而Unix/Linux基本哲學之一就是「一切皆文件」,均可以用「打開open –> 讀寫write/read –> 關閉close」模式來操做。socket是能夠理解爲一種特殊的文件,socket函數就是對其進行的操做(讀/寫IO、打開、關閉)。

 

 

3、TCP/IP

 

一、TCP的三次握手和四次分手

(1)握手: 一個完整的三次握手: 請求(SYN)---應答(ACK +SYN)---再次確認(ACK+1)

    第一次握手:創建鏈接時,客戶端A發送SYN包(SYN=j)到服務器B,並進入SYN_SEND狀態,等待服務器B確認。 【A向B請求鏈接】

  第二次握手:服務器B收到SYN包,必須確認客戶A的SYN(ACK=j+1),同時本身也發送一個SYN包(SYN=k),即SYN+ACK包,此時服務器B進入SYN_RECV狀態。 【B迴應A:好的,你來吧】

  第三次握手:客戶端A收到服務器B的SYN+ACK包,向服務器B發送確認包ACK(ACK=k+1),此包發送完畢,客戶端A和服務器B進入ESTABLISHED狀態,完成三次握手。 【A迴應B:好的,我來也】

 

(2)分手:一個完整的四次分手:A請求(FIN)--- B應答(ACK)---B關閉(FIN)---A應答(ACK)

因爲TCP鏈接是全雙工的,所以每一個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的鏈接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP鏈接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另外一方執行被動關閉。

  <1>客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送。【A對B說:我傳完了】 

  <2>服務器B收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1(報文段5)。和SYN同樣,一個FIN將佔用一個序號。 【B迴應A:好的】

  <3>服務器B關閉與客戶端A的鏈接,發送一個FIN給客戶端A。 【B對A說:我傳完了too】

  <4>客戶端A發回ACK報文確認,並將確認序號設置爲收到序號加1。 【A迴應B:好的,我走了】

2、爲何三次握手卻有四次分手?

  總結:鏈接時SYN和ACK能夠放在一個報文中,可是分手時,因爲鏈接是雙向的,須要單獨關閉每一個方向上的數據傳輸,也就是單方向上的請求關閉和確認,FIN和ACK通常是分開發送的。

  這是由於服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求後,它能夠把ACK和SYN(ACK起應答做用,而SYN起同步做用)放在一個報文裏來發送。但關閉鏈接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你全部的數據都所有發送給對方了,因此你能夠未必會立刻會關閉SOCKET,也即你可能還須要發送一些數據給對方以後,再發送FIN報文給對方來表示你贊成如今能夠關閉鏈接了,因此它這裏的ACK報文和FIN報文多數狀況下都是分開發送的.

3、爲何用三次握手

(1)爲了防止已失效的鏈接請求報文段忽然又傳送到了服務端,於是產生錯誤

(2) 還有一種說法是爲了解決「網絡中存在延遲的重複分組」的問題。

 

 

4、HTTP

一、是什麼以及幹什麼用的

(1)超文本傳輸協議,目前1.1版本

(2)基於應用層的通訊規範,規定客戶端和服務器之間的數據傳輸格式

(3)iOS網絡開發中,多用於進行發送HTTP請求

 

二、特色

(1)短鏈接,無狀態鏈接(每次新建鏈接),經過TCP完成數據請求後當即釋放。

 

(2)Keep-Alive 心跳包(1.1版本正式提供):

 

     <0>若是客戶端瀏覽器支持Keep-Alive,那麼就在HTTP請求頭中添加一個字段 Connection: Keep-Alive,服務器收到請求時,會在響應頭中添加一個一樣的字段來使用Keep-Alive。客戶端和服務器之間的HTTP鏈接就會被保持,不會斷開,直到超時會或意外斷開。

     <1> 爲了提升效率,使用心跳包,使得TCP短暫保持鏈接

     <2> 時間能夠設定,過時後仍然斷開鏈接,因此HTTP仍是短鏈接 

     <3>使用session, Cookie等技術,也能保持用戶的狀態,可是每一次鏈接依然是無狀態鏈接

 

(3)有請求才有迴應,不請求不迴應

 

(4)HTTP容許傳輸任意類型的數據

 

(5)簡單快速,由於HTTP協議簡單,因此HTTP服務器的程序規模小,於是通訊速度很快

 

(6)採用短鏈接,一個鏈接處理一個請求,縮短數據請求和傳輸時間(0.9和1.0的特性,沒有開啓心跳包時)

 

三、OC中怎麼使用

(1)使用http協議發送網絡請求,http請求能夠理解爲特殊處理的socket

(2)HTTP請求格式:

   <1>請求行:  GET(請求方法) /resources/vedios.json(資源路徑) HTTP/1.1(http協議版本)

 

   <2>請求頭:  User-Agent (告訴服務器的一些數據)

        其餘頭信息:

        Accept: text/html       // 客戶端所能接收的數據類型

        Accept-Language: zh-cn // 客戶端的語言環境

        Accept-Encoding: gzip // 客戶端支持的數據壓縮格式

        Host: m.baidu.com       // 客戶端想訪問的服務器主機地址

        User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:37.0) Gecko/20100101 Firefox/37.0 // 客戶端的類型,客戶端的軟件環境

 

 

     <3> 請求體:  只有 POST 請求才有請求體 ,GET 請求是沒有請求體的.

 

(3)http響應格式

 

   <1>響應行(狀態行): HTTP/1.1(http協議版本) 304(網絡鏈接狀態碼) Not Modified(網絡鏈接狀態碼簡要說明)

 

   <2>響應頭: 會返回服務器信息,還會返回本次請求數據(實體內容)的信息。

 

      其餘頭信息:

        Content-Encoding: gzip     // 服務器支持的數據壓縮格式

        Content-Length:  1528          // 返回數據的長度

        Content-Type:  application/xhtml+xml;charset=utf-8 // 返回數據的類型

        Date: Mon, 15 Jun 2015 09:06:46 GMT             // 響應的時間

        Server: apache                           // 服務器類型

 

   <3>實體內容: 就是客戶端想要的數據。

  

(4)http請求方法

  <1>OC中沒有針對HTTP請求格式作好的封裝類,咱們要手動封裝

  <2>請求方法(不區分大小寫):GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH 只用前兩個

(tip:put操做是冪等性的,即重複操做只執行一個結果,而post不是。

put的建立操做針對的是具體資源,及帶有文件名的路徑,而post不是,只要集合名就能夠)

 

(5)發送http請求的工具

  <1>蘋果原生:

      * NSURLConnection:用法簡單,古老經典的一種方案.

      * NSURLSession:iOS7之後推出的技術,功能比NSURLConnection更增強大

    * CFNetWork:NSURL 的底層,純C語言,通常不用.

      <2>第三方框架:

      * ASIHttpRequest:http終結者,功能很強大,惋惜做者已中止更新,2012年中止更新。惋惜。。。

      * AFNetWorking:簡單易用,提供了基本夠用的經常使用功能,維護和使用者多.

      * MKNetWorkKit:簡單易用,產自印度,維護和使用者少.

 

四、關於http短鏈接和socket長鏈接補充

  Http是在每次請求完成後就把TCP鏈接關了,因此是短鏈接。直接經過Socket編程使用TCP協議的時候,由於咱們本身能夠經過代碼去控制何時打開鏈接何時關閉鏈接,只要咱們不經過代碼把鏈接關閉,這個鏈接就會在客戶端和服務端的進程中一直存在,相關狀態數據會一直保存着。

 

 

五、經常使用請求方式get、post、head

 

(1) GET

   <1>用於通常的網絡請求,請求參數封裝在url後面,例  http://127.0.0.1/login?username=zhangqi&password=12345

   <2>參數長度有限制(通常2~8K)、速度快、不安全、會作本地緩存(保存在SQLite的數據庫中(路  徑:NSHomeDirectory()))。

  <3>NSURLRequest默認使用GET請求。

 

(2) POST

  <1>能夠作通常網絡請求,也能夠請求大數據,或者作數據上傳。

  <2>須要設置設置 NSURLRequest 的 HTTPMethod、HTTPBody屬性

  <3>沒有長度限制、安全低效、私密信息必須使用POST、不作本地緩存

 

(3) HEAD請求方法

  <1>只獲取響應頭信息,不獲取具體的數據內容.響應頭中有我嗎須要的內容,好比文件類型字段。

  <2>通常 HEAD 請求都使用同步的方法發送.由於不獲取實體內容,返回的數據只有響應頭信息.

  <3>request.HTTPMethod = @"HEAD"

  

六、RESTful設計風格

 

主要用於後端開發,主要的表現形式爲使用同一個 URL,不一樣的 HTTP 訪問方法,表達不一樣的語義。

 

 

七、網絡鏈接狀態碼

 (1)1xx消息

      表明請求已被接受,須要繼續處理。這類響應是臨時響應,只包含狀態行和某些可選的響應頭信息,並以空行結束。除非在某些試驗條件下,服務器禁止向此類客戶端發送1xx響應。

 (2)2xx成功

      表明請求已成功被服務器接收、理解、並接受。例:200 OK:請求已成功,請求所但願的響應頭或數據體將隨此響應返回。202 Accepted服務器已接受請求,但還沒有處理。

 (3)3xx重定向

      表明須要客戶端採起進一步的操做才能完成請求。

 (4)4xx客戶端錯誤

      表明了客戶端看起來可能發生了錯誤,妨礙了服務器的處理。除非響應的是一個HEAD請求,不然服務器就應該返回一個解釋當前錯誤情況的實體,以及這是臨時的仍是永久性的情況。例:404 Not Found :請求失敗,請求所但願獲得的資源未被在服務器上發現。408 Request Timeout請求超時。400 Bad Request 因爲包含語法錯誤,當前請求沒法被服務器理解。

 (5)5xx服務器錯誤

      表明了服務器在處理請求的過程當中有錯誤或者異常狀態發生,也有多是服務器意識到以當前的軟硬件資源沒法完成對請求的處理。

  

 八、網絡操做補充

(1)獲取本地文件大小(先獲得屬性字典,可是得不到文件類型

[NSFileManager defaultManager] attributesOfItemAtPath:@「本地地址」

 

(2)如何獲取服務器文件大小/類型

經過發送head請求,獲得NSResponse其中的屬性:expectedContentLength /MIMEType

 

(3)句柄操做:NSFileHandle

文件操縱句柄,操縱的是文件內部,依賴於文件。 若是文件路徑下沒有這個文件,文件操縱句柄不會實例化成功。

 

(4)輸出管道流:NSOutputStream

若是文件路徑下沒有這個文件,會自動建立一個文件

 

 

5、AFN

1 、AFN的概念原理:

(1)AFN的基礎是NSURL

(2)AFN的直接操做對象AFHTTPClient是一個實現了NSCoding和NSCopying協議的NSObject子類。

(3)AFHTTPClient是一個封裝了一系列操做方法的「工具類」,處理請求的操做類是一系列單獨的,基於NSOperation封裝的,AFURLConnectionOperation的子類。AFN的示例代碼中經過一個靜態方法,使用dispatch_once()的方式建立AFHTTPClient的共享實例,這也是官方建議的使用方法。在建立AFHTTPClient的初始化方法中,建立了OperationQueue並設置一系列參數默認值。在getPath:parameters:success:failure方法中建立NSURLRequest,以NSURLRequest對象實例做爲參數,建立一個NSOperation,並加入在初始化發方中建立的NSOperationQueue。以上操做都是在主線程中完成的。

 

二、更新

AFNetworking3.0刪除了了對 NSURLConnection的封裝內容

三、支持後臺運行的網絡任務

  •    暫停、中止、重啓網絡任務,不須要本身封裝NSOperation
  •    支持斷點續傳,異步下載
  •    支持上傳(單文件上傳),異步上傳
  •    獲取下載、上傳的進度

 

四、 AFN與其它框架對比

(1) AFNetWorking:簡單易用,提供了基本夠用的經常使用功能,有人更新和維護,並且目前使用者不少 。其相關資料,文檔,demo不少,很好找遇到問題好解決。

(2)ASIHttpRequest:

  <1>ASI的底層基於純C語言的CFNetwork框架,功能很強大,惋惜做者已中止更新.

  <2>ASI 可以同時實現上傳多個文件

  <3>MRC的,2012年就中止更新了,設計的目標平臺:iOS 2.0/iOS 3.0 。以前的組合 ASI+SBJSON。

(3) MKNetWorkKit:簡單易用,維護和使用者少.

 

五、AFN的數據解析,服務器返回的數據必須和解析器相對應。

 

(1)特色:  能夠自動對服務器返回的數據進行解析,默認將服務器返回的數據當作 JSON 數據解析.

(2)AFN解析器的概念:

   <1>當作是JSON來解析(默認作法),成功返回的responseObject的類型是NSDictionary或者NSArray。

   mgr.responseSerializer = [AFJSONResponseSerializer serializer];

   <2> 當作是XML來解析,responseObject的類型是NSXMLParser

   mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];  

     <3> 直接返回data,不要去解析服務器返回的數據,保持原來的data便可,對於文件/圖片/視頻/網頁HTML,只能選擇萬能解析器!

     mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

 

(3)解析器的一種特殊更改方式

   <1> 當前 manager 解析器默認將全部數據當作 JSON 數據解析。

   <2> 此時服務器傳回的數據是 內容是JSON格式,可是文件沒有後綴名,默認爲text/plain 類型,不是JSON類型。

   <3> 不更改解析器類型的狀況下,能夠有兩種方式一樣實現解析:

     (1)更改框架,去JSON解析器的初始化方法中,更改acceptableContentTypes裏面的內容。

     (2)不更改框架,給默認解析器的acceptableContentTypes屬性從新賦值:

     manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript" ,@"text/plain",nil];

  

 

六、使用AFNetworkReachabilityManager,檢測網絡狀態

(1)操做步驟 

   <1> 實例化網絡工具監測類.

      AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];

     <2> 設置網絡狀態改變以後的操做.

  // ReachabilityStatusChangeBlock:一旦網絡狀態改變以後,就會執行下面的 block.

   // status : 枚舉值,表明當前的網絡狀態

   [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

    }];

      <3> 開啓網絡監測

  [manager startMonitoring];

    

    

七、使用 AFN中的 AFSecurityPolicy :安全策略,支持 HTTPS 請求(跳過驗證的步驟!)

(1)AFN3.0以前,讓 AFN 支持 HTTPS 

    manager.securityPolicy.allowInvalidCertificates = YES;

(2)AFN3.0以後,讓 AFN 支持 HTTPS 

    manager.securityPolicy.validatesDomainName = NO;

 

八、比較彙總

 

        

 

 

 

6、XML數據解析

一、SAX解析:

(1)NSXMLParser的代理

(2)逐行解析

 

二、DOM解析:

(1)三方框架GDataXML

(2)一次加載整個XML文檔      

(3)幾個詞:根元素rootElement、子元素children、元素GDataXMLElement、屬性attributes、節點GDataXMLNode、內容

(4)節點的屬性:stringValue、name

     

 

 

7、NSURLConnection 和 NSURLSession的區別

 

一、前者以在iOS9.0已經被廢棄

二、前者能夠在初始化時肯定發送同步仍是異步的請求,而且能夠選擇執行隊列。然後者只能異步發送網絡請求。

三、使用方式(實例化)不一樣

(1)前者有類方法,能夠不用實例化直接發送同步或異步請求。

(2)後者有單例對象,也可自定義對象。

 

四、網絡任務的概念

NSURLSection 有網絡任務的概念:task ,三種不一樣的網絡任務(普通,上傳,下載)

 

五、關於請求的啓動

NSURLSection 默認實例化網絡任務後,是掛起的,須要resume

 

六、使用場景:

 

(1) 普通的網絡任務:服務器返回的是 JSON/XML/HTML 等數據量比較小. 與 NSUrlConnection 的異步網絡請求沒有任何區別!

(2) 文件上傳: 默認NSUrlSession 的文件上傳走的是 PUT 請求.文件上傳跟 NSUrlConnection 也基本沒有區別.

(3) 文件下載: 若是服務器返回的是一些比較大的數據,NSUrlSession 的下載作的是最好的,封裝的很是全面

 

七、關於下載「大文件」時的不一樣

 

(1) NSUrlConnection 使用dataDelegate監控下載進度,須要配合NSFileHandle 或者 NSOutputStream(文件不存在能夠建立)進行數據的存儲。

    NSUrlSession 下載使用本身的方法(生成downloadTask,而後resume)

     (代理方法監測下載進度)

 

(2)NSURLSession下載完成後,會刪除內容(temp文件夾中的文件)

 

八、關於斷點續傳的不一樣

(1)NSUrlConntection 須要使用代理方法,同時,設置請求頭的rang屬性

(2)經過暫停或取消,生成resumeData,須要續傳時,根據resumeData生成新任務。

相關文章
相關標籤/搜索