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的封裝內容
三、支持後臺運行的網絡任務
四、 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生成新任務。