前言:
最近公司項(xiàng)目不怎么忙, 閑暇時(shí)間把iOS 在面試中可能會(huì)遇到的問(wèn)題整理了一番, 一部分題目是自己面試遇到的,一部分題目則是網(wǎng)上收錄的, 方便自己鞏固復(fù)習(xí), 也分享給大家! 知識(shí)點(diǎn)比較多,比較雜,這里做了分類(lèi),下面是分類(lèi)鏈接地址;
面試知識(shí)點(diǎn)整理 - 目錄:
iOS | 面試知識(shí)整理 - OC基礎(chǔ) (一)
iOS | 面試知識(shí)整理 - OC基礎(chǔ) (二)
iOS | 面試知識(shí)整理 - OC基礎(chǔ) (三)
iOS | 面試知識(shí)整理 - UI 相 關(guān) (四)
iOS | 面試知識(shí)整理 - 內(nèi)存管理 (五)
iOS | 面試知識(shí)整理 - 多 線(xiàn) 程 (六)
iOS | 面試知識(shí)整理 - 網(wǎng)絡(luò)相關(guān) (七)
iOS | 面試知識(shí)整理 - 數(shù)據(jù)持久化 (八)
iOS | 面試知識(shí)整理 - Swift 基礎(chǔ) (九)
iOS | 面試知識(shí)整理 - 網(wǎng)絡(luò)相關(guān) (七)
1.如何理解HTTP?
HTTP本質(zhì)上是一種協(xié)議,全稱(chēng)是Hypertext Transfer Protocol,即超文本傳輸協(xié)議。HTTP是一個(gè)基于TCP/IP通信協(xié)議來(lái)傳遞數(shù)據(jù), 該協(xié)議用于規(guī)定客戶(hù)端與服務(wù)端之間的傳輸規(guī)則,所傳輸?shù)膬?nèi)容不局限于文本(其實(shí)可以傳輸任意類(lèi)型的數(shù)據(jù))。
一次HTTP可以看做是一個(gè)事務(wù),其工作過(guò)程分為4步:
- 客戶(hù)端與服務(wù)器建立連接
- 建立連接后,客戶(hù)端給服務(wù)端發(fā)送請(qǐng)求
- 服務(wù)器收到消息后,給與響應(yīng)操作
- 客戶(hù)端收到消息后,展示到屏幕上,斷開(kāi)連接.
2.說(shuō)一下 http中的 get 和 post 區(qū)別?
- get 一般用于從服務(wù)端獲取數(shù)據(jù),post 用于向服務(wù)端發(fā)送數(shù)據(jù)
- get 參數(shù)拼接在 url 地址里面, post 參數(shù)則放在其包體里,post 比 get 稍安全,隱秘
- get 可以被緩存,可以存儲(chǔ)在瀏覽器瀏覽歷史中
3. 一次完整的HTTP請(qǐng)求過(guò)程?當(dāng)我們?cè)跒g覽器的地址欄輸入 'http://www.baidu.com ,然后回車(chē),回車(chē)這一瞬間到看到頁(yè)面到底發(fā)生了什么呢?
域名解析 --> 發(fā)起TCP的3次握手 --> 建立TCP連接后發(fā)起http請(qǐng)求 --> 服務(wù)器響應(yīng)http請(qǐng)求,瀏覽器得到html代碼 --> 瀏覽器解析html代碼,并請(qǐng)求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對(duì)頁(yè)面進(jìn)行渲染呈現(xiàn)給用戶(hù)
4.請(qǐng)求報(bào)文簡(jiǎn)要說(shuō)明?
請(qǐng)求報(bào)文主要包括: 請(qǐng)求行,請(qǐng)求頭,請(qǐng)求體
- 請(qǐng)求行: 請(qǐng)求行包含請(qǐng)求方法(Method)、請(qǐng)求統(tǒng)一資源標(biāo)識(shí)符(URI)、HTTP版本號(hào)
- 請(qǐng)求頭:請(qǐng)求頭主要存放對(duì)客戶(hù)端想給服務(wù)端的附加信息下Host: 目標(biāo)服務(wù)器的網(wǎng)絡(luò)地址 Accept: 讓服務(wù)端知道客戶(hù)端所能接收的數(shù)據(jù)類(lèi)型,如text/html /Content-Length: body的長(zhǎng)度 等等
- 請(qǐng)求體: 真正需要發(fā)給服務(wù)端的數(shù)據(jù)
5.響應(yīng)報(bào)文簡(jiǎn)要說(shuō)明?
響應(yīng)報(bào)文也包括三部分: 響應(yīng)行,響應(yīng)頭和響應(yīng)實(shí)體
1.狀態(tài)行 :是服務(wù)端返回給客戶(hù)端的狀態(tài)信息,包含HTTP版本號(hào)、狀態(tài)碼、狀態(tài)碼對(duì)應(yīng)的英文名稱(chēng)。
2.響應(yīng)頭: 附加信息和請(qǐng)求頭類(lèi)似
3.響應(yīng)體: 服務(wù)器返回的真正數(shù)據(jù)
6.HTTP的特點(diǎn)有什么?
HTTP 是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,HTTP 協(xié)議一共有五大特點(diǎn):
- 支持客戶(hù)/服務(wù)器模式。
- 簡(jiǎn)單快速:客戶(hù)向服務(wù)器請(qǐng)求服務(wù)時(shí),只需傳送請(qǐng)求方法和路徑。請(qǐng)求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶(hù)與服務(wù)器聯(lián)系的類(lèi)型不同。由于HTTP協(xié)議簡(jiǎn)單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。
- 靈活:HTTP允許傳輸任意類(lèi)型的數(shù)據(jù)對(duì)象。正在傳輸?shù)念?lèi)型由Content-Type(Content-Type是HTTP包中用來(lái)表示內(nèi)容類(lèi)型的標(biāo)識(shí))加以標(biāo)記。
- 無(wú)連接:無(wú)連接的含義是限制每次連接只處理一個(gè)請(qǐng)求。服務(wù)器處理完客戶(hù)的請(qǐng)求,并收到客戶(hù)的應(yīng)答后,即斷開(kāi)連接。采用這種方式可以節(jié)省傳輸時(shí)間。
- 無(wú)狀態(tài):HTTP協(xié)議是無(wú)狀態(tài)協(xié)議。無(wú)狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒(méi)有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。
7.常用的HTTP方法有哪些?
HTTP1.0定義了三種請(qǐng)求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五種請(qǐng)求方法: OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
- GET 請(qǐng)求指定的頁(yè)面信息,并返回實(shí)體主體。
- HEAD 類(lèi)似于get請(qǐng)求,只不過(guò)返回的響應(yīng)中沒(méi)有具體的內(nèi)容,用于獲取報(bào)頭
- POST 向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改。
- PUT 從客戶(hù)端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容。
- DELETE 請(qǐng)求服務(wù)器刪除指定的頁(yè)面。
- CONNECT HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
- OPTIONS 允許客戶(hù)端查看服務(wù)器的性能。
- TRACE 回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷。
8.TCP是什么?
- tcp(傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。是專(zhuān)門(mén)為了在不可靠的互聯(lián)網(wǎng)絡(luò)上提供一個(gè)可靠的端到端字節(jié)流而設(shè)計(jì)的,面向字節(jié)流。會(huì)有三次握手來(lái)建立連接,而且在數(shù)據(jù)傳遞時(shí),有確認(rèn). 窗口. 重傳. 擁塞控制機(jī)制,在數(shù)據(jù)傳完之后,還會(huì)斷開(kāi)來(lái)連接用來(lái)節(jié)約系統(tǒng)資源。
9.UDP是什么?
- UDP(用戶(hù)數(shù)據(jù)報(bào)協(xié)議)是與TCP相對(duì)應(yīng)的協(xié)議。它是面向非連接的協(xié)議,它不與對(duì)方建立連接,而是直接就把數(shù)據(jù)包發(fā)送過(guò)去!UDP適用于一次只傳送少量數(shù)據(jù)、對(duì)可靠性要求不高的應(yīng)用環(huán)境可以使用UDP
10.TCP和UDP區(qū)別
- TCP面向連接(三次握手);UDP是無(wú)連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接
- TCP提供可靠的服務(wù)。也就是說(shuō),通過(guò)TCP連接傳送的數(shù)據(jù),無(wú)差錯(cuò),不丟失,不重復(fù),且按序到達(dá);UDP盡最大努力交付,即不保證可靠交付, Tcp通過(guò)校驗(yàn)和,重傳控制,序號(hào)標(biāo)識(shí),滑動(dòng)窗口、確認(rèn)應(yīng)答實(shí)現(xiàn)可靠傳輸。如丟包時(shí)的重發(fā)控制,還可以對(duì)次序亂掉的分包進(jìn)行順序控制。
- UDP具有較好的實(shí)時(shí)性,工作效率比TCP高,適用于對(duì)高速傳輸和實(shí)時(shí)性有較高的通信或廣播通信。
- 每一條TCP連接只能是點(diǎn)到點(diǎn)的;UDP支持一對(duì)一,一對(duì)多,多對(duì)一和多對(duì)多的交互通信
- TCP對(duì)系統(tǒng)資源要求較多,UDP對(duì)系統(tǒng)資源要求較少。
11.什么是三次握手?
所謂三次握手(Three-Way Handshake)即建立TCP連接,是指建立一個(gè)TCP連接時(shí),需要客戶(hù)端和服務(wù)端總共發(fā)送3個(gè)包以確認(rèn)連接的建立。
- 第一次握手:客戶(hù)端發(fā)送 syn 包(syn=j)到服務(wù)器,并進(jìn)入 SYN_SEND 狀態(tài),等待服 務(wù)器確認(rèn);
- 第二次握手:服務(wù)器收到 syn 包,必須確認(rèn)客戶(hù)的 SYN(ack=j+1),同時(shí)自己也發(fā) 送一個(gè) SYN 包(syn=k),即 SYN+ACK 包,此時(shí)服務(wù)器進(jìn)入 SYN_RECV 狀態(tài);
- 第三次握手:客戶(hù)端收到服務(wù)器的 SYN+ACK 包,向服務(wù)器發(fā)送確認(rèn)包 ACK(ack=k+1), 此包發(fā)送完畢,客戶(hù)端和服務(wù)器進(jìn)入 ESTABLISHED 狀態(tài),完成三次握手。 握手過(guò)程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶(hù)端與服務(wù)器才正式開(kāi)始 傳送數(shù)據(jù)。
參考: http://www.cocoachina.com/programmer/20180314/22588.html
12.什么是四次揮手?
由于TCP連接是全雙工的,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉。這原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來(lái)終止這個(gè)方向的連接。收到一個(gè) FIN只意味著這一方向上沒(méi)有數(shù)據(jù)流動(dòng),一個(gè)TCP連接在收到一個(gè)FIN后仍能發(fā)送數(shù)據(jù)。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方執(zhí)行被動(dòng)關(guān)閉。
- TCP客戶(hù)端發(fā)送一個(gè)FIN,用來(lái)關(guān)閉客戶(hù)到服務(wù)器的數(shù)據(jù)傳送。
- 服務(wù)器收到這個(gè)FIN,它發(fā)回一個(gè)ACK,確認(rèn)序號(hào)為收到的序號(hào)加1。和SYN一樣,一個(gè)FIN將占用一個(gè)序號(hào)。
- 服務(wù)器關(guān)閉客戶(hù)端的連接,發(fā)送一個(gè)FIN給客戶(hù)端。
- 客戶(hù)端發(fā)回ACK報(bào)文確認(rèn),并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1。
13.什么是HTTTS?
HTTPS(全稱(chēng):Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本傳輸安全協(xié)議),是以安全為目標(biāo)的HTTP通道,簡(jiǎn)單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL。
14.HTTPS連接過(guò)程簡(jiǎn)述
- 客戶(hù)端向服務(wù)端發(fā)起 https 請(qǐng)求
- 服務(wù)器(需要申請(qǐng) ca 證書(shū)),返回證書(shū)(包含公鑰)給客戶(hù)端
- 客戶(hù)端使用根證書(shū)驗(yàn)證 服務(wù)器證書(shū)的有效性,進(jìn)行身份確認(rèn)
- 客戶(hù)端生成對(duì)稱(chēng)密鑰,通過(guò)公鑰進(jìn)行密碼,發(fā)送給服務(wù)器
- 服務(wù)器使用私鑰進(jìn)行 解密,獲取對(duì)稱(chēng)密鑰
- 雙發(fā)使用對(duì)稱(chēng)加密的數(shù)據(jù)進(jìn)行通信
15.什么是對(duì)稱(chēng)加密
對(duì)稱(chēng)加密是最快速、最簡(jiǎn)單的一種加密方式,加密(encryption)與解密(decryption)用的是同樣的密鑰(secret key)。對(duì)稱(chēng)加密有很多種算法,由于它效率很高,所以被廣泛使用在很多加密協(xié)議的核心當(dāng)中。
常見(jiàn)的有AES,DES,3DES等
16.非對(duì)稱(chēng)加密
非對(duì)稱(chēng)加密為數(shù)據(jù)的加密與解密提供了一個(gè)非常安全的方法,它使用了一對(duì)密鑰,公鑰(public key)和私鑰(private key)。私鑰只能由一方安全保管,不能外泄,而公鑰則可以發(fā)給任何請(qǐng)求它的人。非對(duì)稱(chēng)加密使用這對(duì)密鑰中的一個(gè)進(jìn)行加密,而解密則需要另一個(gè)密鑰。
常見(jiàn)的: RSA算法
17. http 與https區(qū)別
HTTPS和HTTP的區(qū)別主要為以下四點(diǎn):
- https協(xié)議需要到ca申請(qǐng)證書(shū),一般免費(fèi)證書(shū)很少,需要交費(fèi)。
- http是超文本傳輸協(xié)議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協(xié)議。
- http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
- http的連接很簡(jiǎn)單,是無(wú)狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全
18.說(shuō)一下Session 和 Cookie 的概念?
- Session 是服務(wù)器用來(lái)認(rèn)證,追蹤用戶(hù)的數(shù)據(jù)結(jié)構(gòu),通過(guò)判斷客戶(hù)端傳來(lái)的信息確定用戶(hù),確定用戶(hù)唯一標(biāo)志是客戶(hù)端傳來(lái)的 SessionId
- Cookie 是客戶(hù)端用來(lái)保存用戶(hù)信息的機(jī)制, 初次會(huì)話(huà)時(shí), http 協(xié)議會(huì)在 Cookie 里記錄一個(gè)SessionID,之后每次會(huì)話(huà)時(shí)把 SessionID發(fā)給服務(wù)器
- Session 一般用于用戶(hù)驗(yàn)證, 他默認(rèn)存儲(chǔ)在服務(wù)器的一個(gè)文件里, 當(dāng)然也可以存儲(chǔ)在內(nèi)存,數(shù)據(jù)庫(kù)里
- 若是客戶(hù)端禁用了Cookie, 則客戶(hù)端會(huì)用URL重寫(xiě)技術(shù),即會(huì)話(huà)時(shí)在URL的末尾加上 SessionID,發(fā)給服務(wù)器
19.什么Socket?
- 網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)連接的一端稱(chēng)為一個(gè)socket。
- 建立網(wǎng)絡(luò)通信連接至少要一對(duì)端口號(hào)(socket)。socket本質(zhì)是編程接口(API),對(duì)TCP/IP的封裝,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開(kāi)發(fā)所用的接口,這就是Socket編程接口;HTTP是轎車(chē),提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動(dòng)機(jī),提供了網(wǎng)絡(luò)通信的能力。
20.什么是DNS?
域名系統(tǒng)(DomainNameSystem,縮寫(xiě):DNS)是[互聯(lián)網(wǎng)]的一項(xiàng)服務(wù)。它作為將域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫(kù),能夠使人更方便地訪(fǎng)問(wèn)[互聯(lián)網(wǎng)]
21.DNS劫持問(wèn)題?
DNS劫持又稱(chēng)(域名劫持), 是指在劫持的網(wǎng)絡(luò)范圍內(nèi)攔截域名解析的請(qǐng)求,分析請(qǐng)求的域名,把審查范圍以外的請(qǐng)求放行,否則返回假的IP地址或者什么都不做使請(qǐng)求失去響應(yīng),其效果就是對(duì)特定的網(wǎng)絡(luò)不能訪(fǎng)問(wèn)或訪(fǎng)問(wèn)的是假網(wǎng)址。
解決辦法: 使用HTTPDNS
22.網(wǎng)絡(luò)七層是什么?
OSI模型有7層結(jié)構(gòu),每層都可以有幾個(gè)子層。 OSI的7層從上到下分別是 7 應(yīng)用層 6 表示層 5 會(huì)話(huà)層 4 傳輸層 3 網(wǎng)絡(luò)層 2 數(shù)據(jù)鏈路層 1 物理層 ;其中高層(即7、6、5、4層)定義了應(yīng)用程序的功能,下面3層(即3、2、1層)主要面向通過(guò)網(wǎng)絡(luò)的端到端的數(shù)據(jù)流。
- 應(yīng)用層
網(wǎng)絡(luò)服務(wù)與最終用戶(hù)的一個(gè)接口。
協(xié)議有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP - 表示層
數(shù)據(jù)的表示、安全、壓縮。(在五層模型里面已經(jīng)合并到了應(yīng)用層)
格式有,JPEG、ASCll、DECOIC、加密格式等
3 .會(huì)話(huà)層
建立、管理、終止會(huì)話(huà)。(在五層模型里面已經(jīng)合并到了應(yīng)用層)
對(duì)應(yīng)主機(jī)進(jìn)程,指本地主機(jī)與遠(yuǎn)程主機(jī)正在進(jìn)行的會(huì)話(huà) - 傳輸層
定義傳輸數(shù)據(jù)的協(xié)議端口號(hào),以及流控和差錯(cuò)校驗(yàn)。
協(xié)議有:TCP UDP,數(shù)據(jù)包一旦離開(kāi)網(wǎng)卡即進(jìn)入網(wǎng)絡(luò)傳輸層 - 網(wǎng)絡(luò)層
進(jìn)行邏輯地址尋址,實(shí)現(xiàn)不同網(wǎng)絡(luò)之間的路徑選擇。
協(xié)議有:ICMP IGMP IP(IPV4 IPV6) ARP RARP - 數(shù)據(jù)鏈路層
建立邏輯連接、進(jìn)行硬件地址尋址、差錯(cuò)校驗(yàn) [2] 等功能。(由底層網(wǎng)絡(luò)定義協(xié)議)
將比特組合成字節(jié)進(jìn)而組合成幀,用MAC地址訪(fǎng)問(wèn)介質(zhì),錯(cuò)誤發(fā)現(xiàn)但不能糾正。 - 物理層
建立、維護(hù)、斷開(kāi)物理連接。(由底層網(wǎng)絡(luò)定義協(xié)議)
23.項(xiàng)目中網(wǎng)絡(luò)層如何做安全處理?
- 盡量使用https
- 不要傳輸明文密碼
- Post并不比Get安全
- 不要使用301跳轉(zhuǎn)
- http請(qǐng)求都帶上MAC
- http請(qǐng)求使用臨時(shí)密鑰
- AES使用CBC模式
24.斷點(diǎn)續(xù)傳如何實(shí)現(xiàn)?
通過(guò)HTTP,可以非常方便的實(shí)現(xiàn)斷點(diǎn)續(xù)傳。
- 斷點(diǎn)續(xù)傳主要依賴(lài)于HTTP頭部定義的Range,應(yīng)用可以通過(guò)HTTP請(qǐng)求曾經(jīng)獲取失敗的資源的某一個(gè)返回或者部分來(lái)恢復(fù)下載該資源。當(dāng)然并不是所有風(fēng)服務(wù)器都支持Range,所以不支持Range的不在我們考慮之內(nèi)。Range是以字節(jié)計(jì)算的,請(qǐng)求的時(shí)候不比給我結(jié)尾字節(jié)數(shù),因?yàn)檎?qǐng)求方并不一定知道資源的大小。
通過(guò)這個(gè)關(guān)鍵字可以告訴服務(wù)器返回哪些數(shù)據(jù)給我。
比如:
- bytes=500-999 表示第500-第999字節(jié)
- bytes=500- 表示從第500字節(jié)往后的所有字節(jié)
- 然后我們?cè)俑鶕?jù)服務(wù)器返回的數(shù)據(jù),將得到的data數(shù)據(jù)拼接到文件后面,就可以實(shí)現(xiàn)斷點(diǎn)續(xù)傳了。
25.什么是WebSocket,解決了什么問(wèn)題?
WebSocket是應(yīng)用層第七層上的一個(gè)應(yīng)用層協(xié)議,它必須依賴(lài) HTTP 協(xié)議進(jìn)行一次握手 ,握手成功后,數(shù)據(jù)就直接從 TCP 通道傳輸,與 HTTP 無(wú)關(guān)了
Websocket的數(shù)據(jù)傳輸是frame形式傳輸?shù)?,比如?huì)將一條消息分為幾個(gè)frame,按照先后順序傳輸出去。這樣做會(huì)有幾個(gè)好處:
- 大數(shù)據(jù)的傳輸可以分片傳輸,不用考慮到數(shù)據(jù)大小導(dǎo)致的長(zhǎng)度標(biāo)志位不足夠的情況。
- 和http的chunk一樣,可以邊生成數(shù)據(jù)邊傳遞消息,即提高傳輸效率。
總之:WebSocket 的實(shí)現(xiàn)分為握手,數(shù)據(jù)發(fā)送/讀取,關(guān)閉連接。
26.什么是心跳?
- 心跳就是用來(lái)檢測(cè)TCP連接的雙方是否可用
- 客戶(hù)端發(fā)起心跳Ping(一般都是客戶(hù)端),假如設(shè)置在10秒后如果沒(méi)有收到回調(diào),那么說(shuō)明服務(wù)器或者客戶(hù)端某一方出現(xiàn)問(wèn)題,這時(shí)候我們需要主動(dòng)斷開(kāi)連接。
27.如何保證公鑰不被篡改?
- 解決方法:將公鑰放在數(shù)字證書(shū)中。只要證書(shū)是可信的,公鑰就是可信的。
28. 公鑰加密計(jì)算量太大,如何減少耗用的時(shí)間?
- 解決方法:每一次對(duì)話(huà)(session),客戶(hù)端和服務(wù)器端都生成一個(gè)"對(duì)話(huà)密鑰"(session key),用它來(lái)加密信息。由于"對(duì)話(huà)密鑰"是對(duì)稱(chēng)加密,所以運(yùn)算速度非常快,而服務(wù)器公鑰(非對(duì)稱(chēng)加密)只用于加密"對(duì)話(huà)密鑰"本身,這樣就減少了加密運(yùn)算的消耗時(shí)間。
29.AF中常駐線(xiàn)程的實(shí)現(xiàn)
使用單例創(chuàng)建線(xiàn)程 添加到runloop中,且加了一個(gè)NSMachPort,來(lái)防止這個(gè)新建的線(xiàn)程由于沒(méi)有活動(dòng)直接退出?!?使用MachPort配合RunLoop進(jìn)行線(xiàn)程?;睢?/p>
AF3.x為什么不再需要常駐線(xiàn)程?
NSURLConnection的一大痛點(diǎn)就是:發(fā)起請(qǐng)求后,這條線(xiàn)程并不能隨風(fēng)而去,而需要一直處于等待回調(diào)的狀態(tài)。
NSURLSession發(fā)起的請(qǐng)求,不再需要在當(dāng)前線(xiàn)程進(jìn)行代理方法的回調(diào)!可以指定回調(diào)的delegateQueue,這樣我們就不用為了等待代理回調(diào)方法而苦苦?;罹€(xiàn)程了。
同時(shí)還要注意一下,指定的用于接收回調(diào)的Queue的maxConcurrentOperationCount設(shè)為了1,這里目的是想要讓并發(fā)的請(qǐng)求串行的進(jìn)行回調(diào)。
為什么要串行回調(diào)?
- (AFURLSessionManagerTaskDelegate *)delegateForTask:(NSURLSessionTask *)task {
NSParameterAssert(task);
AFURLSessionManagerTaskDelegate *delegate = nil;
[self.lock lock];
//給所要訪(fǎng)問(wèn)的資源加鎖,防止造成數(shù)據(jù)混亂
delegate = self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)];
[self.lock unlock];
return delegate;
}
這邊對(duì) self.mutableTaskDelegatesKeyedByTaskIdentifier 的訪(fǎng)問(wèn)進(jìn)行了加鎖,目的是保證多線(xiàn)程環(huán)境下的數(shù)據(jù)安全
面試官可能會(huì)問(wèn)你:為什么AF3.0中需要設(shè)置self.operationQueue.maxConcurrentOperationCount = 1;而AF2.0卻不需要?
--->>>
AF3.0的operationQueue是用來(lái)接收NSURLSessionDelegate回調(diào)的,鑒于一些多線(xiàn)程數(shù)據(jù)訪(fǎng)問(wèn)的安全性考慮,設(shè)置了maxConcurrentOperationCount = 1來(lái)達(dá)到串行回調(diào)的效果
--->>>
AF2.0的operationQueue是用來(lái)添加operation并進(jìn)行并發(fā)請(qǐng)求的,所以不要設(shè)置為1。
30. XMPP是什么?
- XMPP 是一種基于XML的協(xié)議,XMPP是一個(gè)分散型通信網(wǎng)絡(luò)
- XMPP是一種基于標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的子集XML的協(xié)議,它繼承了在XML環(huán)境中靈活的發(fā)展性,XMPP有超強(qiáng)的擴(kuò)展性。XMPP中定義了三個(gè)角色,客戶(hù)端,服務(wù)端,網(wǎng)關(guān)。通信能夠在這個(gè)三者的任意兩個(gè)之間雙向發(fā)生,而他們的傳輸是XML流
- XMPP工作原理:所有從一個(gè)客戶(hù)端到另一個(gè)客戶(hù)端的消息和數(shù)據(jù)都要通過(guò)服務(wù)端
- XMPP允許建立并行的TCP套接字鏈接對(duì)所有連接上的客戶(hù)端和服務(wù)器端。持久的套接字的連接使得XMPP能夠更有效的支持高級(jí)的具有存在能力的應(yīng)用在帶寬和處理資源的使用中。
小結(jié):
而XMPP的核心部分就是一個(gè)在網(wǎng)絡(luò)上分片斷發(fā)送XML的流協(xié)議。這個(gè)流協(xié)議是XMPP的即時(shí)通訊指令的傳遞基礎(chǔ),也是一個(gè)非常重要的可以被進(jìn)一步利用的網(wǎng)絡(luò)基礎(chǔ)協(xié)議。所以可以說(shuō),XMPP用TCP傳的是XML流。
31.MAC地址和ip地址的區(qū)別?
- MAC地址就是在媒體接入層上使用的地址,也叫物理地址、硬件地址或鏈路地址,由網(wǎng)絡(luò)設(shè)備制造商生產(chǎn)時(shí)寫(xiě)在硬件內(nèi)部。
- IP即指使用TCP/IP協(xié)議指定給主機(jī)的32位地址。IP地址由用點(diǎn)分隔開(kāi)的4個(gè)8八位組構(gòu)成,如192.168.0.1就是一個(gè)IP地址,這種寫(xiě)法叫點(diǎn)分十進(jìn)制格式。
- IP地址相當(dāng)于你現(xiàn)在所處的地址,會(huì)隨著你的移動(dòng)發(fā)生改變,而mac地址相當(dāng)于你的身份證號(hào)這些個(gè)人信息,是獨(dú)一無(wú)二的,不會(huì)改變的。
32 .抓包工具抓取HTTPS的原理
需要做的事情是對(duì)客戶(hù)端偽裝服務(wù)端,對(duì)服務(wù)端偽裝客戶(hù)端,具體
- 截獲真實(shí)客戶(hù)端的HTTPS請(qǐng)求,偽裝客戶(hù)端向真實(shí)服務(wù)端發(fā)送HTTPS請(qǐng)求
- 接受真實(shí)服務(wù)器響應(yīng),用Charles自己的證書(shū)偽裝服務(wù)端向真實(shí)客戶(hù)端發(fā)送數(shù)據(jù)內(nèi)容
沒(méi)有配置HTTPS 證書(shū)時(shí),雖然是HTTPS請(qǐng)求確是能抓到數(shù)據(jù),如果APP內(nèi)配置了https證書(shū),就抓不到數(shù)據(jù)了,
33.Ping是什么協(xié)議
ping也屬于一個(gè)通信協(xié)議,是TCP/IP協(xié)議的一部分。利用“ping”命令可以檢查網(wǎng)絡(luò)是否連通,
PING (Packet Internet Groper),因特網(wǎng)包探索器,用于測(cè)試網(wǎng)絡(luò)連接量的程序。Ping發(fā)送一個(gè)ICMP(Internet Control Messages Protocol)即因特網(wǎng)信報(bào)控制協(xié)議;回聲請(qǐng)求消息給目的地并報(bào)告是否收到所希望的ICMPecho (ICMP回聲應(yīng)答)。它是用來(lái)檢查網(wǎng)絡(luò)是否通暢或者網(wǎng)絡(luò)連接速度的命令。作為一個(gè)生活在網(wǎng)絡(luò)上的管理員或者黑客來(lái)說(shuō),ping命令是第一個(gè)必須掌握的DOS命令,它所利用的原理是這樣的:利用網(wǎng)絡(luò)上機(jī)器IP地址的唯一性,給目標(biāo)IP地址發(fā)送一個(gè)數(shù)據(jù)包,再要求對(duì)方返回一個(gè)同樣大小的數(shù)據(jù)包來(lái)確定兩臺(tái)網(wǎng)絡(luò)機(jī)器是否連接相通,時(shí)延是多少。