2019 iOS面試題大全---全方面剖析面試
2019 iOS面試題-----網(wǎng)絡(luò)相關(guān)之HTTP協(xié)議
2019 iOS面試題-----網(wǎng)絡(luò)相關(guān)之HTTPS倦零、對(duì)稱(chēng)加密误续、非對(duì)稱(chēng)加密
2019 iOS面試-----一個(gè)基于UDP的簡(jiǎn)單的聊天Demo(用C語(yǔ)言、python扫茅、GCDAsyncUdpSocket來(lái)實(shí)現(xiàn)UDP通信)
2019 iOS面試題-----網(wǎng)絡(luò)相關(guān)之UDP的特點(diǎn)蹋嵌、UDP的報(bào)文結(jié)構(gòu)及差錯(cuò)檢測(cè)
2019 iOS面試題-----網(wǎng)絡(luò)相關(guān)之TCP、三次握手葫隙、四次揮手栽烂、代碼實(shí)現(xiàn)
2019 iOS面試題-----網(wǎng)絡(luò)相關(guān)之TCP進(jìn)階:可靠數(shù)據(jù)傳輸、流量控制(滑動(dòng)窗口)恋脚、擁塞控制
2019 iOS面試題-----網(wǎng)絡(luò)相關(guān)之DNS
2019 iOS面試題-----網(wǎng)絡(luò)相關(guān)之Cookie和Session
2019 iOS面試題-----網(wǎng)絡(luò)相關(guān)之IP協(xié)議腺办、IP數(shù)據(jù)報(bào)分片、IPv4編址糟描、網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)
2019 iOS面試題-----網(wǎng)絡(luò)相關(guān)之IPv6怀喉、從IPv4到IPv6的遷移
之前有說(shuō)到OSI七層協(xié)議中的應(yīng)用層(HTTP協(xié)議)、傳輸層(TCP協(xié)議船响、UDP協(xié)議)躬拢,在傳輸層之上就是網(wǎng)絡(luò)層,網(wǎng)絡(luò)層負(fù)責(zé)IP數(shù)據(jù)報(bào)的產(chǎn)生以及IP數(shù)據(jù)包在邏輯網(wǎng)絡(luò)上的路由轉(zhuǎn)發(fā)见间,網(wǎng)絡(luò)層分為三個(gè)組件:
-
1估灿、IP協(xié)議
-
2、路由選擇協(xié)議缤剧,它決定了數(shù)據(jù)報(bào)從源到目的地所流經(jīng)的路徑
-
3、ICMP協(xié)議 (Internet Control Message Protocol, 因特網(wǎng)控制報(bào)文協(xié)議)域慷,報(bào)告數(shù)據(jù)報(bào)中的差錯(cuò)和對(duì)某些網(wǎng)路層信息請(qǐng)求進(jìn)行響應(yīng)對(duì)設(shè)施荒辕。
網(wǎng)絡(luò)層和傳輸層的區(qū)別
- 網(wǎng)絡(luò)層只是根據(jù)網(wǎng)絡(luò)地址將源結(jié)點(diǎn)發(fā)出的數(shù)據(jù)包傳送到目的結(jié)點(diǎn)(點(diǎn)到點(diǎn)),其主要任務(wù)是:通過(guò)路由選擇算法犹褒,為報(bào)文或分組通過(guò)通信子網(wǎng)選擇最適當(dāng)?shù)穆窂降种稀T搶涌刂茢?shù)據(jù)鏈路層與傳輸層之間的信息轉(zhuǎn)發(fā),建立叠骑、維持和終止網(wǎng)絡(luò)的連接李皇。具體地說(shuō),數(shù)據(jù)鏈路層的數(shù)據(jù)在這一層被轉(zhuǎn)換為數(shù)據(jù)包宙枷,然后通過(guò)路徑選擇掉房、分段組合、順序慰丛、進(jìn)/出路由等控制卓囚,將信息從一個(gè)網(wǎng)絡(luò)設(shè)備傳送到另一個(gè)網(wǎng)絡(luò)設(shè)備。
即網(wǎng)絡(luò)層提供了主機(jī)之間的邏輯通信
- 而傳輸層則負(fù)責(zé)將數(shù)據(jù)可靠地傳送到相應(yīng)的端口(端到端)诅病,傳輸層提供了主機(jī)應(yīng)用程序進(jìn)程之間的端到端的服務(wù)哪亿。傳輸層利用網(wǎng)絡(luò)層提供的服務(wù)粥烁,并通過(guò)傳輸層地址提供給高層用戶傳輸數(shù)據(jù)的通信端口,使高層用戶看到的只是在兩個(gè)傳輸實(shí)體間的一條端到端的蝇棉、可由用戶控制和設(shè)定的讨阻、可靠的數(shù)據(jù)通路。
即傳輸層為運(yùn)行在不同主機(jī)上的進(jìn)程之間提供了邏輯通信
一篡殷、IP協(xié)議
IP協(xié)議是TCP/IP核心協(xié)議钝吮。
1、IP協(xié)議的數(shù)據(jù)報(bào)格式(IPv4)
版本號(hào)
規(guī)定了數(shù)據(jù)報(bào)的IP協(xié)議版本(IPv4還是IPv6)贴唇。不同的IP版本使用不同的數(shù)據(jù)報(bào)格式 搀绣,上圖是IPv4的數(shù)據(jù)報(bào)格式首部長(zhǎng)度
大多數(shù)IP數(shù)據(jù)報(bào)不包含選項(xiàng),所以一般IP數(shù)據(jù)報(bào)具有20字節(jié)的首部戳气。服務(wù)類(lèi)型
使不同類(lèi)型的IP數(shù)據(jù)報(bào)能相互區(qū)別開(kāi)來(lái)链患。數(shù)據(jù)報(bào)長(zhǎng)度
整個(gè)IP數(shù)據(jù)報(bào)的長(zhǎng)度,利用首部長(zhǎng)度和總長(zhǎng)度就可以是算出IP數(shù)據(jù)報(bào)中數(shù)據(jù)內(nèi)容的起始地址瓶您。該字段長(zhǎng)度為16比特麻捻,所以IP數(shù)據(jù)報(bào)最長(zhǎng)可達(dá)2^16=65535
字節(jié),而事實(shí)上呀袱,數(shù)據(jù)報(bào)很少有超過(guò)1500
字節(jié)的標(biāo)識(shí)贸毕、標(biāo)志、片偏移字段
這三個(gè)字段與IP分片有關(guān)夜赵。此外明棍,IPv6不允許在路由器上對(duì)分組分片生存時(shí)間TTL
用來(lái)確保數(shù)據(jù)報(bào)不會(huì)永遠(yuǎn)在網(wǎng)絡(luò)中循環(huán)。設(shè)置該數(shù)據(jù)報(bào)可以經(jīng)過(guò)的最多的路由器數(shù)寇僧。指定了數(shù)據(jù)報(bào)的生存時(shí)間摊腋,經(jīng)過(guò)一個(gè)路由器,它的值就減1嘁傀,當(dāng)該字段為0時(shí)兴蒸,數(shù)據(jù)報(bào)就被丟棄
- 協(xié)議
該字段只有在一個(gè)IP數(shù)據(jù)報(bào)到達(dá)其目的地才有用。該字段值指示了IP數(shù)據(jù)報(bào)的數(shù)據(jù)部分應(yīng)交給哪個(gè)特定的傳輸層協(xié)議细办,比如橙凳,值為6表明要交給TCP,而值為17則表明要交給UDP
首部檢驗(yàn)和
與UDP/TCP的檢驗(yàn)和不同笑撞,這個(gè)字段只檢驗(yàn)數(shù)據(jù)報(bào)的首部岛啸,不包括數(shù)據(jù)部分。選項(xiàng)字段
是一個(gè)可變長(zhǎng)字段娃殖,選項(xiàng)字段一直以4字節(jié)作為界限值戳。這樣就可以保證首部始終是4字節(jié)的整數(shù)倍。很少被用到源IP和目的IP
記錄源IP地址炉爆,目的IP地址
- 數(shù)據(jù)
二堕虹、IP數(shù)據(jù)報(bào)分片
一個(gè)鏈路層幀能承載的最大數(shù)據(jù)量叫做最大傳送單元(Maximun Transmission Unit,MTU),即鏈路層的MTU限制著IP數(shù)據(jù)報(bào)的長(zhǎng)度卧晓。
問(wèn)題是在不同的鏈路上,可能使用不同的鏈路層協(xié)議赴捞,且每種協(xié)議可能具有不同的MTU逼裆。
假定在某條鏈路上收到一個(gè)IP數(shù)據(jù)報(bào),通過(guò)檢查轉(zhuǎn)發(fā)表確定出鏈路
赦政,且出鏈路的MTU比該IP數(shù)據(jù)報(bào)的長(zhǎng)度要小胜宇,如何將這個(gè)過(guò)大的IP數(shù)據(jù)報(bào)壓縮進(jìn)鏈路層幀的有效載荷字段呢?
解決方案就是分片:將IP數(shù)據(jù)報(bào)中的數(shù)據(jù)分片為兩個(gè)或更多個(gè)較小的IP數(shù)據(jù)報(bào)恢着,用單獨(dú)的鏈路層幀封裝這些較小的IP數(shù)據(jù)報(bào)桐愉,然后向出鏈路上發(fā)送這些幀,每個(gè)這些較小的數(shù)據(jù)都稱(chēng)為片(fragment)掰派。
片在到達(dá)目的地傳輸層前需要重新組裝从诲。
實(shí)際上,TCP和UDP都希望從網(wǎng)絡(luò)層上收到完整的未分片的報(bào)文靡羡。IPv4的數(shù)據(jù)報(bào)重組工作是在端系統(tǒng)中系洛,而不是在網(wǎng)絡(luò)路由器中。
當(dāng)一臺(tái)目的主機(jī)從相同源收到一系列數(shù)據(jù)時(shí)略步,需要確定這些數(shù)據(jù)報(bào)中的某些是否是一些原來(lái)較大的數(shù)據(jù)報(bào)中的片描扯。而如果是片的話,需要進(jìn)一步確定何時(shí)收到最后一片趟薄,并且如何將這些片拼接到一起以形成初始的數(shù)據(jù)報(bào)绽诚。從而就用到了前邊說(shuō)到的IPv4數(shù)據(jù)報(bào)首部中的標(biāo)識(shí)、標(biāo)志杭煎、片偏移 字段憔购。
- 1、當(dāng)生成一個(gè)數(shù)據(jù)報(bào)時(shí)岔帽,發(fā)送主機(jī)在為該數(shù)據(jù)報(bào)設(shè)置
源和目的地址
的同時(shí)在貼上標(biāo)識(shí)號(hào)
,發(fā)送主機(jī)通常將為它發(fā)送的每個(gè)數(shù)據(jù)報(bào)標(biāo)識(shí)號(hào)
加1- 2、當(dāng)某路由器需要對(duì)一個(gè)數(shù)據(jù)報(bào)分片時(shí)导绷,形成的每個(gè)數(shù)據(jù)報(bào)(即片)具有初始數(shù)據(jù)報(bào)的
源地址
犀勒、目的地址
和標(biāo)識(shí)號(hào)
- 3、當(dāng)目的地從同一發(fā)送主機(jī)收到一系列數(shù)據(jù)報(bào)時(shí)妥曲,它能夠檢查數(shù)據(jù)報(bào)的
標(biāo)識(shí)號(hào)
以確定哪些數(shù)據(jù)報(bào)實(shí)際上是同一較大數(shù)據(jù)報(bào)的片- 4贾费、由于IP協(xié)議是不可靠服務(wù),一個(gè)或者多個(gè)片可能永遠(yuǎn)到達(dá)不了目的地檐盟。為了讓目的主機(jī)絕對(duì)相信它已收到初始數(shù)據(jù)報(bào)的最后一個(gè)片褂萧,最后一個(gè)片的
標(biāo)志比特
被設(shè)為0,其余被設(shè)為1- 5葵萎、為了讓目的主機(jī)確定是否丟失了一個(gè)片导犹,并且能按照正確的順序重新組裝片唱凯,使用
偏移字段
指定該片應(yīng)放在初始IP數(shù)據(jù)報(bào)的哪個(gè)位置>
此外衅谷,如果有一個(gè)片或者多個(gè)片未能到達(dá)株搔,則該不完整的數(shù)據(jù)報(bào)將會(huì)被丟棄且不會(huì)交給傳輸層。但如果傳輸層正使用著TCP钱雷,則TCP將通過(guò)讓源以初始數(shù)據(jù)來(lái)重傳數(shù)據(jù)节猿。因?yàn)镮P層沒(méi)有超時(shí)重傳機(jī)制票从,所以會(huì)重傳整個(gè)數(shù)據(jù)報(bào),而不是某個(gè)片
三滨嘱、IPv4編址
1峰鄙、IP地址
一臺(tái)主機(jī)通常只有一條鏈路連接到網(wǎng)絡(luò),當(dāng)主機(jī)上的IP想發(fā)送一條數(shù)據(jù)報(bào)時(shí)太雨,就在該鏈路上發(fā)送吟榴。主機(jī)與物理鏈路之間的邊界叫做接口(interface)。
而路由器的任務(wù)是從鏈路上接收數(shù)據(jù)報(bào)并從某些其他鏈路轉(zhuǎn)發(fā)出去躺彬,路由器必須有兩條或更多鏈路與其連接煤墙,路由器與它的任意一條鏈路之間的邊界也叫做接口
。即一臺(tái)路由器會(huì)有多個(gè)接口
宪拥,每個(gè)接口
有其鏈路仿野。
因?yàn)槊颗_(tái)主機(jī)與路由器都能發(fā)送和接收IP數(shù)據(jù)報(bào),IP要求每臺(tái)主機(jī)和路由器接口
都有自己的IP地址她君。因此脚作,一個(gè)IP地址技術(shù)上是與一個(gè)接口
相關(guān)聯(lián)的,而不是與包括該接口的主機(jī)或路由器相關(guān)聯(lián)的缔刹。
2球涛、子網(wǎng)
每個(gè)IP地址(IPv4)長(zhǎng)度為32比特(4字節(jié)),按點(diǎn)分十進(jìn)制記法書(shū)寫(xiě)校镐,即地址中的每個(gè)字節(jié)都用它的十進(jìn)制形式書(shū)寫(xiě)亿扁,各字節(jié)間以點(diǎn).
隔開(kāi),比如193.32.122.30
在因特網(wǎng)上的每臺(tái)主機(jī)和路由器上的每個(gè)接口鸟廓,必須有一個(gè)全球唯一的IP地址(NAT后的接口除外)从祝。這些地址不能自由選擇,一個(gè)接口的IP地址的一部分需要由其連接的子網(wǎng)來(lái)決定引谜。
如圖牍陌,一臺(tái)路由器有三個(gè)接口,連接7臺(tái)主機(jī)员咽。左側(cè)的三臺(tái)主機(jī)以及連接它們的路由器的接口毒涧,都有一個(gè)形如
223.1.1.x
的IP地址。即在它們的IP地址中贝室,最左側(cè)的24
比特是相同的契讲。互聯(lián)左側(cè)這三個(gè)主機(jī)接口與1個(gè)路由器接口的網(wǎng)絡(luò)形成1個(gè)子網(wǎng)(subnet)(也被稱(chēng)為IP網(wǎng)絡(luò)或直接稱(chēng)為網(wǎng)絡(luò))仿吞。IP編址為這個(gè)子網(wǎng)分配一個(gè)地址:
223.1.1.0/24
,其中的/24
記法怀泊,有時(shí)稱(chēng)為子網(wǎng)掩碼(network mask)茫藏,指示了32比特中的最左側(cè)24
比特定義了子網(wǎng)地址。任何連接到該子網(wǎng)的主機(jī)都要求其地址具有223.1.1.x
的形式霹琼。同樣圖中下側(cè)和右側(cè)也是子網(wǎng)务傲,分別為223.1.3.0/24
和223.1.2.0/24
上圖顯示了3臺(tái)通過(guò)點(diǎn)對(duì)點(diǎn)鏈路彼此互聯(lián)的路由器,這里出現(xiàn)了6個(gè)子網(wǎng)枣申。
一個(gè)具有多個(gè)以太網(wǎng)段和點(diǎn)對(duì)點(diǎn)鏈路的組織將具有多個(gè)子網(wǎng)售葡,在給定子網(wǎng)上的所有設(shè)備都具有相同的子網(wǎng)地址。
雖然在理論上來(lái)說(shuō)忠藤,不同子網(wǎng)可以有完全不同的子網(wǎng)地址挟伙。但上圖可以看出,這6個(gè)子網(wǎng)在前16個(gè)比特是一致的模孩,都是
223.1
3尖阔、無(wú)類(lèi)別域間路由選擇(CIDR)
因特網(wǎng)的地址分配策略被稱(chēng)為無(wú)類(lèi)別域間路由選擇(CIDR)(也被稱(chēng)為無(wú)分類(lèi)編址
,以區(qū)分于分類(lèi)編址
)榨咐。對(duì)于子網(wǎng)尋址介却,32比特的IP地址被分為兩部分,也是點(diǎn)分十進(jìn)制數(shù)形式a.b.c.d/x
块茁,其中x指示了地址的第一部分中的比特?cái)?shù)齿坷,又被稱(chēng)為該地址的前綴(prefix)。
一個(gè)組織通常被分配一塊連續(xù)的地址数焊,即具有相同前綴的地址永淌。在該組織外的的路由器僅考慮前面的前綴比特x,這相當(dāng)大地減少了在這些路由器中轉(zhuǎn)發(fā)表的長(zhǎng)度佩耳,形式為a.b.c.d/x
單一表項(xiàng)足以將數(shù)據(jù)報(bào)轉(zhuǎn)發(fā)到該組織內(nèi)的任何目的地遂蛀。
如圖,
200.23.16.0/20
下有8個(gè)組織干厚,分別是200.23.16.0/23
到200.23.30.0/23
答恶,每個(gè)組織有自己的子網(wǎng)。而外界不需要知道這8個(gè)組織萍诱。這種使用單個(gè)網(wǎng)絡(luò)前綴通告多個(gè)網(wǎng)絡(luò)的能力通常稱(chēng)為地址聚合,也稱(chēng)為路由聚合或路由摘要
4污呼、分類(lèi)編址
在CIDR被采用之前裕坊,IP地址的網(wǎng)絡(luò)部分被限制長(zhǎng)度為8、16燕酷、24比特籍凝,也就是分類(lèi)編址(classful addressing)周瞎。具有8、16饵蒂、24比特子網(wǎng)地址的子網(wǎng)被稱(chēng)為A声诸、B
和C
類(lèi)網(wǎng)絡(luò)。
一個(gè)C類(lèi)(/24)
子網(wǎng)既能容納2 - 2 = 254臺(tái)主機(jī)(其中兩個(gè)地址預(yù)留用于特殊用途)退盯,這對(duì)于很多組織來(lái)說(shuō)都太小了彼乌。
而一個(gè)B類(lèi)(/16)
子網(wǎng)可支持多達(dá)2 - 2 = 65534臺(tái)主機(jī),又太大了渊迁。
在分類(lèi)編址方法下慰照,一個(gè)有2000
臺(tái)主機(jī)的組織通常被分給一個(gè)B類(lèi)(/16)地址,那么剩下的6萬(wàn)多個(gè)地址就浪費(fèi)掉了琉朽。這就會(huì)導(dǎo)致B類(lèi)地址空間的迅速損耗以及所分配的地址空間的利用率低毒租。
此外,255.255.255.255
是IP廣播地址箱叁,當(dāng)一臺(tái)主機(jī)發(fā)出一個(gè)目的地址為該地址的數(shù)據(jù)報(bào)時(shí)墅垮,該報(bào)文會(huì)交付給同一個(gè)網(wǎng)絡(luò)中的所有主機(jī)。
5耕漱、獲取主機(jī)地址
某組織一旦獲得了一塊地址算色,它就可為本組織內(nèi)的主機(jī)與路由器逐一分配IP地址。系統(tǒng)管理員通常手工配置路由器中的IP地址孤个。主機(jī)地址也能手動(dòng)配置剃允,但更多使用的是動(dòng)態(tài)主機(jī)配置協(xié)議(DHCP)。DHCP允許主機(jī)自動(dòng)獲取IP地址齐鲤。網(wǎng)絡(luò)管理員可以配置DHCP斥废,以使某給定主機(jī)每次與網(wǎng)絡(luò)連接時(shí)能得到一個(gè)相同的IP地址,或者某主機(jī)將被分配一個(gè)臨時(shí)的IP地址给郊,該地址在每次與網(wǎng)絡(luò)連接時(shí)也許是不同的牡肉。
6、網(wǎng)絡(luò)地址轉(zhuǎn)換
每個(gè)IP地址(IPv4)長(zhǎng)度為32比特(4字節(jié))淆九,因此總共有2個(gè)可能的IP地址统锤,約為40億個(gè)。在互聯(lián)網(wǎng)越來(lái)越普及的當(dāng)下炭庙,個(gè)人計(jì)算機(jī)及智能手機(jī)等越來(lái)越多饲窿,這些IP地址顯然無(wú)法滿足人們的需求。
為了解決IP地址不足的問(wèn)題焕蹄,于是就有了網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translation逾雄, NAT),它的思想就是給一個(gè)局域網(wǎng)絡(luò)分配一個(gè)IP地址就夠了,對(duì)于這個(gè)網(wǎng)絡(luò)內(nèi)的主機(jī)鸦泳,則分配私有地址银锻,這些私有地址對(duì)外是不可見(jiàn)的,他們對(duì)外的通信都要借助那個(gè)唯一分配的IP地址做鹰。
如果從廣域網(wǎng)到達(dá)NAT路由器
的所有數(shù)據(jù)報(bào)都有相同的目的IP地址击纬,那么該路由器如何知道是發(fā)送給哪個(gè)內(nèi)部主機(jī)的呢?其原理就是使用在NAT路由器上的一張NAT轉(zhuǎn)換表钾麸,并在該表內(nèi)包含了端口號(hào)及其IP地址更振。
假設(shè)一臺(tái)主機(jī)向廣域網(wǎng)請(qǐng)求數(shù)據(jù),
NAT路由器
收到該數(shù)據(jù)報(bào)喂走,會(huì)為該數(shù)據(jù)報(bào)生成一個(gè)新的端口號(hào)替換掉源端口號(hào)殃饿,并將源IP替換為其廣域網(wǎng)一側(cè)接口的IP地址。當(dāng)生成一個(gè)新的源端口號(hào)時(shí)芋肠,該端口號(hào)可以是任意一個(gè)當(dāng)前未在NAT轉(zhuǎn)換表
中的源端口號(hào)(端口號(hào)字段是16比特乎芳,意味著NAT協(xié)議
可以支持超過(guò)60000
個(gè)并行使用路由器廣域網(wǎng)一側(cè)IP地址的連接),路由器中的NAT也在其NAT轉(zhuǎn)換表中
增加一表項(xiàng)帖池。該
NAT路由器
收到廣域網(wǎng)返回的數(shù)據(jù)時(shí)奈惑,路由器使用目的IP地址與目的端口號(hào)從NAT轉(zhuǎn)換表
中檢索出該主機(jī)使用的IP地址和目的端口號(hào),改寫(xiě)該數(shù)據(jù)報(bào)的目的IP地址和目的端口號(hào)睡汹,并向該主機(jī)轉(zhuǎn)發(fā)該數(shù)據(jù)報(bào)
NAT雖然在近幾年得到了很廣泛的應(yīng)用肴甸,但也被很多人反對(duì)。
主要是:
- 1囚巴、端口號(hào)是用來(lái)進(jìn)程編址的原在,而不是主機(jī)編址的(NAT協(xié)議類(lèi)似 NAT路由器將該家庭網(wǎng)絡(luò)的主機(jī)都當(dāng)做進(jìn)程處理,并通過(guò)NAT轉(zhuǎn)換表為其分配端口號(hào))
- 2彤叉、路由器通常僅應(yīng)當(dāng)處理高達(dá)第三層的分組
- 3庶柿、違背端到端原則,即主機(jī)彼此之間應(yīng)當(dāng)相互直接對(duì)話秽浇,結(jié)點(diǎn)不應(yīng)當(dāng)介入修改IP地址與端口號(hào)浮庐。
- 4、應(yīng)當(dāng)用IPv6來(lái)解決IP地址短缺問(wèn)題
但不管反對(duì)與否柬焕,NAT終究已成為當(dāng)今因特網(wǎng)的一個(gè)重要組件