一渠羞、 計(jì)算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu)分層
不難看出,TCP/IP 與 OSI 在分層模塊上稍有區(qū)別。OSI 參考模型注重“通信協(xié)議必要的功能是什么”志于,而 TCP/IP 則更強(qiáng)調(diào)“在計(jì)算機(jī)上實(shí)現(xiàn)協(xié)議應(yīng)該開發(fā)哪種程序”突勇。
二装盯、 TCP/IP 基礎(chǔ)
1. TCP/IP 的具體含義
從字面意義上講,有人可能會(huì)認(rèn)為 TCP/IP 是指 TCP 和 IP 兩種協(xié)議甲馋。實(shí)際生活當(dāng)中有時(shí)也確實(shí)就是指這兩種協(xié)議埂奈。然而在很多情況下,它只是利用 IP 進(jìn)行通信時(shí)所必須用到的協(xié)議群的統(tǒng)稱定躏。具體來說账磺,IP 或 ICMP、TCP 或 UDP共屈、TELNET 或 FTP绑谣、以及 HTTP 等都屬于 TCP/IP 協(xié)議。他們與 TCP 或 IP 的關(guān)系緊密拗引,是互聯(lián)網(wǎng)必不可少的組成部分借宵。TCP/IP 一詞泛指這些協(xié)議,因此矾削,有時(shí)也稱 TCP/IP 為網(wǎng)際協(xié)議群壤玫。
互聯(lián)網(wǎng)進(jìn)行通信時(shí),需要相應(yīng)的網(wǎng)絡(luò)協(xié)議哼凯,TCP/IP 原本就是為使用互聯(lián)網(wǎng)而開發(fā)制定的協(xié)議族欲间。因此,互聯(lián)網(wǎng)的協(xié)議就是 TCP/IP断部,TCP/IP 就是互聯(lián)網(wǎng)的協(xié)議猎贴。
2. 數(shù)據(jù)包
包、幀、數(shù)據(jù)包她渴、段达址、消息
以上五個(gè)術(shù)語都用來表述數(shù)據(jù)的單位,大致區(qū)分如下:
- 包可以說是全能性術(shù)語趁耗;
- 幀用于表示數(shù)據(jù)鏈路層中包的單位沉唠;
- 數(shù)據(jù)包是 IP 和 UDP 等網(wǎng)絡(luò)層以上的分層中包的單位;
- 段則表示 TCP 數(shù)據(jù)流中的信息苛败;
- 消息是指應(yīng)用協(xié)議中數(shù)據(jù)的單位满葛。
每個(gè)分層中,都會(huì)對(duì)所發(fā)送的數(shù)據(jù)附加一個(gè)首部罢屈,在這個(gè)首部中包含了該層必要的信息嘀韧,如發(fā)送的目標(biāo)地址以及協(xié)議相關(guān)信息。通常缠捌,為協(xié)議提供的信息為包首部乳蛾,所要發(fā)送的內(nèi)容為數(shù)據(jù)。在下一層的角度看鄙币,從上一層收到的包全部都被認(rèn)為是本層的數(shù)據(jù)。
數(shù)據(jù)包首部
網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)包由兩部分組成:一部分是協(xié)議所要用到的首部蹂随,另一部分是上一層傳過來的數(shù)據(jù)十嘿。首部的結(jié)構(gòu)由協(xié)議的具體規(guī)范詳細(xì)定義。在數(shù)據(jù)包的首部岳锁,明確標(biāo)明了協(xié)議應(yīng)該如何讀取數(shù)據(jù)绩衷。反過來說,看到首部激率,也就能夠了解該協(xié)議必要的信息以及所要處理的數(shù)據(jù)咳燕。包首部就像協(xié)議的臉。
3. 數(shù)據(jù)處理流程
下圖以用戶 a 向用戶 b 發(fā)送郵件為例子:
① 應(yīng)用程序處理
首先應(yīng)用程序會(huì)進(jìn)行編碼處理乒躺,這些編碼相當(dāng)于 OSI 的表示層功能招盲;
編碼轉(zhuǎn)化后,郵件不一定馬上被發(fā)送出去嘉冒,這種何時(shí)建立通信連接何時(shí)發(fā)送數(shù)據(jù)的管理功能曹货,相當(dāng)于 OSI 的會(huì)話層功能。
② TCP 模塊的處理
TCP 根據(jù)應(yīng)用的指示讳推,負(fù)責(zé)建立連接顶籽、發(fā)送數(shù)據(jù)以及斷開連接。TCP 提供將應(yīng)用層發(fā)來的數(shù)據(jù)順利發(fā)送至對(duì)端的可靠傳輸银觅。為了實(shí)現(xiàn)這一功能礼饱,需要在應(yīng)用層數(shù)據(jù)的前端附加一個(gè) TCP 首部。
③ IP 模塊的處理
IP 將 TCP 傳過來的 TCP 首部和 TCP 數(shù)據(jù)合起來當(dāng)做自己的數(shù)據(jù),并在 TCP 首部的前端加上自己的 IP 首部镊绪。IP 包生成后匀伏,參考路由控制表決定接受此 IP 包的路由或主機(jī)。
④ 網(wǎng)絡(luò)接口(以太網(wǎng)驅(qū)動(dòng))的處理
從 IP 傳過來的 IP 包對(duì)于以太網(wǎng)來說就是數(shù)據(jù)镰吆。給這些數(shù)據(jù)附加上以太網(wǎng)首部并進(jìn)行發(fā)送處理帘撰,生成的以太網(wǎng)數(shù)據(jù)包將通過物理層傳輸給接收端。
⑤ 網(wǎng)絡(luò)接口(以太網(wǎng)驅(qū)動(dòng))的處理
主機(jī)收到以太網(wǎng)包后万皿,首先從以太網(wǎng)包首部找到 MAC 地址判斷是否為發(fā)送給自己的包摧找,若不是則丟棄數(shù)據(jù)。
如果是發(fā)送給自己的包牢硅,則從以太網(wǎng)包首部中的類型確定數(shù)據(jù)類型乳愉,再傳給相應(yīng)的模塊,如 IP参萄、ARP 等府怯。這里的例子則是 IP 。
⑥ IP 模塊的處理
IP 模塊接收到 數(shù)據(jù)后也做類似的處理位岔。從包首部中判斷此 IP 地址是否與自己的 IP 地址匹配如筛,如果匹配則根據(jù)首部的協(xié)議類型將數(shù)據(jù)發(fā)送給對(duì)應(yīng)的模塊,如 TCP抒抬、UDP杨刨。這里的例子則是 TCP。
另外嗎擦剑,對(duì)于有路由器的情況妖胀,接收端地址往往不是自己的地址,此時(shí)惠勒,需要借助路由控制表赚抡,在調(diào)查應(yīng)該送往的主機(jī)或路由器之后再進(jìn)行轉(zhuǎn)發(fā)數(shù)據(jù)。
⑦ TCP 模塊的處理
在 TCP 模塊中纠屋,首先會(huì)計(jì)算一下校驗(yàn)和涂臣,判斷數(shù)據(jù)是否被破壞。然后檢查是否在按照序號(hào)接收數(shù)據(jù)售担。最后檢查端口號(hào)肉康,確定具體的應(yīng)用程序。數(shù)據(jù)被完整地接收以后灼舍,會(huì)傳給由端口號(hào)識(shí)別的應(yīng)用程序吼和。
⑧ 應(yīng)用程序的處理
接收端應(yīng)用程序會(huì)直接接收發(fā)送端發(fā)送的數(shù)據(jù)。通過解析數(shù)據(jù)骑素,展示相應(yīng)的內(nèi)容炫乓。
三刚夺、傳輸層中的 TCP 和 UDP
TCP/IP 中有兩個(gè)具有代表性的傳輸層協(xié)議,分別是 TCP 和 UDP末捣。
- TCP 是面向連接的侠姑、可靠的流協(xié)議。流就是指不間斷的數(shù)據(jù)結(jié)構(gòu)箩做,當(dāng)應(yīng)用程序采用 TCP 發(fā)送消息時(shí)莽红,雖然可以保證發(fā)送的順序,但還是猶如沒有任何間隔的數(shù)據(jù)流發(fā)送給接收端邦邦。TCP 為提供可靠性傳輸安吁,實(shí)行“順序控制”或“重發(fā)控制”機(jī)制。此外還具備“流控制(流量控制)”燃辖、“擁塞控制”鬼店、提高網(wǎng)絡(luò)利用率等眾多功能。
- UDP 是不具有可靠性的數(shù)據(jù)報(bào)協(xié)議黔龟。細(xì)微的處理它會(huì)交給上層的應(yīng)用去完成妇智。在 UDP 的情況下,雖然可以確保發(fā)送消息的大小氏身,卻不能保證消息一定會(huì)到達(dá)巍棱。因此,應(yīng)用有時(shí)會(huì)根據(jù)自己的需要進(jìn)行重發(fā)處理蛋欣。
- TCP 和 UDP 的優(yōu)缺點(diǎn)無法簡(jiǎn)單地拉盾、絕對(duì)地去做比較:TCP 用于在傳輸層有必要實(shí)現(xiàn)可靠傳輸?shù)那闆r;而在一方面豁状,UDP 主要用于那些對(duì)高速傳輸和實(shí)時(shí)性有較高要求的通信或廣播通信。TCP 和 UDP 應(yīng)該根據(jù)應(yīng)用的目的按需使用倒得。
1. 端口號(hào)
數(shù)據(jù)鏈路和 IP 中的地址泻红,分別指的是 MAC 地址和 IP 地址。前者用來識(shí)別同一鏈路中不同的計(jì)算機(jī)霞掺,后者用來識(shí)別 TCP/IP 網(wǎng)絡(luò)中互連的主機(jī)和路由器谊路。在傳輸層也有這種類似于地址的概念,那就是端口號(hào)菩彬。端口號(hào)用來識(shí)別同一臺(tái)計(jì)算機(jī)中進(jìn)行通信的不同應(yīng)用程序缠劝。因此,它也被稱為程序地址骗灶。
1.1 根據(jù)端口號(hào)識(shí)別應(yīng)用
一臺(tái)計(jì)算機(jī)上同時(shí)可以運(yùn)行多個(gè)程序惨恭。傳輸層協(xié)議正是利用這些端口號(hào)識(shí)別本機(jī)中正在進(jìn)行通信的應(yīng)用程序,并準(zhǔn)確地將數(shù)據(jù)傳輸耙旦。
通過端口號(hào)識(shí)別應(yīng)用
1.2 通過 IP 地址脱羡、端口號(hào)、協(xié)議號(hào)進(jìn)行通信識(shí)別
- 僅憑目標(biāo)端口號(hào)識(shí)別某一個(gè)通信是遠(yuǎn)遠(yuǎn)不夠的。
通過端口號(hào)锉罐、IP地址帆竹、協(xié)議號(hào)進(jìn)行通信識(shí)別
- ① 和② 的通信是在兩臺(tái)計(jì)算機(jī)上進(jìn)行的。它們的目標(biāo)端口號(hào)相同脓规,都是80栽连。這里可以根據(jù)源端口號(hào)加以區(qū)分。
- ③ 和 ① 的目標(biāo)端口號(hào)和源端口號(hào)完全相同侨舆,但它們各自的源 IP 地址不同秒紧。
- 此外,當(dāng) IP 地址和端口號(hào)全都一樣時(shí)态罪,我們還可以通過協(xié)議號(hào)來區(qū)分(TCP 和 UDP)噩茄。
1.3 端口號(hào)的確定
- 標(biāo)準(zhǔn)既定的端口號(hào):這種方法也叫靜態(tài)方法。它是指每個(gè)應(yīng)用程序都有其指定的端口號(hào)复颈。但并不是說可以隨意使用任何一個(gè)端口號(hào)绩聘。例如 HTTP、FTP耗啦、TELNET 等廣為使用的應(yīng)用協(xié)議中所使用的端口號(hào)就是固定的凿菩。這些端口號(hào)被稱為知名端口號(hào),分布在 0~1023 之間帜讲;除知名端口號(hào)之外衅谷,還有一些端口號(hào)被正式注冊(cè),它們分布在 1024~49151 之間似将,不過這些端口號(hào)可用于任何通信用途获黔。
- 時(shí)序分配法:服務(wù)器有必要確定監(jiān)聽端口號(hào),但是接受服務(wù)的客戶端沒必要確定端口號(hào)在验。在這種方法下玷氏,客戶端應(yīng)用程序完全可以不用自己設(shè)置端口號(hào),而全權(quán)交給操作系統(tǒng)進(jìn)行分配腋舌。動(dòng)態(tài)分配的端口號(hào)范圍在 49152~65535 之間盏触。
1.4 端口號(hào)與協(xié)議
- 端口號(hào)由其使用的傳輸層協(xié)議決定。因此块饺,不同的傳輸層協(xié)議可以使用相同的端口號(hào)赞辩。
- 此外,那些知名端口號(hào)與傳輸層協(xié)議并無關(guān)系授艰。只要端口一致都將分配同一種應(yīng)用程序進(jìn)行處理辨嗽。
2. UDP
- UDP 不提供復(fù)雜的控制機(jī)制,利用 IP 提供面向無連接的通信服務(wù)淮腾。
- 并且它是將應(yīng)用程序發(fā)來的數(shù)據(jù)在收到的那一刻召庞,立即按照原樣發(fā)送到網(wǎng)絡(luò)上的一種機(jī)制岛心。即使是出現(xiàn)網(wǎng)絡(luò)擁堵的情況,UDP 也無法進(jìn)行流量控制等避免網(wǎng)絡(luò)擁塞行為篮灼。
- 此外忘古,傳輸途中出現(xiàn)丟包,UDP 也不負(fù)責(zé)重發(fā)诅诱。
- 甚至當(dāng)包的到達(dá)順序出現(xiàn)亂序時(shí)也沒有糾正的功能髓堪。
- 如果需要以上的細(xì)節(jié)控制,不得不交由采用 UDP 的應(yīng)用程序去處理娘荡。
- UDP 常用于一下幾個(gè)方面:1.包總量較少的通信(DNS干旁、SNMP等);2.視頻炮沐、音頻等多媒體通信(即時(shí)通信)争群;3.限定于 LAN 等特定網(wǎng)絡(luò)中的應(yīng)用通信;4.廣播通信(廣播大年、多播)换薄。
3. TCP
- TCP 與 UDP 的區(qū)別相當(dāng)大。它充分地實(shí)現(xiàn)了數(shù)據(jù)傳輸時(shí)各種控制功能翔试,可以進(jìn)行丟包時(shí)的重發(fā)控制轻要,還可以對(duì)次序亂掉的分包進(jìn)行順序控制。而這些在 UDP 中都沒有垦缅。
- 此外冲泥,TCP 作為一種面向有連接的協(xié)議,只有在確認(rèn)通信對(duì)端存在時(shí)才會(huì)發(fā)送數(shù)據(jù)壁涎,從而可以控制通信流量的浪費(fèi)凡恍。
- 根據(jù) TCP 的這些機(jī)制,在 IP 這種無連接的網(wǎng)絡(luò)上也能夠?qū)崿F(xiàn)高可靠性的通信( 主要通過檢驗(yàn)和怔球、序列號(hào)嚼酝、確認(rèn)應(yīng)答、重發(fā)控制庞溜、連接管理以及窗口控制等機(jī)制實(shí)現(xiàn))。
3.1 三次握手(重點(diǎn))
- TCP 提供面向有連接的通信傳輸碑定。面向有連接是指在數(shù)據(jù)通信開始之前先做好兩端之間的準(zhǔn)備工作流码。
- 所謂三次握手是指建立一個(gè) TCP 連接時(shí)需要客戶端和服務(wù)器端總共發(fā)送三個(gè)包以確認(rèn)連接的建立。在socket編程中延刘,這一過程由客戶端執(zhí)行connect來觸發(fā)漫试。
下面來看看三次握手的流程圖:
三次握手
- 第一次握手:客戶端將標(biāo)志位SYN置為1,隨機(jī)產(chǎn)生一個(gè)值seq=J碘赖,并將該數(shù)據(jù)包發(fā)送給服務(wù)器端驾荣,客戶端進(jìn)入SYN_SENT狀態(tài)外构,等待服務(wù)器端確認(rèn)。
- 第二次握手:服務(wù)器端收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道客戶端請(qǐng)求建立連接播掷,服務(wù)器端將標(biāo)志位SYN和ACK都置為1审编,ack=J+1,隨機(jī)產(chǎn)生一個(gè)值seq=K歧匈,并將該數(shù)據(jù)包發(fā)送給客戶端以確認(rèn)連接請(qǐng)求垒酬,服務(wù)器端進(jìn)入SYN_RCVD狀態(tài)。
- 第三次握手:客戶端收到確認(rèn)后件炉,檢查ack是否為J+1勘究,ACK是否為1,如果正確則將標(biāo)志位ACK置為1斟冕,ack=K+1口糕,并將該數(shù)據(jù)包發(fā)送給服務(wù)器端,服務(wù)器端檢查ack是否為K+1磕蛇,ACK是否為1景描,如果正確則連接建立成功,客戶端和服務(wù)器端進(jìn)入ESTABLISHED狀態(tài)孤里,完成三次握手伏伯,隨后客戶端與服務(wù)器端之間可以開始傳輸數(shù)據(jù)了。
3.2 四次揮手(重點(diǎn))
- 四次揮手即終止TCP連接捌袜,就是指斷開一個(gè)TCP連接時(shí)说搅,需要客戶端和服務(wù)端總共發(fā)送4個(gè)包以確認(rèn)連接的斷開。在socket編程中虏等,這一過程由客戶端或服務(wù)端任一方執(zhí)行close來觸發(fā)弄唧。
- 由于TCP連接是全雙工的,因此霍衫,每個(gè)方向都必須要單獨(dú)進(jìn)行關(guān)閉候引,這一原則是當(dāng)一方完成數(shù)據(jù)發(fā)送任務(wù)后,發(fā)送一個(gè)FIN來終止這一方向的連接敦跌,收到一個(gè)FIN只是意味著這一方向上沒有數(shù)據(jù)流動(dòng)了澄干,即不會(huì)再收到數(shù)據(jù)了,但是在這個(gè)TCP連接上仍然能夠發(fā)送數(shù)據(jù)柠傍,直到這一方向也發(fā)送了FIN麸俘。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方則執(zhí)行被動(dòng)關(guān)閉惧笛。
下面來看看四次揮手的流程圖:
四次揮手
- 中斷連接端可以是客戶端从媚,也可以是服務(wù)器端。
- 第一次揮手:客戶端發(fā)送一個(gè)FIN=M患整,用來關(guān)閉客戶端到服務(wù)器端的數(shù)據(jù)傳送拜效,客戶端進(jìn)入FIN_WAIT_1狀態(tài)喷众。意思是說"我客戶端沒有數(shù)據(jù)要發(fā)給你了",但是如果你服務(wù)器端還有數(shù)據(jù)沒有發(fā)送完成紧憾,則不必急著關(guān)閉連接到千,可以繼續(xù)發(fā)送數(shù)據(jù)。
- 第二次揮手:服務(wù)器端收到FIN后稻励,先發(fā)送ack=M+1父阻,告訴客戶端,你的請(qǐng)求我收到了望抽,但是我還沒準(zhǔn)備好加矛,請(qǐng)繼續(xù)你等我的消息。這個(gè)時(shí)候客戶端就進(jìn)入FIN_WAIT_2 狀態(tài)煤篙,繼續(xù)等待服務(wù)器端的FIN報(bào)文斟览。
- 第三次揮手:當(dāng)服務(wù)器端確定數(shù)據(jù)已發(fā)送完成,則向客戶端發(fā)送FIN=N報(bào)文辑奈,告訴客戶端苛茂,好了,我這邊數(shù)據(jù)發(fā)完了鸠窗,準(zhǔn)備好關(guān)閉連接了妓羊。服務(wù)器端進(jìn)入LAST_ACK狀態(tài)。
- 第四次揮手:客戶端收到FIN=N報(bào)文后稍计,就知道可以關(guān)閉連接了躁绸,但是他還是不相信網(wǎng)絡(luò),怕服務(wù)器端不知道要關(guān)閉臣嚣,所以發(fā)送ack=N+1后進(jìn)入TIME_WAIT狀態(tài)净刮,如果Server端沒有收到ACK則可以重傳。服務(wù)器端收到ACK后硅则,就知道可以斷開連接了淹父。客戶端等待了2MSL后依然沒有收到回復(fù)怎虫,則證明服務(wù)器端已正常關(guān)閉暑认,那好,我客戶端也可以關(guān)閉連接了大审。最終完成了四次握手蘸际。
上面是一方主動(dòng)關(guān)閉,另一方被動(dòng)關(guān)閉的情況饥努,實(shí)際中還會(huì)出現(xiàn)同時(shí)發(fā)起主動(dòng)關(guān)閉的情況捡鱼,
具體流程如下圖:
同時(shí)揮手
3.3 通過序列號(hào)與確認(rèn)應(yīng)答提高可靠性
- 在 TCP 中八回,當(dāng)發(fā)送端的數(shù)據(jù)到達(dá)接收主機(jī)時(shí)酷愧,接收端主機(jī)會(huì)返回一個(gè)已收到消息的通知驾诈。這個(gè)消息叫做確認(rèn)應(yīng)答(ACK)。當(dāng)發(fā)送端將數(shù)據(jù)發(fā)出之后會(huì)等待對(duì)端的確認(rèn)應(yīng)答溶浴。如果有確認(rèn)應(yīng)答乍迄,說明數(shù)據(jù)已經(jīng)成功到達(dá)對(duì)端。反之士败,則數(shù)據(jù)丟失的可能性很大闯两。
- 在一定時(shí)間內(nèi)沒有等待到確認(rèn)應(yīng)答,發(fā)送端就可以認(rèn)為數(shù)據(jù)已經(jīng)丟失谅将,并進(jìn)行重發(fā)漾狼。由此,即使產(chǎn)生了丟包饥臂,仍然能夠保證數(shù)據(jù)能夠到達(dá)對(duì)端逊躁,實(shí)現(xiàn)可靠傳輸。
- 未收到確認(rèn)應(yīng)答并不意味著數(shù)據(jù)一定丟失隅熙。也有可能是數(shù)據(jù)對(duì)方已經(jīng)收到稽煤,只是返回的確認(rèn)應(yīng)答在途中丟失。這種情況也會(huì)導(dǎo)致發(fā)送端誤以為數(shù)據(jù)沒有到達(dá)目的地而重發(fā)數(shù)據(jù)囚戚。
- 此外酵熙,也有可能因?yàn)橐恍┢渌驅(qū)е麓_認(rèn)應(yīng)答延遲到達(dá),在源主機(jī)重發(fā)數(shù)據(jù)以后才到達(dá)的情況也屢見不鮮驰坊。此時(shí)匾二,源主機(jī)只要按照機(jī)制重發(fā)數(shù)據(jù)即可。
- 對(duì)于目標(biāo)主機(jī)來說庐橙,反復(fù)收到相同的數(shù)據(jù)是不可取的假勿。為了對(duì)上層應(yīng)用提供可靠的傳輸,目標(biāo)主機(jī)必須放棄重復(fù)的數(shù)據(jù)包态鳖。為此我們引入了序列號(hào)转培。
- 序列號(hào)是按照順序給發(fā)送數(shù)據(jù)的每一個(gè)字節(jié)(8位字節(jié))都標(biāo)上號(hào)碼的編號(hào)。接收端查詢接收數(shù)據(jù) TCP 首部中的序列號(hào)和數(shù)據(jù)的長(zhǎng)度浆竭,將自己下一步應(yīng)該接收的序列號(hào)作為確認(rèn)應(yīng)答返送回去浸须。通過序列號(hào)和確認(rèn)應(yīng)答號(hào),TCP 能夠識(shí)別是否已經(jīng)接收數(shù)據(jù)邦泄,又能夠判斷是否需要接收删窒,從而實(shí)現(xiàn)可靠傳輸。
序列號(hào)和確認(rèn)應(yīng)答
3.4 重發(fā)超時(shí)的確定
- 重發(fā)超時(shí)是指在重發(fā)數(shù)據(jù)之前顺囊,等待確認(rèn)應(yīng)答到來的那個(gè)特定時(shí)間間隔肌索。如果超過這個(gè)時(shí)間仍未收到確認(rèn)應(yīng)答,發(fā)送端將進(jìn)行數(shù)據(jù)重發(fā)特碳。最理想的是诚亚,找到一個(gè)最小時(shí)間晕换,它能保證“確認(rèn)應(yīng)答一定能在這個(gè)時(shí)間內(nèi)返回”。
- TCP 要求不論處在何種網(wǎng)絡(luò)環(huán)境下都要提供高性能通信站宗,并且無論網(wǎng)絡(luò)擁堵情況發(fā)生何種變化闸准,都必須保持這一特性。為此梢灭,它在每次發(fā)包時(shí)都會(huì)計(jì)算往返時(shí)間及其偏差夷家。將這個(gè)往返時(shí)間和偏差時(shí)間相加,重發(fā)超時(shí)的時(shí)間就是比這個(gè)總和要稍大一點(diǎn)的值敏释。
- 在 BSD 的 Unix 以及 Windows 系統(tǒng)中库快,超時(shí)都以0.5秒為單位進(jìn)行控制,因此重發(fā)超時(shí)都是0.5秒的整數(shù)倍钥顽。不過缺谴,最初其重發(fā)超時(shí)的默認(rèn)值一般設(shè)置為6秒左右。
- 數(shù)據(jù)被重發(fā)之后若還是收不到確認(rèn)應(yīng)答耳鸯,則進(jìn)行再次發(fā)送湿蛔。此時(shí),等待確認(rèn)應(yīng)答的時(shí)間將會(huì)以2倍县爬、4倍的指數(shù)函數(shù)延長(zhǎng)阳啥。
- 此外,數(shù)據(jù)也不會(huì)被無限财喳、反復(fù)地重發(fā)察迟。達(dá)到一定重發(fā)次數(shù)之后,如果仍沒有任何確認(rèn)應(yīng)答返回耳高,就會(huì)判斷為網(wǎng)絡(luò)或?qū)Χ酥鳈C(jī)發(fā)生了異常扎瓶,強(qiáng)制關(guān)閉連接。并且通知應(yīng)用通信異常強(qiáng)行終止泌枪。
3.5 以段為單位發(fā)送數(shù)據(jù)
- 在建立 TCP 連接的同時(shí)概荷,也可以確定發(fā)送數(shù)據(jù)包的單位,我們也可以稱其為“最大消息長(zhǎng)度”(MSS)碌燕。最理想的情況是误证,最大消息長(zhǎng)度正好是 IP 中不會(huì)被分片處理的最大數(shù)據(jù)長(zhǎng)度。
- TCP 在傳送大量數(shù)據(jù)時(shí)修壕,是以 MSS 的大小將數(shù)據(jù)進(jìn)行分割發(fā)送愈捅。進(jìn)行重發(fā)時(shí)也是以 MSS 為單位。
- MSS 在三次握手的時(shí)候慈鸠,在兩端主機(jī)之間被計(jì)算得出蓝谨。兩端的主機(jī)在發(fā)出建立連接的請(qǐng)求時(shí),會(huì)在 TCP 首部中寫入 MSS 選項(xiàng),告訴對(duì)方自己的接口能夠適應(yīng)的 MSS 的大小譬巫。然后會(huì)在兩者之間選擇一個(gè)較小的值投入使用稽亏。
3.6 利用窗口控制提高速度
- TCP 以1個(gè)段為單位,每發(fā)送一個(gè)段進(jìn)行一次確認(rèn)應(yīng)答的處理缕题。這樣的傳輸方式有一個(gè)缺點(diǎn),就是包的往返時(shí)間越長(zhǎng)通信性能就越低胖腾。
- 為解決這個(gè)問題烟零,TCP 引入了窗口這個(gè)概念。確認(rèn)應(yīng)答不再是以每個(gè)分段咸作,而是以更大的單位進(jìn)行確認(rèn)锨阿,轉(zhuǎn)發(fā)時(shí)間將會(huì)被大幅地縮短。也就是說记罚,發(fā)送端主機(jī)墅诡,在發(fā)送了一個(gè)段以后不必要一直等待確認(rèn)應(yīng)答,而是繼續(xù)發(fā)送桐智。如下圖所示:
- 窗口控制
- 窗口大小就是指無需等待確認(rèn)應(yīng)答而可以繼續(xù)發(fā)送數(shù)據(jù)的最大值末早。上圖中窗口大小為4個(gè)段。這個(gè)機(jī)制實(shí)現(xiàn)了使用大量的緩沖區(qū)说庭,通過對(duì)多個(gè)段同時(shí)進(jìn)行確認(rèn)應(yīng)答的功能然磷。
3.7 滑動(dòng)窗口控制
滑動(dòng)窗口
- 上圖中的窗口內(nèi)的數(shù)據(jù)即便沒有收到確認(rèn)應(yīng)答也可以被發(fā)送出去。不過刊驴,在整個(gè)窗口的確認(rèn)應(yīng)答沒有到達(dá)之前姿搜,如果其中部分?jǐn)?shù)據(jù)出現(xiàn)丟包,那么發(fā)送端仍然要負(fù)責(zé)重傳捆憎。為此舅柜,發(fā)送端主機(jī)需要設(shè)置緩存保留這些待被重傳的數(shù)據(jù),直到收到他們的確認(rèn)應(yīng)答躲惰。
- 在滑動(dòng)窗口以外的部分包括未發(fā)送的數(shù)據(jù)以及已經(jīng)確認(rèn)對(duì)端已收到的數(shù)據(jù)致份。當(dāng)數(shù)據(jù)發(fā)出后若如期收到確認(rèn)應(yīng)答就可以不用再進(jìn)行重發(fā),此時(shí)數(shù)據(jù)就可以從緩存區(qū)清除础拨。
- 收到確認(rèn)應(yīng)答的情況下知举,將窗口滑動(dòng)到確認(rèn)應(yīng)答中的序列號(hào)的位置。這樣可以順序地將多個(gè)段同時(shí)發(fā)送提高通信性能太伊。這種機(jī)制也別稱為滑動(dòng)窗口控制雇锡。
3.8 窗口控制中的重發(fā)控制
在使用窗口控制中, 出現(xiàn)丟包一般分為兩種情況:
- ① 確認(rèn)應(yīng)答未能返回的情況僚焦。在這種情況下锰提,數(shù)據(jù)已經(jīng)到達(dá)對(duì)端,是不需要再進(jìn)行重發(fā)的,如下圖:
部分確認(rèn)應(yīng)答丟失
- ② 某個(gè)報(bào)文段丟失的情況立肘。接收主機(jī)如果收到一個(gè)自己應(yīng)該接收的序列號(hào)以外的數(shù)據(jù)時(shí)边坤,會(huì)針對(duì)當(dāng)前為止收到數(shù)據(jù)返回確認(rèn)應(yīng)答。如下圖所示谅年,當(dāng)某一報(bào)文段丟失后茧痒,發(fā)送端會(huì)一直收到序號(hào)為1001的確認(rèn)應(yīng)答,因此融蹂,在窗口比較大旺订,又出現(xiàn)報(bào)文段丟失的情況下,同一個(gè)序列號(hào)的確認(rèn)應(yīng)答將會(huì)被重復(fù)不斷地返回超燃。而發(fā)送端主機(jī)如果連續(xù)3次收到同一個(gè)確認(rèn)應(yīng)答区拳,就會(huì)將其對(duì)應(yīng)的數(shù)據(jù)進(jìn)行重發(fā)。這種機(jī)制比之前提到的超時(shí)管理更加高效意乓,因此也被稱為高速重發(fā)控制樱调。
高速重發(fā)控制
四、網(wǎng)絡(luò)層中的 IP 協(xié)議
- IP(IPv4届良、IPv6)相當(dāng)于 OSI 參考模型中的第3層——網(wǎng)絡(luò)層笆凌。網(wǎng)絡(luò)層的主要作用是“實(shí)現(xiàn)終端節(jié)點(diǎn)之間的通信”。這種終端節(jié)點(diǎn)之間的通信也叫“點(diǎn)對(duì)點(diǎn)通信”士葫。
- 網(wǎng)絡(luò)的下一層——數(shù)據(jù)鏈路層的主要作用是在互連同一種數(shù)據(jù)鏈路的節(jié)點(diǎn)之間進(jìn)行包傳遞菩颖。而一旦跨越多種數(shù)據(jù)鏈路,就需要借助網(wǎng)絡(luò)層为障。網(wǎng)絡(luò)層可以跨越不同的數(shù)據(jù)鏈路晦闰,即使是在不同的數(shù)據(jù)鏈路上也能實(shí)現(xiàn)兩端節(jié)點(diǎn)之間的數(shù)據(jù)包傳輸。
- IP 大致分為三大作用模塊鳍怨,它們是 IP 尋址呻右、路由(最終節(jié)點(diǎn)為止的轉(zhuǎn)發(fā))以及 IP 分包與組包。
1. IP 地址
1.1 IP 地址概述
- 在計(jì)算機(jī)通信中鞋喇,為了識(shí)別通信對(duì)端声滥,必須要有一個(gè)類似于地址的識(shí)別碼進(jìn)行標(biāo)識(shí)。在數(shù)據(jù)鏈路中的 MAC 地址正是用來標(biāo)識(shí)同一個(gè)鏈路中不同計(jì)算機(jī)的一種識(shí)別碼侦香。
- 作為網(wǎng)絡(luò)層的 IP ,也有這種地址信息落塑,一般叫做 IP 地址。IP 地址用于在“連接到網(wǎng)絡(luò)中的所有主機(jī)中識(shí)別出進(jìn)行通信的目標(biāo)地址”罐韩。因此憾赁,在 TCP/IP 通信中所有主機(jī)或路由器必須設(shè)定自己的 IP 地址。
- 不論一臺(tái)主機(jī)與哪種數(shù)據(jù)鏈路連接散吵,其 IP 地址的形式都保持不變龙考。
- IP 地址(IPv4 地址)由32位正整數(shù)來表示蟆肆。IP 地址在計(jì)算機(jī)內(nèi)部以二進(jìn)制方式被處理。然而晦款,由于我們并不習(xí)慣于采用二進(jìn)制方式炎功,我們將32位的 IP 地址以每8位為一組,分成4組缓溅,每組以 “.” 隔開蛇损,再將每組數(shù)轉(zhuǎn)換成十進(jìn)制數(shù)。如下:
1.2 IP 地址由網(wǎng)絡(luò)和主機(jī)兩部分標(biāo)識(shí)組成
- 如下圖坛怪,網(wǎng)絡(luò)標(biāo)識(shí)在數(shù)據(jù)鏈路的每個(gè)段配置不同的值淤齐。網(wǎng)絡(luò)標(biāo)識(shí)必須保證相互連接的每個(gè)段的地址不相重復(fù)。而相同段內(nèi)相連的主機(jī)必須有相同的網(wǎng)絡(luò)地址酝陈。IP 地址的“主機(jī)標(biāo)識(shí)”則不允許在同一個(gè)網(wǎng)段內(nèi)重復(fù)出現(xiàn)。由此,可以通過設(shè)置網(wǎng)絡(luò)地址和主機(jī)地址,在相互連接的整個(gè)網(wǎng)絡(luò)中保證每臺(tái)主機(jī)的 IP 地址都不會(huì)相互重疊阔涉。即 IP 地址具有了唯一性拭宁。
IP地址的主機(jī)標(biāo)識(shí)
- 如下圖,IP 包被轉(zhuǎn)發(fā)到途中某個(gè)路由器時(shí)毯欣,正是利用目標(biāo) IP 地址的網(wǎng)絡(luò)標(biāo)識(shí)進(jìn)行路由。因?yàn)榧词共豢粗鳈C(jī)標(biāo)識(shí),只要一見到網(wǎng)絡(luò)標(biāo)識(shí)就能判斷出是否為該網(wǎng)段內(nèi)的主機(jī)喇勋。
IP地址的網(wǎng)絡(luò)標(biāo)識(shí)
1.3 IP 地址的分類
- IP 地址分為四個(gè)級(jí)別,分別為A類偎行、B類川背、C類、D類蛤袒。它根據(jù) IP 地址中從第 1 位到第 4 位的比特列對(duì)其網(wǎng)絡(luò)標(biāo)識(shí)和主機(jī)標(biāo)識(shí)進(jìn)行區(qū)分熄云。
- A 類 IP 地址是首位以 “0” 開頭的地址。從第 1 位到第 8 位是它的網(wǎng)絡(luò)標(biāo)識(shí)妙真。用十進(jìn)制表示的話缴允,0.0.0.0~127.0.0.0 是 A 類的網(wǎng)絡(luò)地址。A 類地址的后 24 位相當(dāng)于主機(jī)標(biāo)識(shí)珍德。因此练般,一個(gè)網(wǎng)段內(nèi)可容納的主機(jī)地址上限為16,777,214個(gè)。
- B 類 IP 地址是前兩位 “10” 的地址锈候。從第 1 位到第 16 位是它的網(wǎng)絡(luò)標(biāo)識(shí)薄料。用十進(jìn)制表示的話,128.0.0.0~191.255.0.0 是 B 類的網(wǎng)絡(luò)地址泵琳。B 類地址的后 16 位相當(dāng)于主機(jī)標(biāo)識(shí)都办。因此嫡锌,一個(gè)網(wǎng)段內(nèi)可容納的主機(jī)地址上限為65,534個(gè)。
- C 類 IP 地址是前三位為 “110” 的地址琳钉。從第 1 位到第 24 位是它的網(wǎng)絡(luò)標(biāo)識(shí)势木。用十進(jìn)制表示的話,192.0.0.0~223.255.255.0 是 C 類的網(wǎng)絡(luò)地址歌懒。C 類地址的后 8 位相當(dāng)于主機(jī)標(biāo)識(shí)啦桌。因此,一個(gè)網(wǎng)段內(nèi)可容納的主機(jī)地址上限為254個(gè)及皂。
- D 類 IP 地址是前四位為 “1110” 的地址甫男。從第 1 位到第 32 位是它的網(wǎng)絡(luò)標(biāo)識(shí)。用十進(jìn)制表示的話验烧,224.0.0.0~239.255.255.255 是 D 類的網(wǎng)絡(luò)地址板驳。D 類地址沒有主機(jī)標(biāo)識(shí),常用于多播碍拆。
- 在分配 IP 地址時(shí)關(guān)于主機(jī)標(biāo)識(shí)有一點(diǎn)需要注意若治。即要用比特位表示主機(jī)地址時(shí),不可以全部為 0 或全部為 1感混。因?yàn)槿繛?0 只有在表示對(duì)應(yīng)的網(wǎng)絡(luò)地址或 IP 地址不可以獲知的情況下才使用端幼。而全部為 1 的主機(jī)通常作為廣播地址。因此弧满,在分配過程中婆跑,應(yīng)該去掉這兩種情況。這也是為什么 C 類地址每個(gè)網(wǎng)段最多只能有 254( 28 - 2 = 254)個(gè)主機(jī)地址的原因庭呜。
1.4 廣播地址
- 廣播地址用于在同一個(gè)鏈路中相互連接的主機(jī)之間發(fā)送數(shù)據(jù)包滑进。將 IP 地址中的主機(jī)地址部分全部設(shè)置為 1,就成了廣播地址募谎。
- 廣播分為本地廣播和直接廣播兩種郊供。在本網(wǎng)絡(luò)內(nèi)的廣播叫做本地廣播;在不同網(wǎng)絡(luò)之間的廣播叫做直接廣播近哟。
1.5 IP 多播
- 多播用于將包發(fā)送給特定組內(nèi)的所有主機(jī)驮审。由于其直接使用 IP 地址,因此也不存在可靠傳輸吉执。
- 相比于廣播疯淫,多播既可以穿透路由器,又可以實(shí)現(xiàn)只給那些必要的組發(fā)送數(shù)據(jù)包戳玫。請(qǐng)看下圖:
- IP 多播
- 多播使用 D 類地址熙掺。因此,如果從首位開始到第 4 位是 “1110”咕宿,就可以認(rèn)為是多播地址币绩。而剩下的 28 位可以成為多播的組編號(hào)蜡秽。
- 此外, 對(duì)于多播缆镣,所有的主機(jī)(路由器以外的主機(jī)和終端主機(jī))必須屬于 224.0.0.1 的組芽突,所有的路由器必須屬于 224.0.0.2 的組。
1.6 子網(wǎng)掩碼
- 現(xiàn)在一個(gè) IP 地址的網(wǎng)絡(luò)標(biāo)識(shí)和主機(jī)標(biāo)識(shí)已不再受限于該地址的類別董瞻,而是由一個(gè)叫做“子網(wǎng)掩碼”的識(shí)別碼通過子網(wǎng)網(wǎng)絡(luò)地址細(xì)分出比 A 類寞蚌、B 類、C 類更小粒度的網(wǎng)絡(luò)钠糊。這種方式實(shí)際上就是將原來 A 類挟秤、B 類、C 類等分類中的主機(jī)地址部分用作子網(wǎng)地址抄伍,可以將原網(wǎng)絡(luò)分為多個(gè)物理網(wǎng)絡(luò)的一種機(jī)制艘刚。
- 子網(wǎng)掩碼用二進(jìn)制方式表示的話,也是一個(gè) 32 位的數(shù)字截珍。它對(duì)應(yīng) IP 地址網(wǎng)絡(luò)標(biāo)識(shí)部分的位全部為 “1”攀甚,對(duì)應(yīng) IP 地址主機(jī)標(biāo)識(shí)的部分則全部為 “0”。由此笛臣,一個(gè) IP 地址可以不再受限于自己的類別云稚,而是可以用這樣的子網(wǎng)掩碼自由地定位自己的網(wǎng)絡(luò)標(biāo)識(shí)長(zhǎng)度隧饼。當(dāng)然沈堡,子網(wǎng)掩碼必須是 IP 地址的首位開始連續(xù)的 “1”。
- 對(duì)于子網(wǎng)掩碼燕雁,目前有兩種表示方式诞丽。第一種是,將 IP 地址與子網(wǎng)掩碼的地址分別用兩行來表示拐格。以 172.20.100.52 的前 26 位是網(wǎng)絡(luò)地址的情況為例僧免,如下:
- 第二種表示方式是,在每個(gè) IP 地址后面追加網(wǎng)絡(luò)地址的位數(shù)用 “/ ” 隔開捏浊,如下:
2. 路由
- 發(fā)送數(shù)據(jù)包時(shí)所使用的地址是網(wǎng)絡(luò)層的地址懂衩,即 IP 地址。然而僅僅有 IP 地址還不足以實(shí)現(xiàn)將數(shù)據(jù)包發(fā)送到對(duì)端目標(biāo)地址金踪,在數(shù)據(jù)發(fā)送過程中還需要類似于“指明路由器或主機(jī)”的信息浊洞,以便真正發(fā)往目標(biāo)地址。保存這種信息的就是路由控制表胡岔。
- 該路由控制表的形成方式有兩種:一種是管理員手動(dòng)設(shè)置法希,另一種是路由器與其他路由器相互交換信息時(shí)自動(dòng)刷新。前者也叫做靜態(tài)路由控制靶瘸,而后者叫做動(dòng)態(tài)路由控制苫亦。
- IP 協(xié)議始終認(rèn)為路由表是正確的毛肋。然后,IP 本身并沒有定義制作路由控制表的協(xié)議屋剑。即 IP 沒有制作路由控制表的機(jī)制润匙。該表示由一個(gè)叫做“路由協(xié)議”的協(xié)議制作而成。
2.1 IP 地址與路由控制
- IP 地址的網(wǎng)絡(luò)地址部分用于進(jìn)行路由控制饼丘。
- 路由控制表中記錄著網(wǎng)絡(luò)地址與下一步應(yīng)該發(fā)送至路由器的地址趁桃。
- 在發(fā)送 IP 包時(shí),首先要確定 IP 包首部中的目標(biāo)地址肄鸽,再從路由控制表中找到與該地址具有相同網(wǎng)絡(luò)地址的記錄卫病,根據(jù)該記錄將 IP 包轉(zhuǎn)發(fā)給相應(yīng)的下一個(gè)路由器。如果路由控制表中存在多條相同網(wǎng)絡(luò)地址的記錄典徘,就選擇一個(gè)最為吻合的網(wǎng)絡(luò)地址蟀苛。
路由控制表與 IP 包發(fā)送
3. IP 分包與組包
- 每種數(shù)據(jù)鏈路的最大傳輸單元(MTU)都不盡相同,因?yàn)槊總€(gè)不同類型的數(shù)據(jù)鏈路的使用目的不同逮诲。使用目的不同帜平,可承載的 MTU 也就不同。
- 任何一臺(tái)主機(jī)都有必要對(duì) IP 分片進(jìn)行相應(yīng)的處理梅鹦。分片往往在網(wǎng)絡(luò)上遇到比較大的報(bào)文無法一下子發(fā)送出去時(shí)才會(huì)進(jìn)行處理裆甩。
- 經(jīng)過分片之后的 IP 數(shù)據(jù)報(bào)在被重組的時(shí)候,只能由目標(biāo)主機(jī)進(jìn)行齐唆。路由器雖然做分片但不會(huì)進(jìn)行重組嗤栓。
3.1 路徑 MTU 發(fā)現(xiàn)
- 分片機(jī)制也有它的不足。如路由器的處理負(fù)荷加重之類箍邮。因此茉帅,只要允許,是不希望由路由器進(jìn)行 IP 數(shù)據(jù)包的分片處理的锭弊。
- 為了應(yīng)對(duì)分片機(jī)制的不足堪澎,“路徑 MTU 發(fā)現(xiàn)” 技術(shù)應(yīng)運(yùn)而生。路徑 MTU 指的是味滞,從發(fā)送端主機(jī)到接收端主機(jī)之間不需要分片是最大 MTU 的大小樱蛤。即路徑中存在的所有數(shù)據(jù)鏈路中最小的 MTU 。
- 進(jìn)行路徑 MTU 發(fā)現(xiàn)剑鞍,就可以避免在中途的路由器上進(jìn)行分片處理昨凡,也可以在 TCP 中發(fā)送更大的包。
4. IPv6
- IPv6(IP version 6)是為了根本解決 IPv4 地址耗盡的問題而被標(biāo)準(zhǔn)化的網(wǎng)際協(xié)議攒暇。IPv4 的地址長(zhǎng)度為 4 個(gè) 8 位字節(jié)土匀,即 32 比特。而 IPv6 的地址長(zhǎng)度則是原來的 4 倍形用,即 128 比特就轧,一般寫成 8 個(gè) 16 位字節(jié)证杭。
4.1 IPv6 的特點(diǎn)
- IP 得知的擴(kuò)大與路由控制表的聚合。
- 性能提升妒御。包首部長(zhǎng)度采用固定的值(40字節(jié))解愤,不再采用首部檢驗(yàn)碼。簡(jiǎn)化首部結(jié)構(gòu)乎莉,減輕路由器負(fù)擔(dān)送讲。路由器不再做分片處理。
- 支持即插即用功能惋啃。即使沒有DHCP服務(wù)器也可以實(shí)現(xiàn)自動(dòng)分配 IP 地址哼鬓。
- 采用認(rèn)證與加密功能。應(yīng)對(duì)偽造 IP 地址的網(wǎng)絡(luò)安全功能以及防止線路竊聽的功能边灭。
- 多播异希、Mobile IP 成為擴(kuò)展功能。
4.2 IPv6 中 IP 地址的標(biāo)記方法
- 一般人們將 128 比特 IP 地址以每 16 比特為一組绒瘦,每組用冒號(hào)(“:”)隔開進(jìn)行標(biāo)記称簿。
- 而且如果出現(xiàn)連續(xù)的 0 時(shí)還可以將這些 0 省略,并用兩個(gè)冒號(hào)(“::”)隔開惰帽。但是憨降,一個(gè) IP 地址中只允許出現(xiàn)一次兩個(gè)連續(xù)的冒號(hào)。
4.3 IPv6 地址的結(jié)構(gòu)
- IPv6 類似 IPv4该酗,也是通過 IP 地址的前幾位標(biāo)識(shí) IP 地址的種類授药。
- 在互聯(lián)網(wǎng)通信中,使用一種全局的單播地址垂涯。它是互聯(lián)網(wǎng)中唯一的一個(gè)地址烁焙,不需要正式分配 IP 地址航邢。
4.4 全局單播地址
- 全局單播地址是指世界上唯一的一個(gè)地址耕赘。它是互聯(lián)網(wǎng)通信以及各個(gè)域內(nèi)部通信中最為常用的一個(gè) IPv6 地址。
- 格式如下圖所示膳殷,現(xiàn)在 IPv6 的網(wǎng)絡(luò)中所使用的格式為操骡,n = 48,m = 16 以及 128 - n - m = 64赚窃。即前 64 比特為網(wǎng)絡(luò)標(biāo)識(shí)册招,后 64 比特為主機(jī)標(biāo)識(shí)。
全局單播地址
4.5 鏈路本地單播地址
- 鏈路本地單播地址是指在同一個(gè)數(shù)據(jù)鏈路內(nèi)唯一的地址勒极。它用于不經(jīng)過路由器是掰,在同一個(gè)鏈路中的通信。通常接口 ID 保存 64 比特版的 MAC 地址辱匿。
鏈路本地單播地址
4.6 唯一本地地址
- 唯一本地地址是不進(jìn)行互聯(lián)網(wǎng)通信時(shí)所用的地址键痛。
- 唯一本地地址雖然不會(huì)與互聯(lián)網(wǎng)連接炫彩,但是也會(huì)盡可能地隨機(jī)生成一個(gè)唯一的全局 ID。
- L 通常被置為 1
- 全局 ID 的值隨機(jī)決定
- 子網(wǎng) ID 是指該域子網(wǎng)地址
- 接口 ID 即為接口的 ID
唯一本地地址
4.7 IPv6 分段處理
- IPv6 的分片處理只在作為起點(diǎn)的發(fā)送端主機(jī)上進(jìn)行絮短,路由器不參與分片江兢。
- IPv6 中最小 MTU 為 1280 字節(jié),因此丁频,在嵌入式系統(tǒng)中對(duì)于那些有一定系統(tǒng)資源限制的設(shè)備來說杉允,不需要進(jìn)行“路徑 MTU 發(fā)現(xiàn)”,而是在發(fā)送 IP 包時(shí)直接以 1280 字節(jié)為單位分片送出席里。
4.8 IP 首部(暫略)
5. IP 協(xié)議相關(guān)技術(shù)
- IP 旨在讓最終目標(biāo)主機(jī)收到數(shù)據(jù)包叔磷,但是在這一過程中僅僅有 IP 是無法實(shí)現(xiàn)通信的。必須還有能夠解析主機(jī)名稱和 MAC 地址的功能奖磁,以及數(shù)據(jù)包在發(fā)送過程中異常情況處理的功能世澜。
5.1 DNS
- 我們平常在訪問某個(gè)網(wǎng)站時(shí)不適用 IP 地址,而是用一串由羅馬字和點(diǎn)號(hào)組成的字符串署穗。而一般用戶在使用 TCP/IP 進(jìn)行通信時(shí)也不使用 IP 地址寥裂。能夠這樣做是因?yàn)橛辛?DNS (Domain Name System)功能的支持。DNS 可以將那串字符串自動(dòng)轉(zhuǎn)換為具體的 IP 地址案疲。
- 這種 DNS 不僅適用于 IPv4封恰,還適用于 IPv6。
5.2 ARP
- 只要確定了 IP 地址褐啡,就可以向這個(gè)目標(biāo)地址發(fā)送 IP 數(shù)據(jù)報(bào)诺舔。然而,在底層數(shù)據(jù)鏈路層备畦,進(jìn)行實(shí)際通信時(shí)卻有必要了解每個(gè) IP 地址所對(duì)應(yīng)的 MAC 地址低飒。
- ARP 是一種解決地址問題的協(xié)議。以目標(biāo) IP 地址為線索懂盐,用來定位下一個(gè)應(yīng)該接收數(shù)據(jù)分包的網(wǎng)絡(luò)設(shè)備對(duì)應(yīng)的 MAC 地址褥赊。不過 ARP 只適用于 IPv4,不能用于 IPv6莉恼。IPv6 中可以用 ICMPv6 替代 ARP 發(fā)送鄰居探索消息拌喉。
- RARP 是將 ARP 反過來,從 MAC 地址定位 IP 地址的一種協(xié)議俐银。
5.3 ICMP
- ICMP 的主要功能包括尿背,確認(rèn) IP 包是否成功送達(dá)目標(biāo)地址,通知在發(fā)送過程當(dāng)中 IP 包被廢棄的具體原因捶惜,改善網(wǎng)絡(luò)設(shè)置等田藐。
- IPv4 中 ICMP 僅作為一個(gè)輔助作用支持 IPv4。也就是說,在 IPv4 時(shí)期汽久,即使沒有 ICMP茴晋,仍然可以實(shí)現(xiàn) IP 通信。然而回窘,在 IPv6 中诺擅,ICMP 的作用被擴(kuò)大,如果沒有 ICMPv6啡直,IPv6 就無法進(jìn)行正常通信烁涌。
5.4 DHCP
- 如果逐一為每一臺(tái)主機(jī)設(shè)置 IP 地址會(huì)是非常繁瑣的事情。特別是在移動(dòng)使用筆記本電腦酒觅、只能終端以及平板電腦等設(shè)備時(shí)撮执,每移動(dòng)到一個(gè)新的地方,都要重新設(shè)置 IP 地址舷丹。
- 于是抒钱,為了實(shí)現(xiàn)自動(dòng)設(shè)置 IP 地址、統(tǒng)一管理 IP 地址分配颜凯,就產(chǎn)生了 DHCP(Dynamic Host Configuration Protocol)協(xié)議谋币。有了 DHCP,計(jì)算機(jī)只要連接到網(wǎng)絡(luò)症概,就可以進(jìn)行 TCP/IP 通信蕾额。也就是說,DHCP 讓即插即用變得可能彼城。
- DHCP 不僅在 IPv4 中诅蝶,在 IPv6 中也可以使用。
5.5 NAT
- NAT(Network Address Translator)是用于在本地網(wǎng)絡(luò)中使用私有地址募壕,在連接互聯(lián)網(wǎng)時(shí)轉(zhuǎn)而使用全局 IP 地址的技術(shù)调炬。
- 除轉(zhuǎn)換 IP 地址外,還出現(xiàn)了可以轉(zhuǎn)換 TCP舱馅、UDP 端口號(hào)的 NAPT(Network Address Ports Translator)技術(shù)缰泡,由此可以實(shí)現(xiàn)用一個(gè)全局 IP 地址與多個(gè)主機(jī)的通信。
- NAT(NAPT)實(shí)際上是為正在面臨地址枯竭的 IPv4 而開發(fā)的技術(shù)习柠。不過匀谣,在 IPv6 中為了提高網(wǎng)絡(luò)安全也在使用 NAT照棋,在 IPv4 和 IPv6 之間的相互通信當(dāng)中常常使用 NAT-PT资溃。
5.6 IP 隧道
夾著 IPv4 網(wǎng)絡(luò)的兩個(gè) IPv6 網(wǎng)絡(luò)
- 如上圖的網(wǎng)絡(luò)環(huán)境中,網(wǎng)絡(luò) A 與網(wǎng)絡(luò) B 之間無法直接進(jìn)行通信烈炭,為了讓它們之間正常通信溶锭,這時(shí)必須得采用 IP 隧道的功能。
- IP 隧道可以將那些從網(wǎng)絡(luò) A 發(fā)過來的 IPv6 的包統(tǒng)合為一個(gè)數(shù)據(jù)符隙,再為之追加一個(gè) IPv4 的首部以后轉(zhuǎn)發(fā)給網(wǎng)絡(luò) C趴捅。
- 一般情況下垫毙,緊接著 IP 首部的是 TCP 或 UDP 的首部。然而拱绑,現(xiàn)在的應(yīng)用當(dāng)中“ IP 首部的后面還是 IP 首部”或者“ IP 首部的后面是 IPv6 的首部”等情況與日俱增综芥。這種在網(wǎng)絡(luò)層的首部后面追加網(wǎng)絡(luò)層首部的通信方法就叫做“ IP 隧道”。