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