2019 iOS面試題大全---全方面剖析面試
2019 iOS面試題-----網(wǎng)絡(luò)相關(guān)之HTTP協(xié)議
2019 iOS面試題-----網(wǎng)絡(luò)相關(guān)之HTTPS、對稱加密、非對稱加密
2019 iOS面試-----一個基于UDP的簡單的聊天Demo(用C語言、python、GCDAsyncUdpSocket來實現(xiàn)UDP通信)
2019 iOS面試題-----網(wǎng)絡(luò)相關(guān)之UDP的特點、UDP的報文結(jié)構(gòu)及差錯檢測
2019 iOS面試題-----網(wǎng)絡(luò)相關(guān)之TCP、三次握手、四次揮手、代碼實現(xiàn)
2019 iOS面試題-----網(wǎng)絡(luò)相關(guān)之TCP進階:可靠數(shù)據(jù)傳輸、流量控制(滑動窗口)、擁塞控制
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ù)報分片、IPv4編址、網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)
2019 iOS面試題-----網(wǎng)絡(luò)相關(guān)之IPv6、從IPv4到IPv6的遷移
之前有說到OSI七層協(xié)議中的應(yīng)用層(HTTP協(xié)議)、傳輸層(TCP協(xié)議、UDP協(xié)議),在傳輸層之上就是網(wǎng)絡(luò)層,網(wǎng)絡(luò)層負責(zé)IP數(shù)據(jù)報的產(chǎn)生以及IP數(shù)據(jù)包在邏輯網(wǎng)絡(luò)上的路由轉(zhuǎn)發(fā),網(wǎng)絡(luò)層分為三個組件:

-
1、IP協(xié)議
-
2、路由選擇協(xié)議,它決定了數(shù)據(jù)報從源到目的地所流經(jīng)的路徑
-
3、ICMP協(xié)議 (Internet Control Message Protocol, 因特網(wǎng)控制報文協(xié)議),報告數(shù)據(jù)報中的差錯和對某些網(wǎng)路層信息請求進行響應(yīng)對設(shè)施。
網(wǎng)絡(luò)層和傳輸層的區(qū)別
- 網(wǎng)絡(luò)層只是根據(jù)網(wǎng)絡(luò)地址將源結(jié)點發(fā)出的數(shù)據(jù)包傳送到目的結(jié)點(點到點),其主要任務(wù)是:通過路由選擇算法,為報文或分組通過通信子網(wǎng)選擇最適當?shù)穆窂?。該層控制?shù)據(jù)鏈路層與傳輸層之間的信息轉(zhuǎn)發(fā),建立、維持和終止網(wǎng)絡(luò)的連接。具體地說,數(shù)據(jù)鏈路層的數(shù)據(jù)在這一層被轉(zhuǎn)換為數(shù)據(jù)包,然后通過路徑選擇、分段組合、順序、進/出路由等控制,將信息從一個網(wǎng)絡(luò)設(shè)備傳送到另一個網(wǎng)絡(luò)設(shè)備。
即網(wǎng)絡(luò)層提供了主機之間的邏輯通信
- 而傳輸層則負責(zé)將數(shù)據(jù)可靠地傳送到相應(yīng)的端口(端到端),傳輸層提供了主機應(yīng)用程序進程之間的端到端的服務(wù)。傳輸層利用網(wǎng)絡(luò)層提供的服務(wù),并通過傳輸層地址提供給高層用戶傳輸數(shù)據(jù)的通信端口,使高層用戶看到的只是在兩個傳輸實體間的一條端到端的、可由用戶控制和設(shè)定的、可靠的數(shù)據(jù)通路。
即傳輸層為運行在不同主機上的進程之間提供了邏輯通信
一、IP協(xié)議
IP協(xié)議是TCP/IP核心協(xié)議。
1、IP協(xié)議的數(shù)據(jù)報格式(IPv4)

版本號
規(guī)定了數(shù)據(jù)報的IP協(xié)議版本(IPv4還是IPv6)。不同的IP版本使用不同的數(shù)據(jù)報格式 ,上圖是IPv4的數(shù)據(jù)報格式首部長度
大多數(shù)IP數(shù)據(jù)報不包含選項,所以一般IP數(shù)據(jù)報具有20字節(jié)的首部。服務(wù)類型
使不同類型的IP數(shù)據(jù)報能相互區(qū)別開來。數(shù)據(jù)報長度
整個IP數(shù)據(jù)報的長度,利用首部長度和總長度就可以是算出IP數(shù)據(jù)報中數(shù)據(jù)內(nèi)容的起始地址。該字段長度為16比特,所以IP數(shù)據(jù)報最長可達2^16=65535字節(jié),而事實上,數(shù)據(jù)報很少有超過1500字節(jié)的標識、標志、片偏移字段
這三個字段與IP分片有關(guān)。此外,IPv6不允許在路由器上對分組分片生存時間TTL
用來確保數(shù)據(jù)報不會永遠在網(wǎng)絡(luò)中循環(huán)。設(shè)置該數(shù)據(jù)報可以經(jīng)過的最多的路由器數(shù)。指定了數(shù)據(jù)報的生存時間,經(jīng)過一個路由器,它的值就減1,當該字段為0時,數(shù)據(jù)報就被丟棄
- 協(xié)議
該字段只有在一個IP數(shù)據(jù)報到達其目的地才有用。該字段值指示了IP數(shù)據(jù)報的數(shù)據(jù)部分應(yīng)交給哪個特定的傳輸層協(xié)議,比如,值為6表明要交給TCP,而值為17則表明要交給UDP
首部檢驗和
與UDP/TCP的檢驗和不同,這個字段只檢驗數(shù)據(jù)報的首部,不包括數(shù)據(jù)部分。選項字段
是一個可變長字段,選項字段一直以4字節(jié)作為界限。這樣就可以保證首部始終是4字節(jié)的整數(shù)倍。很少被用到源IP和目的IP
記錄源IP地址,目的IP地址
- 數(shù)據(jù)
二、IP數(shù)據(jù)報分片
一個鏈路層幀能承載的最大數(shù)據(jù)量叫做最大傳送單元(Maximun Transmission Unit,MTU),即鏈路層的MTU限制著IP數(shù)據(jù)報的長度。
問題是在不同的鏈路上,可能使用不同的鏈路層協(xié)議,且每種協(xié)議可能具有不同的MTU。
假定在某條鏈路上收到一個IP數(shù)據(jù)報,通過檢查轉(zhuǎn)發(fā)表確定出鏈路,且出鏈路的MTU比該IP數(shù)據(jù)報的長度要小,如何將這個過大的IP數(shù)據(jù)報壓縮進鏈路層幀的有效載荷字段呢?
解決方案就是分片:將IP數(shù)據(jù)報中的數(shù)據(jù)分片為兩個或更多個較小的IP數(shù)據(jù)報,用單獨的鏈路層幀封裝這些較小的IP數(shù)據(jù)報,然后向出鏈路上發(fā)送這些幀,每個這些較小的數(shù)據(jù)都稱為片(fragment)。
片在到達目的地傳輸層前需要重新組裝。
實際上,TCP和UDP都希望從網(wǎng)絡(luò)層上收到完整的未分片的報文。IPv4的數(shù)據(jù)報重組工作是在端系統(tǒng)中,而不是在網(wǎng)絡(luò)路由器中。
當一臺目的主機從相同源收到一系列數(shù)據(jù)時,需要確定這些數(shù)據(jù)報中的某些是否是一些原來較大的數(shù)據(jù)報中的片。而如果是片的話,需要進一步確定何時收到最后一片,并且如何將這些片拼接到一起以形成初始的數(shù)據(jù)報。從而就用到了前邊說到的IPv4數(shù)據(jù)報首部中的標識、標志、片偏移 字段。
- 1、當生成一個數(shù)據(jù)報時,發(fā)送主機在為該數(shù)據(jù)報設(shè)置
源和目的地址的同時在貼上標識號,發(fā)送主機通常將為它發(fā)送的每個數(shù)據(jù)報標識號加1- 2、當某路由器需要對一個數(shù)據(jù)報分片時,形成的每個數(shù)據(jù)報(即片)具有初始數(shù)據(jù)報的
源地址、目的地址和標識號- 3、當目的地從同一發(fā)送主機收到一系列數(shù)據(jù)報時,它能夠檢查數(shù)據(jù)報的
標識號以確定哪些數(shù)據(jù)報實際上是同一較大數(shù)據(jù)報的片- 4、由于IP協(xié)議是不可靠服務(wù),一個或者多個片可能永遠到達不了目的地。為了讓目的主機絕對相信它已收到初始數(shù)據(jù)報的最后一個片,最后一個片的
標志比特被設(shè)為0,其余被設(shè)為1- 5、為了讓目的主機確定是否丟失了一個片,并且能按照正確的順序重新組裝片,使用
偏移字段指定該片應(yīng)放在初始IP數(shù)據(jù)報的哪個位置>
此外,如果有一個片或者多個片未能到達,則該不完整的數(shù)據(jù)報將會被丟棄且不會交給傳輸層。但如果傳輸層正使用著TCP,則TCP將通過讓源以初始數(shù)據(jù)來重傳數(shù)據(jù)。因為IP層沒有超時重傳機制,所以會重傳整個數(shù)據(jù)報,而不是某個片
三、IPv4編址
1、IP地址
一臺主機通常只有一條鏈路連接到網(wǎng)絡(luò),當主機上的IP想發(fā)送一條數(shù)據(jù)報時,就在該鏈路上發(fā)送。主機與物理鏈路之間的邊界叫做接口(interface)。
而路由器的任務(wù)是從鏈路上接收數(shù)據(jù)報并從某些其他鏈路轉(zhuǎn)發(fā)出去,路由器必須有兩條或更多鏈路與其連接,路由器與它的任意一條鏈路之間的邊界也叫做接口。即一臺路由器會有多個接口,每個接口有其鏈路。
因為每臺主機與路由器都能發(fā)送和接收IP數(shù)據(jù)報,IP要求每臺主機和路由器接口都有自己的IP地址。因此,一個IP地址技術(shù)上是與一個接口相關(guān)聯(lián)的,而不是與包括該接口的主機或路由器相關(guān)聯(lián)的。
2、子網(wǎng)
每個IP地址(IPv4)長度為32比特(4字節(jié)),按點分十進制記法書寫,即地址中的每個字節(jié)都用它的十進制形式書寫,各字節(jié)間以點.隔開,比如193.32.122.30
在因特網(wǎng)上的每臺主機和路由器上的每個接口,必須有一個全球唯一的IP地址(NAT后的接口除外)。這些地址不能自由選擇,一個接口的IP地址的一部分需要由其連接的子網(wǎng)來決定。

如圖,一臺路由器有三個接口,連接7臺主機。左側(cè)的三臺主機以及連接它們的路由器的接口,都有一個形如
223.1.1.x的IP地址。即在它們的IP地址中,最左側(cè)的24比特是相同的。
互聯(lián)左側(cè)這三個主機接口與1個路由器接口的網(wǎng)絡(luò)形成1個子網(wǎng)(subnet)(也被稱為IP網(wǎng)絡(luò)或直接稱為網(wǎng)絡(luò))。IP編址為這個子網(wǎng)分配一個地址:
223.1.1.0/24,其中的/24記法,有時稱為子網(wǎng)掩碼(network mask),指示了32比特中的最左側(cè)24比特定義了子網(wǎng)地址。任何連接到該子網(wǎng)的主機都要求其地址具有223.1.1.x的形式。同樣圖中下側(cè)和右側(cè)也是子網(wǎng),分別為223.1.3.0/24和223.1.2.0/24

上圖顯示了3臺通過點對點鏈路彼此互聯(lián)的路由器,這里出現(xiàn)了6個子網(wǎng)。
一個具有多個以太網(wǎng)段和點對點鏈路的組織將具有多個子網(wǎng),在給定子網(wǎng)上的所有設(shè)備都具有相同的子網(wǎng)地址。
雖然在理論上來說,不同子網(wǎng)可以有完全不同的子網(wǎng)地址。但上圖可以看出,這6個子網(wǎng)在前16個比特是一致的,都是
223.1
3、無類別域間路由選擇(CIDR)
因特網(wǎng)的地址分配策略被稱為無類別域間路由選擇(CIDR)(也被稱為無分類編址,以區(qū)分于分類編址)。對于子網(wǎng)尋址,32比特的IP地址被分為兩部分,也是點分十進制數(shù)形式a.b.c.d/x,其中x指示了地址的第一部分中的比特數(shù),又被稱為該地址的前綴(prefix)。
一個組織通常被分配一塊連續(xù)的地址,即具有相同前綴的地址。在該組織外的的路由器僅考慮前面的前綴比特x,這相當大地減少了在這些路由器中轉(zhuǎn)發(fā)表的長度,形式為a.b.c.d/x單一表項足以將數(shù)據(jù)報轉(zhuǎn)發(fā)到該組織內(nèi)的任何目的地。

如圖,
200.23.16.0/20下有8個組織,分別是200.23.16.0/23到200.23.30.0/23,每個組織有自己的子網(wǎng)。而外界不需要知道這8個組織。這種使用單個網(wǎng)絡(luò)前綴通告多個網(wǎng)絡(luò)的能力通常稱為地址聚合,也稱為路由聚合或路由摘要
4、分類編址
在CIDR被采用之前,IP地址的網(wǎng)絡(luò)部分被限制長度為8、16、24比特,也就是分類編址(classful addressing)。具有8、16、24比特子網(wǎng)地址的子網(wǎng)被稱為A、B和C類網(wǎng)絡(luò)。
一個C類(/24)子網(wǎng)既能容納2 - 2 = 254臺主機(其中兩個地址預(yù)留用于特殊用途),這對于很多組織來說都太小了。
而一個B類(/16)子網(wǎng)可支持多達2 - 2 = 65534臺主機,又太大了。
在分類編址方法下,一個有2000臺主機的組織通常被分給一個B類(/16)地址,那么剩下的6萬多個地址就浪費掉了。這就會導(dǎo)致B類地址空間的迅速損耗以及所分配的地址空間的利用率低。
此外,255.255.255.255是IP廣播地址,當一臺主機發(fā)出一個目的地址為該地址的數(shù)據(jù)報時,該報文會交付給同一個網(wǎng)絡(luò)中的所有主機。
5、獲取主機地址
某組織一旦獲得了一塊地址,它就可為本組織內(nèi)的主機與路由器逐一分配IP地址。系統(tǒng)管理員通常手工配置路由器中的IP地址。主機地址也能手動配置,但更多使用的是動態(tài)主機配置協(xié)議(DHCP)。DHCP允許主機自動獲取IP地址。網(wǎng)絡(luò)管理員可以配置DHCP,以使某給定主機每次與網(wǎng)絡(luò)連接時能得到一個相同的IP地址,或者某主機將被分配一個臨時的IP地址,該地址在每次與網(wǎng)絡(luò)連接時也許是不同的。
6、網(wǎng)絡(luò)地址轉(zhuǎn)換
每個IP地址(IPv4)長度為32比特(4字節(jié)),因此總共有2個可能的IP地址,約為40億個。在互聯(lián)網(wǎng)越來越普及的當下,個人計算機及智能手機等越來越多,這些IP地址顯然無法滿足人們的需求。
為了解決IP地址不足的問題,于是就有了網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translation, NAT),它的思想就是給一個局域網(wǎng)絡(luò)分配一個IP地址就夠了,對于這個網(wǎng)絡(luò)內(nèi)的主機,則分配私有地址,這些私有地址對外是不可見的,他們對外的通信都要借助那個唯一分配的IP地址。
如果從廣域網(wǎng)到達NAT路由器的所有數(shù)據(jù)報都有相同的目的IP地址,那么該路由器如何知道是發(fā)送給哪個內(nèi)部主機的呢?其原理就是使用在NAT路由器上的一張NAT轉(zhuǎn)換表,并在該表內(nèi)包含了端口號及其IP地址。
假設(shè)一臺主機向廣域網(wǎng)請求數(shù)據(jù),
NAT路由器收到該數(shù)據(jù)報,會為該數(shù)據(jù)報生成一個新的端口號替換掉源端口號,并將源IP替換為其廣域網(wǎng)一側(cè)接口的IP地址。當生成一個新的源端口號時,該端口號可以是任意一個當前未在NAT轉(zhuǎn)換表中的源端口號(端口號字段是16比特,意味著NAT協(xié)議可以支持超過60000個并行使用路由器廣域網(wǎng)一側(cè)IP地址的連接),路由器中的NAT也在其NAT轉(zhuǎn)換表中增加一表項。該
NAT路由器收到廣域網(wǎng)返回的數(shù)據(jù)時,路由器使用目的IP地址與目的端口號從NAT轉(zhuǎn)換表中檢索出該主機使用的IP地址和目的端口號,改寫該數(shù)據(jù)報的目的IP地址和目的端口號,并向該主機轉(zhuǎn)發(fā)該數(shù)據(jù)報
NAT雖然在近幾年得到了很廣泛的應(yīng)用,但也被很多人反對。
主要是:
- 1、端口號是用來進程編址的,而不是主機編址的(NAT協(xié)議類似 NAT路由器將該家庭網(wǎng)絡(luò)的主機都當做進程處理,并通過NAT轉(zhuǎn)換表為其分配端口號)
- 2、路由器通常僅應(yīng)當處理高達第三層的分組
- 3、違背端到端原則,即主機彼此之間應(yīng)當相互直接對話,結(jié)點不應(yīng)當介入修改IP地址與端口號。
- 4、應(yīng)當用IPv6來解決IP地址短缺問題
但不管反對與否,NAT終究已成為當今因特網(wǎng)的一個重要組件