1.網(wǎng)絡(luò)模型
1.1 OSI 七層模型
某一層的服務(wù)就是該層及其下各層的一種能力颤芬,它通過(guò)接口提供給更高一層衡创。
(關(guān)于七層模型的最佳介紹:OSI 七層模型與 TCP/IP 五層模型,其中將整個(gè)過(guò)程類比為A公司向B公司發(fā)送一份商業(yè)報(bào)價(jià)單的過(guò)程相當(dāng)經(jīng)典)
1.2 TCP/IP 五層模型
1.3 各級(jí)網(wǎng)絡(luò)層對(duì)應(yīng)的服務(wù)
2.http/TCP/UDP
2.1 http
即超文本傳輸協(xié)議。http連接最顯著的特點(diǎn)是客戶端發(fā)送的請(qǐng)求每次都需要服務(wù)器響應(yīng)诈闺。在請(qǐng)求結(jié)束后會(huì)主動(dòng)釋放連接菜枷,從建立連接到關(guān)閉連接的過(guò)程稱為“一次連接”。
http1.0:客戶端的每次請(qǐng)求都要求建立一次單獨(dú)的連接涮较,在處理完本次請(qǐng)求后稠鼻,就自動(dòng)釋放連接。
http1.1:
? ? ? ? a.引入了更多的緩存控制策略
? ? ? ? b.允許只請(qǐng)求資源的某一部分狂票,可充分利用帶寬
? ? ? ? c.新增了24個(gè)錯(cuò)誤狀態(tài)響應(yīng)碼候齿,更方便開發(fā)者的控制
? ? ? ? d.支持長(zhǎng)連接和請(qǐng)求的流水線處理。在一個(gè)連接上可以傳送多個(gè)http請(qǐng)求和響應(yīng)闺属,減少了建立和銷毀連接的開銷慌盯。默認(rèn)開啟Connection:keep-alive。
http2.0:基于谷歌的SPDY掂器,傳輸性能上得到了大大的提升亚皂。
? ? ? ? a.協(xié)議解析基于二進(jìn)制,之前的都是基于文本国瓮。解析更方便更健壯灭必。
? ? ? ? b.多路復(fù)用:提高帶寬利用率匠楚,降低延遲。 在連接共享的基礎(chǔ)之上有可能會(huì)導(dǎo)致關(guān)鍵請(qǐng)求被阻塞厂财。SPDY允許給每個(gè)request設(shè)置優(yōu)先級(jí)芋簿,這樣重要的請(qǐng)求就會(huì)優(yōu)先得到響應(yīng)。
? ? ? ? c.header壓縮和緩存:使用encoder壓縮來(lái)減小header的體積璃饱,另外雙方各自緩存一份header fields表与斤,避免了重復(fù)的header的發(fā)送
? ? ? ? d.服務(wù)端推送:不需要每次都發(fā)請(qǐng)求。
(http1.0荚恶,1.2撩穿,2.0 的區(qū)別:http1.0 1.2 2.0 的區(qū)別)
2.2 TCP
面向連接,傳輸可靠谒撼,但速度較慢食寡,建立連接需要較多開銷。
TCP的三次握手:
? ? (1).客戶端向服務(wù)端發(fā)送SYN(1)+Seq(X)
? ? (2).服務(wù)端發(fā)送 SYN(1) + Seq(Y) + ACK(X+1)
? ? (3).客戶端發(fā)送 Seq(Z) + ACK(Y+1)
TCP的四次揮手
? ? (1).第一次揮手廓潜,客戶端發(fā)送一條FIN信息給服務(wù)端抵皱,然后服務(wù)端進(jìn)入等待狀態(tài)
? ? (2).第二次揮手,服務(wù)端收到FIN信號(hào)后辩蛋,發(fā)送一條ACK信號(hào)給客戶端呻畸。并關(guān)閉連接。
????(3).第三次揮手悼院,服務(wù)端等關(guān)閉連接后伤为,再發(fā)送一條FIN信息給客戶端。
? ? (4).第四次揮手据途,客戶端收到FIN信號(hào)后绞愚,關(guān)閉連接,并發(fā)送ACK給服務(wù)器颖医。
2.3 UDP
面向非連接位衩,傳輸不可靠,但速度快便脊。
3.短連接與長(zhǎng)連接
短連接:連接->傳輸數(shù)據(jù)->關(guān)閉連接蚂四。一般web網(wǎng)站的http請(qǐng)求都用短連接,減小服務(wù)端的資源占用哪痰。(http1.1及2.0也支持長(zhǎng)連接)遂赠。? ?
長(zhǎng)連接:連接->傳輸數(shù)據(jù)->傳輸數(shù)據(jù)。晌杰。跷睦。->傳輸數(shù)據(jù)->關(guān)閉連接,安全性較差肋演。一般用于操作頻繁的點(diǎn)對(duì)點(diǎn)通訊抑诸。
4.HTTPS
如上圖所示烂琴,https比http多了一層SSL/TLS,而多出來(lái)的這一層就是用來(lái)給傳輸內(nèi)容加密的。https協(xié)議需要申請(qǐng)CA證書蜕乡〖楸粒可以有效的防止運(yùn)營(yíng)商劫持。
https 如何保證傳輸安全:首先是有個(gè)CA證書的身份認(rèn)證层玲。其次客戶端第一次向服務(wù)端請(qǐng)求時(shí)号醉,服務(wù)端會(huì)返回一個(gè)帶公鑰的隱私空間,客戶端之后就用拿到的公鑰將自己要發(fā)送的數(shù)據(jù)加密后發(fā)送給服務(wù)端辛块,服務(wù)端收到數(shù)據(jù)后再拿自己保存的私鑰來(lái)對(duì)數(shù)據(jù)進(jìn)行解密畔派。
5.socket
socket ,又稱套接字润绵,本身并不是協(xié)議线椰,它是對(duì)TCP/IP協(xié)議(包含傳輸層的TCP UDP 協(xié)議以及網(wǎng)絡(luò)層的IP協(xié)議等,統(tǒng)稱TCP/IP協(xié)議)的封裝尘盼,基于TCP UDP協(xié)議之上憨愉,其實(shí)就是一個(gè)對(duì)外的接口。我們通過(guò)socket 接口可以方便的進(jìn)行網(wǎng)絡(luò)編程悔叽,而不用直接面對(duì)底層的TCP/IP協(xié)議莱衩。建立socket通訊至少需要兩端:ClientSocket和ServerSocket,建立連接的過(guò)程可以總結(jié)為:服務(wù)端監(jiān)聽(tīng)爵嗅,客戶端請(qǐng)求娇澎,確認(rèn)建立連接。
6.網(wǎng)絡(luò)緩存
6.1 GET網(wǎng)絡(luò)請(qǐng)求的緩存
首先明確睹晒,post請(qǐng)求是無(wú)法緩存的趟庄,只有g(shù)et請(qǐng)求可以緩存,因?yàn)間et請(qǐng)求是冪等的伪很。
其次戚啥,設(shè)置網(wǎng)絡(luò)請(qǐng)求的緩存只需要兩行代碼即可搞定,如下所示:
NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil]; ??
?[NSURLCache setSharedURLCache:urlCache];
6.2 控制緩存的有效性
如上的兩行代碼的確可以控制緩存的有效期锉试,但是這樣的方式不夠靈活猫十。當(dāng)有個(gè)需求要求服務(wù)器數(shù)據(jù)一旦更新,我們的請(qǐng)求就必須刷新的時(shí)候呆盖,以上的方式就不滿足需求了拖云。解決這個(gè)問(wèn)題的思路就是:對(duì)比客戶端本地和服務(wù)器端是否一致,不一致的時(shí)候才返回?cái)?shù)據(jù)应又。
Etag:基于hash,是強(qiáng)校驗(yàn)宙项,官方推薦的方式,但需要服務(wù)端支持株扛。我們根據(jù)服務(wù)端的響應(yīng)碼來(lái)判斷是使用本地緩存還是使用新的請(qǐng)求到的數(shù)據(jù)尤筐。比如汇荐,當(dāng)收到響應(yīng)碼為304時(shí),此時(shí)data會(huì)是空的盆繁,表示服務(wù)端數(shù)據(jù)沒(méi)有更新掀淘,我們繼續(xù)使用本地緩存數(shù)據(jù),當(dāng)收到的響應(yīng)碼為200時(shí)油昂,表示data有值繁疤,我們需要使用新的數(shù)據(jù)。
Last-Modified:基于時(shí)間戳秕狰,是弱校驗(yàn)稠腊,一般服務(wù)端都會(huì)支持。
當(dāng)然鸣哀,這個(gè)只是標(biāo)準(zhǔn)協(xié)議中給我們提供的校驗(yàn)方式架忌,你也完全可以和服務(wù)端自己協(xié)商確定其他的校驗(yàn)方式。
7. 文件上傳 下載 斷點(diǎn)續(xù)傳
由于NSURLConnection已經(jīng)棄用我衬,所以我們現(xiàn)在只需要了解NSURLSession的方式了叹放。
核心思想:將網(wǎng)絡(luò)請(qǐng)求進(jìn)行封裝,實(shí)現(xiàn)多線程挠羔。例如將一個(gè)網(wǎng)絡(luò)請(qǐng)求的任務(wù)進(jìn)行包裝井仰,生成一個(gè)NSURLSession,NSURLSession會(huì)自動(dòng)實(shí)現(xiàn)多線程,它的回調(diào)block就是在子線程中破加。然后可以通過(guò)代理監(jiān)聽(tīng)這個(gè)過(guò)程(進(jìn)度俱恶,是否成功等)。
NSURLSession的使用步驟:(1).創(chuàng)建對(duì)應(yīng)的task對(duì)象 ?(2).執(zhí)行task?
文件下載:
? ? (1).NSURLSessionDownloadTask:專門下載用的task范舀,配合它的代理可以更方便的實(shí)現(xiàn)斷點(diǎn)下載功能合是,但也有一個(gè)缺陷,就是我們獲取不到下載中間過(guò)程的數(shù)據(jù)锭环,也就是這些數(shù)據(jù)是存在內(nèi)存中的聪全,當(dāng)我們?cè)谙螺d過(guò)程中關(guān)閉程序,這些數(shù)據(jù)也就丟失了辅辩,所有的數(shù)據(jù)都需要重新下載难礼。
????(2).NSURLSessionDataTask:我們可以獲取下載的數(shù)據(jù)流,從而存儲(chǔ)到沙盒中玫锋,關(guān)閉程序再進(jìn)入我們依然可以從沙盒中讀取之前下載的數(shù)據(jù)蛾茉,實(shí)現(xiàn)離線斷點(diǎn)下載功能。
文件上傳:NSURLSessionUploadTask
注意:及時(shí)釋放 session
8.網(wǎng)絡(luò)監(jiān)測(cè)和網(wǎng)絡(luò)檢測(cè)
網(wǎng)絡(luò)監(jiān)測(cè):屬于被動(dòng)響應(yīng)景醇,當(dāng)網(wǎng)絡(luò)狀態(tài)有變化時(shí)臀稚,能自動(dòng)觸發(fā)相應(yīng)的方法或通知∪担可以實(shí)現(xiàn)的工具有AFN和Reachability吧寺。
網(wǎng)絡(luò)檢測(cè):主動(dòng)檢測(cè)網(wǎng)絡(luò)的情況窜管,分析網(wǎng)絡(luò)連接的情況,基本在APP的網(wǎng)絡(luò)診斷功能中會(huì)用到稚机。有個(gè)比較好的第三方推薦下:LDNetDiagnoService_IOS,這里面基本的ping幕帆,域名解析,traceroute的功能都有了赖条。
9.網(wǎng)絡(luò)安全
(1). 網(wǎng)絡(luò)傳輸時(shí)不允許用明文傳輸敏感信息,敏感數(shù)據(jù)需加密(base64,對(duì)稱加密失乾,非對(duì)稱加密)
(2). 使用https,并且使用證書驗(yàn)證的方式發(fā)送請(qǐng)求纬乍。
(3).數(shù)據(jù)傳輸完整性校驗(yàn):MD5摘要算法
10.網(wǎng)絡(luò)優(yōu)化:?
(1).如果可以碱茁,使用http2.0會(huì)明顯減小網(wǎng)絡(luò)延遲(header壓縮和緩存,服務(wù)器推送減少請(qǐng)求仿贬,多路復(fù)用及請(qǐng)求的優(yōu)先級(jí)設(shè)置)
(2).合理使用網(wǎng)絡(luò)緩存纽竣,減少不必要的網(wǎng)絡(luò)請(qǐng)求,提高加載速度也節(jié)約了流量
(3).使用高效的數(shù)據(jù)交換格式茧泪,一般來(lái)說(shuō)Json比XML要更高效蜓氨,而PB又優(yōu)于Json。不過(guò)鑒于使用的方便性队伟,所以更多的開發(fā)者都選擇使用Json.
(4).資源優(yōu)化:盡可能的縮小傳輸數(shù)據(jù)穴吹,比如盡量使用webp代替PNG和JPG,因?yàn)橥瑯拥膱D片它的體積更小。
參考:
http://www.reibang.com/p/a470ab485e39
https://www.cnblogs.com/qishui/p/5428938.html
http://www.reibang.com/p/78964aac72d5
https://www.cnblogs.com/ziyi--caolu/p/8058577.html