iOS網(wǎng)絡(luò)相關(guān)問(wèn)題小結(jié)

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)典)

OSI 七層協(xié)議

1.2 TCP/IP 五層模型


TCP/IP 五層協(xié)議

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的區(qū)別

如上圖所示烂琴,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?

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嗜侮,一起剝皮案震驚了整個(gè)濱河市港令,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棘钞,老刑警劉巖缠借,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宜猜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)硝逢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門姨拥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人渠鸽,你說(shuō)我怎么就攤上這事叫乌。” “怎么了徽缚?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵憨奸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我凿试,道長(zhǎng)排宰,這世上最難降的妖魔是什么似芝? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮板甘,結(jié)果婚禮上党瓮,老公的妹妹穿的比我還像新娘。我一直安慰自己盐类,他們只是感情好寞奸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著在跳,像睡著了一般枪萄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上猫妙,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天呻引,我揣著相機(jī)與錄音,去河邊找鬼吐咳。 笑死逻悠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的韭脊。 我是一名探鬼主播童谒,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沪羔!你這毒婦竟也來(lái)了饥伊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蔫饰,失蹤者是張志新(化名)和其女友劉穎琅豆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篓吁,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茫因,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杖剪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冻押。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖盛嘿,靈堂內(nèi)的尸體忽然破棺而出洛巢,到底是詐尸還是另有隱情,我是刑警寧澤次兆,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布稿茉,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏漓库。R本人自食惡果不足惜恃慧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望米苹。 院中可真熱鬧糕伐,春花似錦、人聲如沸蘸嘶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)训唱。三九已至褥蚯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間况增,已是汗流浹背赞庶。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留澳骤,地道東北人歧强。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像为肮,于是被迫代替她去往敵國(guó)和親摊册。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容