網(wǎng)絡(luò)基礎(chǔ)知識(shí)
-
網(wǎng)絡(luò)構(gòu)成的要素:
- 網(wǎng)卡:使計(jì)算機(jī)連網(wǎng)
- 中繼器:從物理層上延長(zhǎng)網(wǎng)絡(luò)
- 網(wǎng)橋(2層交換機(jī)):從數(shù)據(jù)鏈路層上延長(zhǎng)網(wǎng)絡(luò)
- 路由器(3層交換機(jī)):通過(guò)網(wǎng)絡(luò)層轉(zhuǎn)發(fā)分組數(shù)據(jù)
- 4~7層交換機(jī):處理傳輸層以上各層網(wǎng)絡(luò)傳輸
- 網(wǎng)關(guān):轉(zhuǎn)換協(xié)議
-
OSI 各個(gè)分層的主要作用:
- 應(yīng)用層:為應(yīng)用程序提供服務(wù)并規(guī)定應(yīng)用程序中通信相關(guān)的細(xì)節(jié)。
- 表示層:將設(shè)備固有的數(shù)據(jù)格式轉(zhuǎn)換為網(wǎng)絡(luò)標(biāo)準(zhǔn)傳輸格式。
- 會(huì)話層:負(fù)責(zé)建立和斷開(kāi)通信連接,以及數(shù)據(jù)分割等傳輸相關(guān)的管理。
- 傳輸層:在通信雙方的節(jié)點(diǎn)上進(jìn)行可靠傳輸。
- 網(wǎng)絡(luò)層:將數(shù)據(jù)傳輸?shù)侥繕?biāo)地址,主要負(fù)責(zé)尋址和路由選擇。
- 數(shù)據(jù)鏈路層:物理層面上互連的節(jié)點(diǎn)之間通信傳輸。
- 物理層:負(fù)責(zé)比特流于電壓高低、光的閃滅之間的轉(zhuǎn)換。
-
傳輸方式的分類
- 面向有連接型:ATM、幀中繼、TCP
- 面向無(wú)連接型:以太網(wǎng)、IP、UDP
-
地址
在同一通信網(wǎng)絡(luò)中不允許有兩個(gè)相同地址的通信主體存在
MAC 地址和 IP 地址都具有唯一性,但是只有 IP 地址具有層次性。MAC 地址是真正負(fù)責(zé)最終通信的地址,但實(shí)際尋址中,IP 地址必不可少。
TCP/IP基礎(chǔ)知識(shí)
- 傳輸中數(shù)據(jù)包,一部分由協(xié)議所要用到的首部,另一部分是上層傳過(guò)來(lái)的數(shù)據(jù),每個(gè)包首部包含兩個(gè)信息:一個(gè)是發(fā)送端和接收端地址,另一個(gè)是上一層的協(xié)議類型。
- TCP首部:源端口號(hào)、目標(biāo)端口號(hào)、序號(hào)、以及校驗(yàn)和
- IP首部:接收端 IP 地址以及發(fā)送端 IP 地址
- 以太網(wǎng)首部:接收端 MAC 地址、發(fā)送端 MAC 地址以及標(biāo)志以太網(wǎng)類型的以太網(wǎng)數(shù)據(jù)的協(xié)議
數(shù)據(jù)鏈路層
- 以太網(wǎng)前端有一個(gè)前導(dǎo)碼,表示一個(gè)以太網(wǎng)幀的開(kāi)始,也是對(duì)端網(wǎng)卡能夠確保與其同步的標(biāo)志。前導(dǎo)碼末尾有個(gè)SFD的域,它的值是“11”,前導(dǎo)碼與 SFD 合起來(lái)占8個(gè)字節(jié)。
- 常見(jiàn)數(shù)據(jù)鏈路:以太網(wǎng)、802.11、藍(lán)牙、PPP(Point-to-point Protocol)、ATM(Asynchronous Transfer Mode)、FDDI(Fiber Distributed Data Interface)、光線通道等。
- 不同數(shù)據(jù)鏈路的最大區(qū)別在于各自的最大傳輸單位(MTU)不同。
IP 協(xié)議
- IP 地址由 “網(wǎng)絡(luò)標(biāo)識(shí)“ 和 ”主機(jī)標(biāo)識(shí)” 兩部分組成。
- IP 地址的分類:
- A類地址:首位為“0”,從第 1 位到第 8 位是它的網(wǎng)絡(luò)標(biāo)識(shí),后 24 位為主機(jī)標(biāo)識(shí),十進(jìn)制表示位:0.0.0.0~127.0.0.0。
- B類地址:首位為“10”,從第 1 位到第 16 位是它的網(wǎng)絡(luò)標(biāo)識(shí),后 16 位為主機(jī)標(biāo)識(shí),十進(jìn)制表示位:128.0.0.0~191.255.0.0。
- C類地址:首位為“110”,從第 1 位到第 24 位是它的網(wǎng)絡(luò)標(biāo)識(shí),后 8 位為主機(jī)標(biāo)識(shí),十進(jìn)制表示位:192.0.0.0~223.255.255.0。
- D類地址:首位為“1110”,從第 1 位到第 32 位都是它的網(wǎng)絡(luò)標(biāo)識(shí),沒(méi)有主機(jī)標(biāo)識(shí),常用于多播,十進(jìn)制表示位:224.0.0.0~239.255.255.255。
- 廣播地址:主機(jī)部分全部設(shè)置為1。
- 子網(wǎng):將原來(lái)的A類、B類、C類等分類中的主機(jī)地址部分用作子網(wǎng)地址,可以將原網(wǎng)絡(luò)分為多個(gè)物理網(wǎng)絡(luò)的一種機(jī)制。對(duì)應(yīng)網(wǎng)絡(luò)標(biāo)識(shí)部分全為1,主機(jī)標(biāo)識(shí)部分全為0。
- IPv6 地址的長(zhǎng)度是原來(lái)的 4 倍,128 比特。
IP 協(xié)議相關(guān)技術(shù)
-
DNS 查詢流程:
- 向 DNS 服務(wù)器查詢 IP 地址;
- DNS 服務(wù)器在自己的數(shù)據(jù)庫(kù)查找,如果找不到就向上層根域名服務(wù)器請(qǐng)求查詢,從根開(kāi)始對(duì)域名樹按照順序進(jìn)行遍歷,知道找到制定的域名服務(wù)器;
- 上層域名服務(wù)器返回域名的 IP 地址給客戶端;
ARP 工作機(jī)制:通過(guò)廣播發(fā)送一個(gè) ARP 請(qǐng)求包,包含目標(biāo)主機(jī)的 IP 地址,由于廣播的包可以被同一個(gè)鏈路所有主機(jī)和路由器進(jìn)行解析,因此目標(biāo)主機(jī)也會(huì)對(duì)此請(qǐng)求包進(jìn)行解析,如果 ARP 請(qǐng)求包中的目標(biāo)地址和自己的 IP 地址一致,那么這個(gè)節(jié)點(diǎn)就將自己的 MAC 地址塞入 ARP 響應(yīng)包中返回。
ICMP 主要功能包括,確認(rèn) IP 包是否成功送達(dá)目標(biāo)地址,通知在發(fā)送過(guò)程中 IP 包被廢棄的具體原因,改善網(wǎng)絡(luò)設(shè)置等。
在網(wǎng)絡(luò)層的首部后面繼續(xù)追加網(wǎng)絡(luò)層首部的通信方法叫做“IP 隧道”。
Mobile IP 技術(shù)讓主機(jī)在所連接的子網(wǎng) IP 發(fā)生變化時(shí),主機(jī)的 IP 地址仍保持不變,通信能夠繼續(xù)。
-
DNS 解析過(guò)程:
- 主機(jī)向本地域名服務(wù)器發(fā)起域名查詢;
- 本地域名服務(wù)器不知道本查詢的域名的 IP 地址,于是向根域名服務(wù)器發(fā)出查詢請(qǐng)求報(bào)文;
- 根域名服務(wù)器返回頂級(jí)域名服務(wù)器的 IP 地址,本地域名服務(wù)器再向頂級(jí)域名服務(wù)器查詢;
- 頂級(jí)域名服務(wù)器返回查詢的 IP 地址,或者告知下一步應(yīng)當(dāng)向哪一個(gè)權(quán)限域名服務(wù)器進(jìn)行查詢;
- 本地域名服務(wù)器最終獲得 IP 地址或者是出錯(cuò)的結(jié)果,返回給主機(jī);
-
ARP 工作流程:
主機(jī) A 想要獲取 主機(jī) B 的 MAC 地址。
- 主機(jī) A 通過(guò)廣播發(fā)送一個(gè) ARP 請(qǐng)求包;
- 請(qǐng)求包被同一鏈路上所有主機(jī)或路由解析;
- 主機(jī) B 解析請(qǐng)求包時(shí)發(fā)現(xiàn)目標(biāo) IP 地址與自己的 IP 一致,將自己的 MAC 地址塞入 ARP 響應(yīng)包返回。
-
NAT 的工作原理:
簡(jiǎn)單地說(shuō),NAT 就是在局域網(wǎng)內(nèi)部網(wǎng)絡(luò)中使用內(nèi)部地址,而當(dāng)內(nèi)部節(jié)點(diǎn)要與外部網(wǎng)絡(luò)進(jìn)行通訊時(shí),就在網(wǎng)關(guān)處,將內(nèi)部地址替換成公用地址,從而在外部公網(wǎng)上正常使用。NAT 可被集成在路由器中,在其內(nèi)部有一張自動(dòng)生成的用來(lái)轉(zhuǎn)換地址的表。
TCP 相關(guān)知識(shí)點(diǎn)
-
TCP 通過(guò)序列號(hào)和確認(rèn)應(yīng)答(ACK)提高可靠性。
- 發(fā)送端將數(shù)據(jù)發(fā)出后會(huì)等待對(duì)端的確認(rèn)應(yīng)答,如果一定時(shí)間內(nèi)沒(méi)有等到確認(rèn)應(yīng)答,發(fā)送端就可以認(rèn)為數(shù)據(jù)已經(jīng)丟失,并進(jìn)行重發(fā)。
- 未收到確認(rèn)應(yīng)答可能是數(shù)據(jù)對(duì)方已經(jīng)收到,只是返回的確認(rèn)應(yīng)答在途中丟失。這種情況會(huì)進(jìn)行重發(fā),目標(biāo)主機(jī)會(huì)收到重復(fù)的數(shù)據(jù),因此通過(guò)序列號(hào)標(biāo)記一段數(shù)據(jù),接收端查詢接收數(shù)據(jù) TCP 首部的序列號(hào)和數(shù)據(jù)長(zhǎng)度,將自己的下一步應(yīng)該接受的序號(hào)作為確認(rèn)應(yīng)答返送回去,實(shí)現(xiàn)可靠傳輸。
- 重發(fā)超時(shí)的確定。TCP 每次發(fā)包時(shí)都會(huì)計(jì)算往返時(shí)間(RTT)及其波動(dòng)的偏差,將往返時(shí)間和偏差相加,重發(fā)超時(shí)的時(shí)間就是比這個(gè)總和稍大一點(diǎn)的值。
- 重發(fā)到了一定次數(shù),如果沒(méi)有任何確認(rèn)應(yīng)答返回,就會(huì)判斷為網(wǎng)絡(luò)或?qū)Χ酥鳈C(jī)發(fā)生異常,強(qiáng)制關(guān)閉連接。
-
TCP 利用窗口控制提高速度
- 發(fā)送端主機(jī)在發(fā)送了一個(gè)段以后,不會(huì)一直等待確認(rèn)應(yīng)答,而是繼續(xù)發(fā)送,從而縮短轉(zhuǎn)發(fā)時(shí)間。
- 窗口大小指無(wú)需等待確認(rèn)應(yīng)答而可以繼續(xù)發(fā)送數(shù)據(jù)的最大值。
- 如果窗口中部分?jǐn)?shù)據(jù)出現(xiàn)丟包,發(fā)送端會(huì)設(shè)置緩存保留這些數(shù)據(jù),直到收到他們的確認(rèn)應(yīng)答。
- 窗口控制:窗口在一定程度較大時(shí),即使有少部分的確認(rèn)應(yīng)答丟失也不會(huì)進(jìn)行重發(fā),可以通過(guò)下一個(gè)確認(rèn)應(yīng)答來(lái)確認(rèn)。
- 高速重發(fā)控制(快重傳):在窗口比較大,又出現(xiàn)報(bào)文段丟失的情況下,接收端沒(méi)有收到自己期望序號(hào)的數(shù)據(jù)時(shí),會(huì)對(duì)之前收到的數(shù)據(jù)進(jìn)行確認(rèn)應(yīng)答,發(fā)送端主機(jī)如果連續(xù) 3 次收到同一個(gè)確認(rèn)應(yīng)答,就會(huì)將對(duì)應(yīng)數(shù)據(jù)進(jìn)行重發(fā)。其他數(shù)據(jù)發(fā)送數(shù)據(jù)放入隊(duì)列,待重傳結(jié)束后再正常傳輸。
- 流控制:TCP 首部有個(gè)字段用來(lái)通知窗口大小,接收主機(jī)將自己可以接受的緩沖區(qū)大小放入字段中通知發(fā)送端。
- 接收端緩沖區(qū)快滿了,會(huì)暫停接收數(shù)據(jù),直到發(fā)出一個(gè)更新通知后通信才得以繼續(xù)。
- 如果更新通知丟失了,過(guò)了重發(fā)超時(shí)的時(shí)間以后,發(fā)送端會(huì)時(shí)不時(shí)發(fā)送窗口探測(cè)的數(shù)據(jù)段,僅含一個(gè)字節(jié)以獲取最新的窗口大小,從而保證通信能繼續(xù)。
-
擁塞控制
- TCP 為了防止通信開(kāi)始時(shí)就發(fā)送大量數(shù)據(jù),使用了一種慢啟動(dòng)的算法,通過(guò)擁塞窗口(cwnd)調(diào)節(jié)數(shù)據(jù)發(fā)送量。
- 慢啟動(dòng)時(shí),將擁塞窗口大小設(shè)置為 1 MSS,之后每收到一次確認(rèn)應(yīng)答(ACK),擁塞窗口的值就加 1。
- 發(fā)送數(shù)據(jù)包時(shí),將擁塞窗口的大小與接收端主機(jī)通知的窗口大小做比較,取較小值作為最大發(fā)送量。
- 為防止每次包的往后擁塞窗口以指數(shù)函數(shù)增長(zhǎng),引入慢啟動(dòng)閾值(ssthresh)。
- 擁塞避免:當(dāng)窗口指數(shù)增大導(dǎo)致超時(shí)重發(fā)時(shí),就會(huì)設(shè)置閾值為當(dāng)前擁塞窗口的一半,窗口重新設(shè)置為 1。當(dāng)窗口再次增大到超出這個(gè)閾值后,擁塞窗口按這個(gè)比例放大:1 個(gè)數(shù)據(jù)段的字節(jié)數(shù) / 擁塞窗口(字節(jié))* 1 個(gè) 數(shù)據(jù)段字節(jié)數(shù),丈夫會(huì)逐漸呈直線上升趨勢(shì)。
- 快恢復(fù):而由重復(fù)確認(rèn)應(yīng)答進(jìn)行高速重發(fā)控制時(shí),慢啟動(dòng)閾值被設(shè)置為當(dāng)前窗口大小的一半,窗口大小設(shè)置為慢啟動(dòng)閾值+3個(gè)數(shù)據(jù)段的大小,繼續(xù)直線上升。
-
延遲確認(rèn)應(yīng)答是能夠提高網(wǎng)絡(luò)利用率從而降低計(jì)算機(jī)處理負(fù)荷的一種較優(yōu)的處理機(jī)制。
- 在沒(méi)有收到 2x最大段長(zhǎng)度的數(shù)據(jù)為止不做確認(rèn)應(yīng)答。(有的操作系統(tǒng)是收到兩個(gè)包就即可返回)
- 其他情況下,最大延遲 0.5 秒發(fā)送確認(rèn)應(yīng)答。(有的操作系統(tǒng)設(shè)置為 0.2 秒左右)
-
為什么建立握手三次連接,斷開(kāi)握手四次連接。
TCP 是一個(gè)雙向的連接,服務(wù)端和客戶端雙方都有發(fā)送和接收數(shù)據(jù)的能力,因此雙方都需要獲得對(duì)方確認(rèn)號(hào),從而進(jìn)入
ESTABLISHED狀態(tài)。- 進(jìn)入
ESTABLISHED狀態(tài)首先需要向?qū)Ψ桨l(fā)起同步序列包(SYN),對(duì)方收到后返回一個(gè)確認(rèn)包(ACK)。 - 因此最簡(jiǎn)單的雙方建立連接是經(jīng)過(guò)四次的握手才建立的:1.客戶端發(fā)送
SYN包;2. 服務(wù)端返回ACK包;3. 服務(wù)端發(fā)送SYN包;4. 客戶端返回ACK包。 - 如果只有兩次握手,也就是到第 2 步就建立連接,這樣只有客戶端確認(rèn)服務(wù)端就緒,服務(wù)端則無(wú)法確定客戶端就緒。假設(shè) ACK 包丟失了,服務(wù)端在不知情的情況下開(kāi)始發(fā)送數(shù)據(jù),客戶端只接收 ACK 包而忽略發(fā)來(lái)的數(shù)據(jù),服務(wù)端沒(méi)收到響應(yīng)而一直發(fā)相同數(shù)據(jù),從而會(huì)形成死鎖。
- 而 TCP 中,第 2、3 步是可以同時(shí)完成的,因此這兩步的包合成一個(gè)
SYN + ACK包,因此只需要三次握手即可完成建立連接。
同樣,斷開(kāi)連接也是如此,雙方需要關(guān)閉各自的通路。
- 和建立連接類似,首先向?qū)Ψ桨l(fā)送
FIN包,對(duì)方收到后返回ACK包,這樣就可以關(guān)閉自己的通路。整體的流程為:1.客戶端發(fā)送FIN包;2. 服務(wù)端返回ACK包;3. 服務(wù)端發(fā)送FIN包;4. 客戶端返回ACK包。 - 和建立連接不同的是,在第 2 步服務(wù)端返回
ACK包時(shí),服務(wù)端可能還有數(shù)據(jù)沒(méi)有發(fā)完,因此不能立即進(jìn)行第 3 步發(fā)送,需要等數(shù)據(jù)發(fā)送完才能向客戶端發(fā)FIN包斷開(kāi)連接。因此需要完整的四次揮手。
- 進(jìn)入
-
為什么第四次揮手時(shí),客戶端進(jìn)入
TIME_WAIT狀態(tài)而不是直接關(guān)閉?- 假如第四次揮手時(shí)客戶端直接進(jìn)入
CLOSED狀態(tài),然而發(fā)送的ACK包丟失了,服務(wù)端在超時(shí)后會(huì)重發(fā)FIN包,這時(shí)因?yàn)榭蛻舳艘呀?jīng)進(jìn)入了CLOSED狀態(tài),返回的不是ACK包,而是RST包,服務(wù)端接收到RST會(huì)認(rèn)為連接錯(cuò)誤,無(wú)法進(jìn)入關(guān)閉狀態(tài),從而導(dǎo)致 TCP 協(xié)議不可靠。 - 另一個(gè)原因是需要讓舊數(shù)據(jù)包過(guò)期消失,假如客戶端發(fā)送
SYN超時(shí)了,重發(fā)一次才成功建立連接,然后完成數(shù)據(jù)交互并斷開(kāi)了連接。這時(shí)假設(shè)第一次發(fā)送超時(shí)的請(qǐng)求終于到了,這個(gè)請(qǐng)求本應(yīng)是無(wú)效的,服務(wù)端在不知情的情況下又再次建立連接。等待 2MSL 的目的就是讓這種舊的數(shù)據(jù)包過(guò)期失效,因此如果在關(guān)閉連接后馬上重連,就會(huì)出現(xiàn)端口不可用的情況。2 倍 MSL 時(shí)間是一個(gè)發(fā)送和一個(gè)回復(fù)所需要的最大時(shí)間。
- 假如第四次揮手時(shí)客戶端直接進(jìn)入