iOS 面試全方位剖析 -- 網(wǎng)絡(luò)篇


這節(jié)涉及到的內(nèi)容

  • HTTP 協(xié)議
  • HTTPS 與網(wǎng)絡(luò)安全
  • TCP / UDP
  • DNS 解析
  • Session / Cookie

HTTP 協(xié)議

對 HTTP 的理解?
超文本傳輸協(xié)議,要講的內(nèi)容

  • 請求/響應(yīng)報(bào)文
  • 連接建立流程
  • HTTP的特點(diǎn)

請求/響應(yīng)報(bào)文

一般在回答面試官什么是 HTTP 的時(shí)候,第一點(diǎn)要回答的就是 請求/響應(yīng)報(bào)文的組成結(jié)構(gòu)

  • 請求報(bào)文的格式

三個(gè)部分 , 請求行
請求頭,都是以 key-value形式組成
實(shí)體主體 , GET 請求一般不帶有實(shí)體主體

  • 響應(yīng)報(bào)文的格式


三個(gè)部分 , 響應(yīng)行
請求頭,都是以 key-value形式組成
實(shí)體主體

GET 和 POST 方式的區(qū)別

比較初級的回答方式是下面這樣

  • GET 請求參數(shù)以 ? 分割拼接到 URL 后面 ,POST請求參數(shù)在 Body里面
  • GET 參數(shù)長度限制 2048 個(gè)字符 , POST一般沒有該限制
  • GET 請求不安全 , POST請求比較安全

比較高逼格的回答是這樣的
從語義的角度來回答
GET 獲取資源 ,安全的 , 冪等的 , 可緩存的
POST 處理資源 ,非安全的 ,非冪等的 , 非可緩存的

  • 安全性 : 不應(yīng)該引起 Server 端的任何狀態(tài)變化
  • 冪等行 : 同一個(gè)請求方法執(zhí)行多次和執(zhí)行一次的效果完全相同
  • 請求是否可以被緩存

狀態(tài)碼

都有哪些狀態(tài)碼,他們的含義是什么?
2xx : 比如 200 ,響應(yīng)成功
3xx : 比如301,302 一些網(wǎng)絡(luò)的重定向
4xx : 比如 401, 404 客戶端的請求本身存在某些問題
5xx : 比如501 ,502 Server 端本身存在異常

連接建立流程

比較經(jīng)典的三次握手,四次揮手

HTTP 的特點(diǎn)

無連接, 每次請求有一個(gè)建立連接和釋放連接的過程

我們可以通過 HTTP的持久連接方案來進(jìn)行 HTTP 無連接的一個(gè)補(bǔ)償


  • 非持久連接,在 Client 和 Server 的交互中,打開一個(gè) TCP 連接,進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)的傳輸,然后關(guān)閉這條 TCP 連接. 之后發(fā)送第二個(gè)請求的時(shí)候可能需要重新打開一個(gè) TCP 的連接 。 也就是說每次請求接口都需要重新建立一個(gè) TCP 連接,經(jīng)歷 三次握手 四次揮手.

  • 持久連接 , 打開一條 TCP 通道,之后可能在一定時(shí)間內(nèi), 多個(gè) HTTP 請求可能會(huì)在同一條鏈路上進(jìn)行請求和響應(yīng)的傳遞

持久連接涉及到 HTTP 的哪些頭部字段呢?

  • Connection : keep-alive 客戶端期許采用持久連接
  • time : 20 多長時(shí)間有效
  • max : 10 最多可以發(fā)生多少個(gè) HTTP 請求和響應(yīng)對

怎樣判斷一個(gè)請求是否結(jié)束?

在同一條 TCP上產(chǎn)生了多次 HTTP 請求,怎樣判斷前一個(gè)請求的結(jié)束

  • Content-length : 1024 , 發(fā)送一個(gè)請求的時(shí)候,Server 端會(huì)攜帶響應(yīng)數(shù)據(jù)的大小,通過 Content-length 來標(biāo)識,客戶端可以根據(jù)所接受數(shù)據(jù)的字節(jié)數(shù)是否到達(dá) Content-length 的值,到達(dá)了就說明全部接受完畢,既 HTTP 請求結(jié)束
  • 還有一種情況, 當(dāng)使用 POST 端進(jìn)行請求的時(shí)候 , 往往 Server 端需要多次響應(yīng)來返回給客戶端數(shù)據(jù), 我們可以通過 HTTP 響應(yīng)報(bào)文當(dāng)中的頭部字段叫 chunked 來判斷請求是否結(jié)束,當(dāng)有多個(gè)塊通過 HTTP 的 TCP連接傳輸給客戶端的時(shí)候,每一個(gè)報(bào)文都會(huì)帶有chunked 這個(gè)字段, 最后一個(gè)塊會(huì)帶有一個(gè)空 chunked,這樣就可以判斷前一個(gè)網(wǎng)絡(luò)請求是否結(jié)束了.

無狀態(tài)

對 HTTP 協(xié)議無狀態(tài)特點(diǎn)的補(bǔ)償. Cookie / Session

cookie

主要用來記錄用戶狀態(tài),區(qū)分用戶, 狀態(tài)保存在客戶端。

客戶端發(fā)送的 Cookie 在 http 請求報(bào)文的 Coolie首部字段中
服務(wù)器端設(shè)置 http 響應(yīng)報(bào)文的 Set-Cookie 首部字段

如何保證 Cookie的安全

  • 對 Cookie 進(jìn)行加密處理
  • 只在https 上攜帶 Cookie
  • 設(shè)置 Cookie 為httpOnly,防止跨站腳本攻擊
Session

主要用來記錄用戶狀態(tài),區(qū)分用戶, 狀態(tài)保存在服務(wù)器端。
Session 需要依賴于Cookie 機(jī)制

看一下 Session 的工作流程圖



HTTPS 與網(wǎng)絡(luò)安全

HTTPS = HTTP + SSL/TLS

HTTPS 連接的建立流程是怎樣的?

我們看一幅時(shí)序圖


會(huì)話秘鑰 = random S + random C + 預(yù)主秘鑰

HTTPS都使用了哪些加密手段?為什么?

  • 連接建立過程中使用非對稱加密,很耗時(shí)
  • 后續(xù)通信過程中使用對稱加密

非對稱加密

對稱加密


TCP/UDP

傳輸層協(xié)議

  • TCP, 傳輸控制協(xié)議
  • UDP,用戶數(shù)據(jù)報(bào)協(xié)議 無連接,盡最大努力交付

TCP特點(diǎn)

面向連接,可靠傳輸,面向字節(jié)流,流量控制,擁塞控制

面向連接

數(shù)據(jù)傳輸開始之前,需要建立連接(三次握手)。 數(shù)據(jù)傳輸結(jié)束之后,需要釋放連接(四次揮手)

可靠傳輸

TCP如何保證可靠傳輸呢?

  • 無差錯(cuò)
  • 不丟失
  • 不重復(fù)

面向字節(jié)流

不管發(fā)送方一次性提交給 TCP 的緩沖是多大的數(shù)據(jù),對于TCP本身來說它會(huì)根據(jù)實(shí)際的情況來進(jìn)行劃分,比如發(fā)送方發(fā)送10字節(jié),TCP 并不是一次性傳遞10字節(jié)數(shù)據(jù),它可能是拆分成3個(gè)字節(jié)和7個(gè)字節(jié)分倆次發(fā)送給接收方

流量控制

基于滑動(dòng)窗口協(xié)議實(shí)現(xiàn).
什么是滑動(dòng)窗口協(xié)議? (新浪微博三面面試真題)


對照上圖,現(xiàn)在假如發(fā)送窗口是客戶端,接收窗口是服務(wù)端。當(dāng)我們現(xiàn)在要繼續(xù)發(fā)送數(shù)據(jù)的時(shí)候,可能由于接收方的接收窗口沒有那么大,而發(fā)送方的發(fā)送窗口非常大,就會(huì)以更快的速率往后發(fā),需要由接收窗口通過向TCP的報(bào)文首部字段中去更改窗口值去調(diào)整發(fā)送方的發(fā)送窗口大小。

擁塞控制

  • 慢開始,擁塞避免
  • 快恢復(fù),快重傳

橫軸代表 APP 交互或者輪循次數(shù),縱軸代表窗口值的大小

上圖中,一開始我們可以先發(fā)送一個(gè)報(bào)文,如果沒有發(fā)生網(wǎng)絡(luò)擁塞,就繼續(xù)發(fā)送 2 個(gè)報(bào)文,依然沒有發(fā)生網(wǎng)絡(luò)擁塞,就繼續(xù)翻倍,直到 16 個(gè)報(bào)文,這就是慢開始算法

當(dāng)?shù)竭_(dá) 16 報(bào)文數(shù)的時(shí)候,會(huì)采用擁塞避免的策略來進(jìn)行發(fā)送報(bào)文的一個(gè)數(shù)量的線性增長。

當(dāng)報(bào)文數(shù)到 24 的時(shí)候,就會(huì)發(fā)生網(wǎng)絡(luò)擁塞,采用擁塞避免的乘法減小到值發(fā)送 1 一個(gè)報(bào)文,來減少對網(wǎng)絡(luò)層面帶來的壓力,然后再重新開始 慢開始算法增長,同時(shí)限定一個(gè)新的門限值.


DNS 解析

DNS 解析是怎么的一個(gè)過程? (大廠常問的一個(gè)問題)
域名到IP地址的映射,DNS解析請求采用UDP數(shù)據(jù)報(bào),且明文

客戶端通過 DNS 協(xié)議向 DNS 服務(wù)器去請求相應(yīng)域名的解析,然后 DNS 服務(wù)器把解析結(jié)果的IP 地址返回給客戶端,再由客戶端向 IPServer進(jìn)行相應(yīng)的網(wǎng)絡(luò)請求

DNS 解析查詢方式

  • 遞歸查詢
  • 迭代查詢

DNS 解析存在哪些常見的問題 (重點(diǎn))

  • DNS 劫持問題
  • DNS 解析轉(zhuǎn)發(fā)問題

DNS 劫持

由于 DNS 解析過程采用 UDP 數(shù)據(jù)報(bào)明文傳輸,就會(huì)涉及到一個(gè)竊聽的問題。 假如現(xiàn)在有一個(gè)釣魚 DNS 服務(wù)器,就會(huì)劫持到對應(yīng)的一個(gè) DNS 解析的請求, 然后釣魚服務(wù)器返回給我們一個(gè)錯(cuò)誤的IP地址,此時(shí)拿這個(gè)錯(cuò)誤的IP地址去訪問的時(shí)候就是一個(gè)錯(cuò)誤的網(wǎng)站

DNS 劫持與 HTTP的關(guān)系是怎樣的?

這里給出明確的回答, 倆者是沒有關(guān)系的 ,完全是倆回事

DNS 解析發(fā)生在 HTTP 建立連接之前
DNS 解析請求使用 UDP 數(shù)據(jù)報(bào),端口號 53

怎樣解決 DNS 劫持


網(wǎng)絡(luò)篇面試總結(jié)

  • HTTP 中的GET和POST方式有什么區(qū)別 ?
  • HTTPS 連接建立流程是怎樣的 ?
  • TCP 和 UDP 有什么區(qū)別 ?
  • 簡述 TCP 的慢開始過程 ?
  • 客戶端怎樣避免 DNS 劫持 ?

轉(zhuǎn)載請標(biāo)明出處

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容