久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

手機站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時隨地免費學(xué)

千鋒教育

掃一掃進入千鋒手機站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時隨地免費學(xué)習(xí)課程

當(dāng)前位置:首頁  >  技術(shù)干貨  > 網(wǎng)絡(luò)層協(xié)議 ——— IP協(xié)議

網(wǎng)絡(luò)層協(xié)議 ——— IP協(xié)議

來源:千鋒教育
發(fā)布人:wjy
時間: 2022-12-29 11:40:00 1672285200

  IP 協(xié)議

  IP 協(xié)議全稱為 “網(wǎng)際互連協(xié)議(Internet Protocol)”,IP 協(xié)議是 TCP/IP 體系中的網(wǎng)絡(luò)層協(xié)議。

  基本概念

  網(wǎng)絡(luò)層解決的問題

  TCP 作為傳輸層控制協(xié)議,其保證的是數(shù)據(jù)傳輸?shù)目煽啃院蛡鬏斝?,?TCP 提供的僅僅是數(shù)據(jù)傳輸?shù)牟呗?,而真正負?zé)數(shù)據(jù)在網(wǎng)絡(luò)中傳輸?shù)膭t傳輸層之下的網(wǎng)絡(luò)層和鏈路層。

  雙方在進行網(wǎng)絡(luò)通信時,發(fā)送的數(shù)據(jù)并不是直接從一方的傳輸層直接發(fā)送到了另一方的傳輸層,而是需要傳輸層將數(shù)據(jù)繼續(xù)向下進行交付,在網(wǎng)絡(luò)層和鏈路層經(jīng)過數(shù)據(jù)封裝后再通過網(wǎng)絡(luò)發(fā)送到對方主機,對方主機收到數(shù)據(jù)后也同樣需要在鏈路層和網(wǎng)絡(luò)層進行數(shù)據(jù)解包,此時對方的傳輸層才拿到了發(fā)送過來的數(shù)據(jù),然后再繼續(xù)將該數(shù)據(jù)向上進行交付。

  網(wǎng)絡(luò)通信的過程,就像兩個人在送互相送數(shù)據(jù),這兩個人分別在兩棟樓的四樓,如果一個人要將數(shù)據(jù)交給對方,那么這個人就必須先從四樓走到一樓,然后再在路上經(jīng)過路徑選擇到達對方樓下,最后再上到四樓將數(shù)據(jù)交給對方。

IP協(xié)議1

  其中,送數(shù)據(jù)的這個人從四樓下來的過程就是數(shù)據(jù)封裝的過程,這個人在路上經(jīng)過路徑選擇到達對方樓下的過程就是數(shù)據(jù)路由的過程,而這個人再上到四樓將數(shù)據(jù)交給對方的過程就是數(shù)據(jù)解包的過程。

  而網(wǎng)絡(luò)層要解決的問題就是,將數(shù)據(jù)從一臺主機送到另一臺主機,也就是數(shù)據(jù)的路由。

  保證數(shù)據(jù)可靠的從一臺主機送到另一臺主機的前提

  當(dāng)雙方在進行基于 TCP 的網(wǎng)絡(luò)通信時,要保證將數(shù)據(jù)可靠的從一臺主機送到另一臺主機,前提是發(fā)送方要有將數(shù)據(jù)送到對方主機的能力,要是發(fā)送方連將數(shù)據(jù)發(fā)送給對方的能力都沒有,那就更不用談可靠的將數(shù)據(jù)送給對方主機了。

  需要注意的是,發(fā)送方有將數(shù)據(jù)送到對方主機的能力,并不意味著發(fā)送方每次發(fā)送的數(shù)據(jù)都能夠成功的發(fā)送到對方,但如果發(fā)送方連將數(shù)據(jù)發(fā)送給對方的能力都沒有,那發(fā)送方基本就不可能將數(shù)據(jù)發(fā)送給對方。

  一旦發(fā)送方有了將數(shù)據(jù)發(fā)送給對方的能力,就算發(fā)送方某次發(fā)送的數(shù)據(jù)沒有成功到達對方,此時上層 TCP 由于沒有收到對應(yīng)數(shù)據(jù)的應(yīng)答,此時上層 TCP 會要求進行數(shù)據(jù)重發(fā),直到數(shù)據(jù)成功發(fā)送到對方主機為止。

  也就是說,在網(wǎng)絡(luò)層有能力將數(shù)據(jù)送到對方主機的情況下,雖然網(wǎng)絡(luò)層不能保證每次都能將數(shù)據(jù)成功送到對方主機,但在 TCP 提供的可靠性策略的保證下,最終網(wǎng)絡(luò)層就一定能夠?qū)?shù)據(jù)可靠的發(fā)送到對方主機。

  說明一下:

  網(wǎng)絡(luò)層解決的問題是,將數(shù)據(jù)從一臺主機送到另一臺主機,因此網(wǎng)絡(luò)層解決的是主機到主機的問題。

  一方傳輸層從上方進程拿到數(shù)據(jù)后,該數(shù)據(jù)貫穿網(wǎng)絡(luò)協(xié)議棧進行封裝和解包,最終到達對方傳輸層,此時對方傳輸層也會將數(shù)據(jù)向上交給對應(yīng)的進程,因此傳輸層解決的是進程到進程的問題。

  路徑選擇

  數(shù)據(jù)進行的網(wǎng)絡(luò)傳輸一般都是跨網(wǎng)絡(luò)的,而路由器就是連接多個網(wǎng)絡(luò)的硬件設(shè)備,因此數(shù)據(jù)在進行跨網(wǎng)絡(luò)傳輸時一定需要經(jīng)過多個路由器。

IP協(xié)議2

  數(shù)據(jù)路由就像我們旅游一樣,當(dāng)確定了要到達的目標主機后,就需要尋找最短的路徑到達該目的地。

  目的地的確定是非常重要的,因為目的地直接決定了數(shù)據(jù)路由時的路徑選擇,這也是跨網(wǎng)絡(luò)找到目標主機的根本。

  只有數(shù)據(jù)經(jīng)過了較為正確的路徑選擇,最終才可能慢慢趨近于目標網(wǎng)絡(luò)或目標主機。

  確定數(shù)據(jù)路由的目的地后,數(shù)據(jù)就可以在網(wǎng)絡(luò)中進行路由了,但數(shù)據(jù)在路由時無法自行進行路徑選擇,因為這個數(shù)據(jù)本身是 “不認識路” 的,因此數(shù)據(jù)在路由的過程中需要不斷 “找路人問路”,而這里所謂的“路人” 就是網(wǎng)絡(luò)當(dāng)中的一臺臺路由器。

  網(wǎng)絡(luò)當(dāng)中的路由器是 “認識路的”,它們將自己的“認路經(jīng)驗” 都記錄到路由表當(dāng)中,因此路由器可以通過查路由表找到去特定點的最短路徑。因此數(shù)據(jù)在路由時,會不斷通過路由器來進行路徑選擇,以此來一步步靠近目標網(wǎng)絡(luò)或目標主機。

IP協(xié)議3

  主機和路由器

  主機:配有 IP 地址,但是不進行路由控制的設(shè)備。但實際現(xiàn)在幾乎不存在不進行路由控制的設(shè)備了,就連你的筆記本也會進行路由控制。

  路由器:既配有 IP 地址,又能進行路由控制。實際現(xiàn)在主流的路由器已經(jīng)不僅僅具有路由的功能了,它甚至具備某些應(yīng)用層的功能。

  節(jié)點:主機和路由器的統(tǒng)稱。

  IP 協(xié)議格式

  IP 協(xié)議格式如下:

IP協(xié)議4

  4 位版本號(version):指定 IP 協(xié)議的版本(IPv4/IPv6),對于 IPv4 來說,就是 4。

  4 位首部長度(header length):表示 IP 報頭的長度,以 4 字節(jié)為單位。

  8 位服務(wù)類型(Type Of Service):3 位優(yōu)先權(quán)字段(已經(jīng)棄用),4 位 TOS 字段,和 1 位保留字段(必須置為 0)。4 位 TOS 分別表示:最小延時,最大吞吐量,最高可靠性,最小成本。這四者相互沖突,只能選擇一個。比如對于 ssh/telnet 這樣的應(yīng)用程序,最小延時比較重要,而對于 ftp 這樣的程序,最大吞吐量比較重要。

  16 位總長度(total length):IP 報文(IP 報頭 + 有效載荷)的總長度,用于將各個 IP 報文進行分離。

  16 位標識(id):唯一的標識主機發(fā)送的報文,如果數(shù)據(jù)在 IP 層進行了分片,那么每一個分片對應(yīng)的 id 都是相同的。

  3 位標志字段:第一位保留,表示暫時沒有規(guī)定該字段的意義。第二位表示禁止分片,表示如果報文長度超過 MTU,IP 模塊就會丟棄該報文。第三位表示 “更多分片”,如果報文沒有進行分片,則該字段設(shè)置為 0,如果報文進行了分片,則除了最后一個分片報文設(shè)置為 0 以外,其余分片報文均設(shè)置為 1。

  13 位片偏移(framegament offset):分片相對于原始數(shù)據(jù)開始處的偏移,表示當(dāng)前分片在原數(shù)據(jù)中的偏移位置,實際偏移的字節(jié)數(shù)是這個值× 8 \times 8×8 得到的。因此除了最后一個報文之外,其他報文的長度必須是 8 的整數(shù)倍,否則報文就不連續(xù)了。

  8 位生存時間(Time To Live,TTL):數(shù)據(jù)報到達目的地的最大報文跳數(shù),一般是 64,每經(jīng)過一個路由,TTL -= 1,一直減到 0 還沒到達,那么就丟棄了,這個字段主要是用來防止出現(xiàn)路由循環(huán)。

  8 位協(xié)議:表示上層協(xié)議的類型。

  16 位首部檢驗和:使用 CRC 進行校驗,來鑒別數(shù)據(jù)報的首部是否損壞,但不檢驗數(shù)據(jù)部分。

  32 位源 IP 地址和 32 位目的 IP 地址:表示發(fā)送端和接收端所對應(yīng)的 IP 地址。

  選項字段:不定長,最多 40 字節(jié)。

  IP 報頭在內(nèi)核當(dāng)中本質(zhì)就是一個位段類型,給數(shù)據(jù)封裝 IP 報頭時,實際上就是用該位段類型定義一個變量,然后填充 IP 報頭當(dāng)中的各個屬性字段,最后將這個 IP 報頭拷貝到數(shù)據(jù)的首部,至此便完成了 IP 報頭的封裝。

  IP 如何將報頭與有效載荷進行分離?

  IP 分離報頭與有效載荷的方法與 TCP 是一模一樣的,當(dāng) IP 從底層獲取到一個報文后,雖然 IP 不知道報頭的具體長度,但 IP 報文的前 20 個字節(jié)是 IP 的基本報頭,并且這 20 字節(jié)當(dāng)中涵蓋 4 位首部長度。

  因此 IP 是這樣分離報頭與有效載荷的:

  當(dāng) IP 從底層獲取到一個報文后,首先讀取報文的前 20 個字節(jié),并從中提取出 4 位的首部長度,此時便獲得了 IP 報頭的大小s i z e sizesize。

  如果s i z e sizesize 的值大于 20 字節(jié),則需要繼續(xù)從報文當(dāng)中讀取s i z e − 20 size-20size−20 字節(jié)的數(shù)據(jù),這部分數(shù)據(jù)就是 IP 報頭當(dāng)中的選項字段。

  讀取完 IP 的基本報頭和選項字段后,剩下的就是有效載荷了。

  IP 就是通過這種 “定長報頭 + 自描述字段” 的方式進行報頭和有效載荷的分離的。但需要注意的是,IP 報頭當(dāng)中的 4 位首部長度描述的基本單位與 TCP 報頭當(dāng)中的 4 位首部長度一樣,都是以 4 字節(jié)為單位進行描述的,這也恰好是報文的寬度。

  4 位二進制的取值范圍是 0000 ~ 1111,因此 IP 報頭的最大長度為15 × 4 = 60 15\times 4=6015×4=60 字節(jié),因為基本報頭的長度是 20 字節(jié),所以 IP 報頭中選項字段的長度最多是 40 字節(jié)。如果 IP 報頭當(dāng)中不攜帶選項字段,那么 IP 報頭的長度就是 20 字節(jié),此時報頭當(dāng)中的 4 位首部長度字段所填的值就是20 ÷ 4 = 5 20\div 4=520÷4=5,即 0101。

  IP 如何決定將有效載荷交付給上層的哪一個協(xié)議?

  基于 IP 協(xié)議的傳輸層協(xié)議不止一種,因此當(dāng) IP 從底層獲取到一個報文并對其進行解包后,IP 需要知道應(yīng)該將分離后得到的有效載荷交付給上層的哪一個協(xié)議。

  在 IP 報頭當(dāng)中有一個字段叫做 8 位協(xié)議,該字段表示的就是上層協(xié)議的類型,IP 就是根據(jù)該字段判定應(yīng)該將分離出來的有效載荷交付給上層的哪一個協(xié)議的。該字段是發(fā)送方的 IP 層從上層傳輸層獲取到數(shù)據(jù)后填充的,比如是上層 TCP 交給 IP 層的數(shù)據(jù),那么該數(shù)據(jù)在封裝 IP 報頭時的 8 位協(xié)議填充的就是 TCP 對應(yīng)的編號。

  32 位源 IP 地址和 32 位目的 IP 地址

  IP 報頭當(dāng)中的 32 位源 IP 地址和 32 位目的 IP 地址,分別代表的就是該報文的發(fā)送端和接收端對應(yīng)的 IP 地址。

  數(shù)據(jù)在網(wǎng)絡(luò)傳輸過程中會遇到一個個的路由器,這些路由器會幫助網(wǎng)絡(luò)當(dāng)中的數(shù)據(jù)進行路由轉(zhuǎn)發(fā),使得網(wǎng)絡(luò)中的數(shù)據(jù)慢慢趨近于目標主機。路由器在幫助數(shù)據(jù)進行路由轉(zhuǎn)發(fā)時,會提取出該數(shù)據(jù)的 IP 報頭當(dāng)中的目的 IP 地址,并以此作為數(shù)據(jù)路由轉(zhuǎn)發(fā)的重要依據(jù)。

  當(dāng)接收端收到了發(fā)送端發(fā)來的數(shù)據(jù)后,接收端可能也想要給發(fā)送端發(fā)送數(shù)據(jù),因此發(fā)送端在發(fā)送數(shù)據(jù)時除了需要指明該數(shù)據(jù)的目的 IP 地址,還需要指明該數(shù)據(jù)的源 IP 地址,也就是發(fā)送端的 IP 地址。即便接收端收到數(shù)據(jù)后沒有數(shù)據(jù)想要發(fā)送給發(fā)送端,但至少接收端需要向發(fā)送端發(fā)送一個響應(yīng)報文,表明發(fā)送端發(fā)送的數(shù)據(jù)已經(jīng)被接收端可靠的收到了,因此發(fā)送出去的數(shù)據(jù)除了需要指明該數(shù)據(jù)的目的 IP 地址,還需要指明該數(shù)據(jù)的源 IP 地址。

  理解 socket 編程:

  在進行 socket 編程的時候,當(dāng)一端想要發(fā)送數(shù)據(jù)給另一端時,必須要指明對端的 IP 地址和端口號,也就是發(fā)送數(shù)據(jù)的目的 IP 地址和目的端口號。

  其中這里的 IP 地址就是給網(wǎng)絡(luò)層的 IP 用的,用于數(shù)據(jù)在網(wǎng)絡(luò)傳輸過程中的路由轉(zhuǎn)發(fā),而這里的端口號就是給傳輸層的 TCP 或 UDP 用的,用于指明該數(shù)據(jù)應(yīng)該交給上層的哪一個進程。

  發(fā)送數(shù)據(jù)時我們不需要指明發(fā)送數(shù)據(jù)的源 IP 地址和源端口號,因為傳輸層和網(wǎng)絡(luò)層都是在操作系統(tǒng)內(nèi)核當(dāng)中實現(xiàn)的,數(shù)據(jù)在進行封裝時操作系統(tǒng)會自行填充上對應(yīng)的源 IP 地址和源端口號。

  8 位生存時間

  報文在網(wǎng)絡(luò)傳輸過程中,可能因為某些原因?qū)е聢笪臒o法到達目標主機,比如報文在路由時出現(xiàn)了環(huán)路路由的情況,或者目標主機已經(jīng)異常離線了,此時這個報文就成了一個廢棄的游離報文。

  為了避免網(wǎng)絡(luò)當(dāng)中出現(xiàn)大量的游離報文,于是在 IP 的報頭當(dāng)中就出現(xiàn)了一個字段,叫做 8 位生存時間(Time To Live,TTL)。8 位生存時間代表的是報文到達目的地的最大報文跳數(shù),每當(dāng)報文經(jīng)過一次路由,這里的生存時間就會減一,當(dāng)生存時間減為 0 時該報文就會被自動丟棄,此時這個報文就會在網(wǎng)絡(luò)中消散。

  分片與組裝

  數(shù)據(jù)鏈路層解決的問題

  IP 能夠?qū)?shù)據(jù)跨網(wǎng)絡(luò)從一臺主機送到另一臺主機,而數(shù)據(jù)在進行跨網(wǎng)絡(luò)傳送時,需要經(jīng)過一個個的路由器進行路由轉(zhuǎn)發(fā),最終才能到達目標主機。

  比如要將數(shù)據(jù)從主機 B 跨網(wǎng)絡(luò)傳送到主機 C,那么主機 B 需要先將數(shù)據(jù)交給路由器 F,路由器 F 再將數(shù)據(jù)交給路由器 G,…,最終由路由器 D 將數(shù)據(jù)交給主機 C。

IP協(xié)議5

  因此 IP 進行數(shù)據(jù)跨網(wǎng)絡(luò)傳送的前提是,需要先將數(shù)據(jù)從一個節(jié)點傳送到和自己相連的下一個節(jié)點,這個問題實際就是由 IP 之下的數(shù)據(jù)鏈路層解決的,其中數(shù)據(jù)鏈路層最典型的代表協(xié)議就是 MAC 幀。

  而兩個節(jié)點直接相連也就意味著這兩個節(jié)點是在同一個局域網(wǎng)當(dāng)中的,因此要討論兩個相鄰節(jié)點的數(shù)據(jù)傳送時,實際討論的就是局域網(wǎng)通信的問題。

  最大傳輸單元 MTU

  MAC 幀作為數(shù)據(jù)鏈路層的協(xié)議,它會將 IP 傳下來的數(shù)據(jù)封裝成數(shù)據(jù)幀,然后發(fā)送到網(wǎng)絡(luò)當(dāng)中。但 MAC 幀攜帶的有效載荷的最大長度是有限制的,也就是說 IP 交給 MAC 幀的報文不能超過某個值,這個值就叫做最大傳輸單元(Maximum Transmission Unit,MTU),這個值的大小一般是 1500 字節(jié)。

  在 Linux 下使用ifconfig命令可以查看對應(yīng)的 MTU。

IP協(xié)議6

  由于 MAC 幀無法發(fā)送大于 1500 字節(jié)的數(shù)據(jù),因此 IP 層向下交付的數(shù)據(jù)的長度不能超過 1500 字節(jié),這里所說的數(shù)據(jù)包括 IP 的報頭和 IP 的有效載荷。

  分片與組裝

  如果 IP 層要傳送的數(shù)據(jù)超過了 1500 字節(jié),那么就需要先在 IP 層對該數(shù)據(jù)進行分片,然后再將分片后的數(shù)據(jù)交給下層 MAC 幀進行發(fā)送。

IP協(xié)議7

  如果發(fā)送數(shù)據(jù)時在 IP 層進行了分片,那么當(dāng)這些分片數(shù)據(jù)到達對端主機的 IP 層后就需要先進行組裝,然后再將組裝好的數(shù)據(jù)交付給上層傳輸層。

IP協(xié)議8

  注意:

  數(shù)據(jù)的分片不是經(jīng)常需要做的,實際在網(wǎng)絡(luò)通信過程中不分片才是常態(tài),因為數(shù)據(jù)分片會存在一些潛在的問題,比如分片可能會增加丟包的概率。

  數(shù)據(jù)的分片和組裝發(fā)生在 IP 層,不僅源端主機可能會對數(shù)據(jù)進行分片,數(shù)據(jù)在路由過程中的路由器也可能對數(shù)據(jù)進行分片。因為不同網(wǎng)絡(luò)的 MTU 是不一樣的,如果傳輸路徑上的某個網(wǎng)絡(luò)的 MTU 比源端網(wǎng)絡(luò)的 MTU 小,那么路由器就可能對 IP 數(shù)據(jù)報再次進行分片。

  分片數(shù)據(jù)的組裝只會發(fā)生在目的端的 IP 層。

  在分片的數(shù)據(jù)中,每一個分片在 IP 層都會被添加上對應(yīng)的 IP 報頭,而傳輸層添加的報頭只會出現(xiàn)在第一個分片中,因此網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)包可能沒有傳輸層的報頭。

  數(shù)據(jù)的分片和組裝都是由 IP 層完成的

  數(shù)據(jù)的分片和組裝都是在 IP 層完成的,上層的傳輸層和下層的鏈路層并不關(guān)心。

  傳輸層只負責(zé)為數(shù)據(jù)傳送提供可靠性保證,比如當(dāng)數(shù)據(jù)傳送失敗后,傳輸層的 TCP 協(xié)議可以組織進行數(shù)據(jù)重傳。

  當(dāng) TCP 將待發(fā)送的數(shù)據(jù)交給 IP 后,TCP 并不關(guān)心該數(shù)據(jù)是否會在 IP 層進行分片,即 TCP 并不關(guān)心數(shù)據(jù)具體的發(fā)送過程。

  當(dāng) TCP 從 IP 獲取到數(shù)據(jù)后,TCP 也不關(guān)心該數(shù)據(jù)是否在 IP 層經(jīng)過了組裝。而鏈路層的 MAC 幀只負責(zé),將數(shù)據(jù)從一個節(jié)點傳送到和自己相連的下一個節(jié)點。

  當(dāng) IP 將待發(fā)送的數(shù)據(jù)交給 MAC 幀后,MAC 幀并不知道該數(shù)據(jù)是 IP 經(jīng)過分片后的某個分片數(shù)據(jù),還是一個沒有經(jīng)過分片的數(shù)據(jù),MAC 幀只知道它一次最多只能發(fā)送 MTU 大小的數(shù)據(jù),如果 IP 交給 MAC 幀大于 MTU 字節(jié)的數(shù)據(jù),那 MAC 幀就無法進行發(fā)送。

  當(dāng) MAC 幀從網(wǎng)絡(luò)中獲取到數(shù)據(jù)后,MAC 幀也不關(guān)心這個數(shù)據(jù)是否需要進行組裝,MAC 幀只需要將該數(shù)據(jù)的 MAC 幀報頭去掉后直接上交給上層 IP 就行了,而至于該數(shù)據(jù)的組裝問題則是 IP 需要解決的。

  因此,數(shù)據(jù)的分片和組裝完全是由 IP 協(xié)議自己完成的,傳輸層和鏈路層不必關(guān)心也不需要關(guān)心。

  分片的過程

  假設(shè) IP 層要發(fā)送 4500 字節(jié)的數(shù)據(jù),由于該數(shù)據(jù)超過了 MAC 幀規(guī)定的 MTU,因此 IP 需要先將該數(shù)據(jù)進行分片,然后再將一個個的分片交給 MAC 幀進行發(fā)送。

  IP 報頭如果不攜帶選項字段,那么其大小就是 20 字節(jié),假設(shè) IP 層添加的 IP 報頭的長度就是 20 字節(jié),并按下列方式將數(shù)據(jù)分片后形成了四個分片報文:

IP協(xié)議9

  需要注意的是,分片后的每一個分片數(shù)據(jù)都需要封裝上對應(yīng)的 IP 報頭,因此 4500 字節(jié)的數(shù)據(jù)至少需要分為四個分片報文進行發(fā)送。

  分片報文到達對方的 IP 層后需要被重新組裝起來,因此 IP 層在對數(shù)據(jù)進行分片時需要記錄分片的信息,而 IP 報頭當(dāng)中的 16 位標識、3 位標志和 13 位片偏移實際就是與數(shù)據(jù)分片相關(guān)的字段。

  16 位標識:唯一標識主機發(fā)送的報文,如果數(shù)據(jù)在 IP 層進行了分片,那么每一個分片報文的 16 位標識是相同的。

  3 位標志:第一位保留,表示暫時沒有規(guī)定該字段的意義。第二位表示禁止分片,表示如果報文長度超過 MTU,IP 模塊就會丟棄該報文。第三位表示 “更多分片”,如果報文沒有進行分片,則該字段設(shè)置為 0,如果報文進行了分片,則除了最后一個分片報文設(shè)置為 0 以外,其余分片報文均設(shè)置為 1。

  13 位片偏移:分片相對于原始數(shù)據(jù)開始處的偏移,表示當(dāng)前分片在原數(shù)據(jù)中的偏移位置,實際偏移的字節(jié)數(shù)是這個值× 8 \times 8×8 得到的。因此除了最后一個報文之外,其他報文的長度必須是 8 的整數(shù)倍,否則報文就不連續(xù)了。

  因此上述四個分片報文對應(yīng)的 16 位標識都是一樣的,假設(shè)四個分片報文的 16 位標識都是 123,則這四個報文對應(yīng)的 16 位標識、3 位標志中的 “更多分片” 和 13 位片偏移分別如下:

IP協(xié)議10

  需要注意的是,13 位片偏移當(dāng)中記錄的字節(jié)數(shù)是當(dāng)前分片在原數(shù)據(jù)開始處的偏移字節(jié)數(shù)的值÷ 8 \div 8÷8 得到的,比如分片報文 2 在原始數(shù)據(jù)開始處的偏移字節(jié)數(shù)是 1480,其對應(yīng)的 13 位片偏移的值就是1480 ÷ 8 = 185 1480\div 8=1851480÷8=185。

IP協(xié)議11

  組裝的過程

  MAC 幀交給 IP 層的數(shù)據(jù)可能來自世界各地,這些數(shù)據(jù)可能是經(jīng)過分片后發(fā)送的,也可能是沒有經(jīng)過分片直接發(fā)送的,因此 IP 必須要通過某種方式來區(qū)分收到的各個數(shù)據(jù)。

  IP 報頭當(dāng)中有 32 位源 IP 地址,源 IP 地址記錄了發(fā)送端所對應(yīng)的 IP 地址,因此通過 IP 報頭當(dāng)中的 32 位源 IP 地址就可以區(qū)分來自不同主機的數(shù)據(jù)。

  IP 報頭當(dāng)中有 16 位標識,未分片的數(shù)據(jù)各自的 16 位標識都是不同的,而由同一個數(shù)據(jù)分片得到的各個分片報文所對應(yīng)的 16 位標識都是相同的,因此通過 IP 報頭當(dāng)中 16 位標識就可以判斷哪些報文是沒有經(jīng)過分片的獨立報文,哪些報文是經(jīng)過分片后的分片報文。因此 IP 可以通過 IP 報頭當(dāng)中的 32 位源 IP 地址和 16 位標識,將經(jīng)過分片的數(shù)據(jù)各自聚合在一起,聚合在一起后就可以開始進行組裝了。

  對于各個分片報文來說:

  第一個分片報文中的 13 位片偏移的值一定為 0。

  最后一個分片報文中的 “更多分片” 標志位一定為 0。

  對于每一個分片報文來說,當(dāng)前報文的 13 位片偏移加上當(dāng)前報文的數(shù)據(jù)字節(jié)數(shù) ÷ \div÷ 8 所得到的值,就是下一個分片報文的所對應(yīng)的 13 位片偏移。

  根據(jù)分片報文的這三個特點就能夠?qū)⒎制瑘笪暮侠淼慕M裝起來。

  先找到分片報文中 13 位片偏移為 0 的分片報文,然后提取出其 IP 報頭當(dāng)中的 16 位總長度字段,通過計算即可得出下一個分片報文所對應(yīng)的 13 位片偏移,按照此方式依次將各個分片報文拼接起來。

  直到拼接到一個 “更多分片” 標志位為 0 的分片報文,此時表明分片報文組裝完畢。

  分片報文丟包的問題

  分片后的報文在網(wǎng)絡(luò)傳輸過程中也可能會出現(xiàn)丟包問題,但接收端有能力判斷是否收到了全部分片報文,比如假設(shè)某組分片報文對應(yīng)的 16 位標識值為 x:

  如果分片報文中的第一個分片報文丟包了,那么接收端收到的分片報文中就找不到對應(yīng) 16 位標識為 x,并且 13 位片偏移為 0 的分片報文。

  如果分片報文中的最后一個分片報文丟包了,那么接收端收到的分片報文中就找不到對應(yīng) 16 為標識為 x,并且 “更多分片” 標志位為 0 的分片報文。

  如果分片報文中的其它分片報文丟包了,那么接收端在進行分片報文的組裝時就會找不到對應(yīng) 13 位片偏移為特定值的分片報文。

  需要注意的是,未分片報文的 “更多分片” 標志位為 0,最后一個分片報文的 “更多分片” 標志位也為 0,但當(dāng)接收端只收到分片報文中的最后一個分片報文時,接收端不會將其識別成一個未分片的報文,因為未分片的報文所對應(yīng)的 13 位片偏移的值也應(yīng)該是 0,而最后一個分片報文所對應(yīng)的 13 位片偏移的值不為 0。

  因此只有當(dāng)一個報文的 13 位片偏移為 0,并且該報文的 “更多分片” 標志位也為 0 時,該報文才會被識別成一個沒有被分片的獨立報文,否則該報文就會被識別成一個分片報文。

  為什么不建議進行分片?

  雖然傳輸層并不關(guān)心 IP 層的分片問題,但分片對傳輸層也是有影響的。

  如果一個數(shù)據(jù)在網(wǎng)絡(luò)傳輸過程中沒有經(jīng)過分片,那么只要接收端收到了這一個報文,我們就可以認為該數(shù)據(jù)被對方可靠的收到了。

  而如果一個數(shù)據(jù)在網(wǎng)絡(luò)傳輸過程中進行了分片,那么只有當(dāng)接收端收到了全部的分片報文并將其成功組裝起來,這時我們才認為該數(shù)據(jù)被對方可靠的收到了。但如果眾多的分片報文當(dāng)中有一個報文出現(xiàn)了丟包,就會導(dǎo)致接收端就無法將報文成功組裝起來,這時接收端會將收到的分片報文全部丟棄,此時傳輸層 TCP 會因為收不到對方應(yīng)答而進行超時重傳。

  假設(shè)在網(wǎng)絡(luò)傳輸時丟包的概率是萬分之一,如果將數(shù)據(jù)拆分為一百份進行發(fā)送,那么此時丟包的概率就上升到了百分之一。因為只要有一個分片報文丟包了也就等同于這個報文整體丟失了,因此分片會增加傳輸層重傳數(shù)據(jù)的概率。

  需要注意的是,只要分片報文當(dāng)中的某一個出現(xiàn)了丟包,此時傳輸層都需要將數(shù)據(jù)整體進行重傳,因為傳輸層并不知道底層 IP 對數(shù)據(jù)進行了分片,當(dāng)傳輸層發(fā)送出去的數(shù)據(jù)得不到應(yīng)答時傳輸層就只能將數(shù)據(jù)整體進行重傳,因此數(shù)據(jù)在發(fā)送時不建議進行分片。

  如何盡可能避免分片?

  實際數(shù)據(jù)分片的根本原因在于傳輸層一次向下交付的數(shù)據(jù)太多了,導(dǎo)致 IP 無法直接將數(shù)據(jù)向下交給 MAC 幀,如果傳輸層控制好一次交給 IP 的數(shù)據(jù)量不要太大,那么數(shù)據(jù)在 IP 層自然也就不需要進行分片。

  因此 TCP 作為傳輸控制協(xié)議,它需要控制一次向下交付數(shù)據(jù)不能超過某一閾值,這個閾值就叫做 MSS(Maximum Segment Size,最大報文段長度)。

  通信雙方在建立 TCP 連接時,除了需要協(xié)商自身窗口大小等概念之外,還會協(xié)商后續(xù)通信時每一個報文段所能承載的最大報文段長度 MSS。

  MAC 幀的有效載荷最大為 MTU,TCP 的有效載荷最大為 MSS,由于 TCP 和 IP 常規(guī)情況下報頭的長度都是 20 字節(jié),因此一般情況下 MSS = MTU - 20 - 20,而 MTU 的值一般是 1500 字節(jié),因此 MSS 的值一般就是 1460 字節(jié)。

  所以一般建議 TCP 將發(fā)送的數(shù)據(jù)控制在 1460 字節(jié)以內(nèi),此時就能夠降低數(shù)據(jù)分片的可能性。之所以說是降低數(shù)據(jù)分片的可能性,是因為每個網(wǎng)絡(luò)的鏈路層對應(yīng)的 MTU 可能是不同的,如果數(shù)據(jù)在傳輸過程中進入到了一個 MTU 較小的網(wǎng)絡(luò),那么該數(shù)據(jù)仍然可能需要在路由器中進行分片。

  網(wǎng)段劃分

  IP 地址的構(gòu)成

  IP 地址由網(wǎng)絡(luò)號和主機號兩部分構(gòu)成:

  網(wǎng)絡(luò)號:保證相互連接的兩個網(wǎng)段具有不同的標識。

  主機號:同一網(wǎng)段內(nèi),主機之間具有相同的網(wǎng)絡(luò)號,但是必須有不同的主機號??梢栽?IP 地址的后面加一個 /,并在 / 后面加上一個數(shù)字,這就表示從頭數(shù)到第幾位為止屬于網(wǎng)絡(luò)標識。

  例如,下圖中路由器連接了兩個網(wǎng)段。對于網(wǎng)絡(luò)標識來講,同一網(wǎng)段內(nèi)主機的網(wǎng)絡(luò)標識是相同的,不同網(wǎng)段內(nèi)主機的網(wǎng)絡(luò)標識是不同的。而對于主機標識來講,同一網(wǎng)段內(nèi)主機的主機標識是不同的,不同網(wǎng)段內(nèi)主機的主機標識是可以相同的。

IP協(xié)議12

  不同的子網(wǎng)其實就是把網(wǎng)絡(luò)號相同的主機放到一起。

  如果在子網(wǎng)中新增一臺主機,則這臺主機的網(wǎng)絡(luò)號和這個子網(wǎng)的網(wǎng)絡(luò)號一致,但是主機號必須不能和子網(wǎng)中的其他主機重復(fù)。

  DHCP 協(xié)議

  實際手動管理 IP 地址是一個非常麻煩的事情,當(dāng)子網(wǎng)中新增主機時需要給其分配一個 IP 地址,當(dāng)子網(wǎng)當(dāng)中有主機斷開網(wǎng)絡(luò)時又需要將其 IP 地址進行回收,便于分配給后續(xù)新增的主機使用。

  因此對于 IP 地址的分配和回收一般不會手動進行,而是采用 DHCP(Dynamic Host Configuration Protocol,動態(tài)主機配置協(xié)議)技術(shù)。

  DHCP 通常被應(yīng)用在大型的局域網(wǎng)環(huán)境中,其主要作用就是集中地址管理、分配 IP 地址,使網(wǎng)絡(luò)環(huán)境中的主機動態(tài)獲得 IP 地址、Gateway 地址、DNS 服務(wù)器地址等信息,并能夠提升地址的使用率。

  DHCP 是一個基于 UDP 的應(yīng)用層協(xié)議,一般的路由器都帶有 DHCP 功能,因此路由器也可以看作一個 DHCP 服務(wù)器。

  當(dāng)我們連接 WiFi 時需要輸入密碼,本質(zhì)就是因為路由器需要驗證你的賬號和密碼,如果驗證通過,那么路由器就會給你動態(tài)分配了一個 IP 地址,然后你就可以基于這個 IP 地址進行各種上網(wǎng)動作了。

  先找目標網(wǎng)絡(luò),再找目標主機

  當(dāng) IP 要將數(shù)據(jù)跨網(wǎng)絡(luò)從一臺主機發(fā)送到另一臺主機時,其實不是直接將數(shù)據(jù)發(fā)送到了目標主機,而是先將數(shù)據(jù)發(fā)送到目標主機所在的網(wǎng)絡(luò),然后再將數(shù)據(jù)發(fā)送到目標主機。

  因此數(shù)據(jù)在路由時的第一目的并不是找到目標主機,而是找到目標網(wǎng)絡(luò)所在的網(wǎng)絡(luò),然后再在目標網(wǎng)絡(luò)當(dāng)中找到目標主機。

  數(shù)據(jù)路由時之所以不一開始就以找目標主機為目的,因為這樣效率太低了。

  找主機的過程本質(zhì)是排除的過程,如果一開始就以找目標主機為目的,那么在查找的過程中一次只能排除一個主機。

  而如果一開始先以找目標網(wǎng)絡(luò)為目的,那么在查找過程中就能一次排除大量和目標主機不在同一網(wǎng)段的主機,這樣就可以大大提高檢索的效率。

  因此,為了提高數(shù)據(jù)路由的效率,我們對網(wǎng)絡(luò)進行了網(wǎng)段劃分。

  網(wǎng)段劃分

  過去曾經(jīng)提出一種劃分網(wǎng)絡(luò)號和主機號的方案,就是把所有 IP 地址分為五類,如下圖所示:

IP協(xié)議13

  因此,各類 IP 地址的取值范圍如下:

  A 類:0.0.0.0 到 127.255.255.255。

  B 類:128.0.0.0 到 191.255.255.255。

  C 類:192.0.0.0 到 223.255.255.255。

  D 類:224.0.0.0 到 239.255.255.255。

  E 類:240.0.0.0 到 247.255.255.255。當(dāng)要判斷一個 IP 地址是屬于哪一類時,只需要遍歷 IP 地址的前五個比特位,第幾個比特位最先出現(xiàn) 0 值,那么這個 IP 地址對應(yīng)就屬于 A、B、C、D、E 類地址。

  子網(wǎng)劃分

  但隨著網(wǎng)絡(luò)的飛速發(fā)展,這種劃分方案的局限性很快就顯現(xiàn)出來了。

  比如一些學(xué)校、公司、實驗室等組織想要申請自己的局域網(wǎng),由于 A 類地址的網(wǎng)絡(luò)號只占 7 個比特位,因此 A 類地址可申請的網(wǎng)絡(luò)只有2 7 2^727 個,于是大多數(shù)組織都選擇申請 B 類地址。

  由于 B 類地址的主機號占 16 個比特位,因此理論上一個 B 類網(wǎng)絡(luò)當(dāng)中允許有 65536 臺主機。

  但實際網(wǎng)絡(luò)架設(shè)中,一般不會存在一個局域網(wǎng)當(dāng)中有這么多主機的情況,也就意味著大量的 IP 地址實際都被浪費掉了。

  為了避免這種情況,于是又提出了新的劃分方案,稱為 CIDR(Classless Interdomain Routing):

  在原有的五類網(wǎng)絡(luò)的基礎(chǔ)上繼續(xù)進行子網(wǎng)劃分,這也就意味著需要借用主機號當(dāng)中的若干位來充當(dāng)網(wǎng)絡(luò)號,此時為了區(qū)分 IP 地址中的網(wǎng)絡(luò)號和主機號,于是引入了子網(wǎng)掩碼(subnet mask)的概念。

  每一個子網(wǎng)都有自己的子網(wǎng)掩碼,子網(wǎng)掩碼實際就是一個 32 位的正整數(shù),通常用一串 “0” 來結(jié)尾。

  將 IP 地址與當(dāng)前網(wǎng)絡(luò)的子網(wǎng)掩碼進行 “按位與” 操作,就能夠得到當(dāng)前所在網(wǎng)絡(luò)的網(wǎng)絡(luò)號。

  此時一個網(wǎng)絡(luò)就被更細粒度的劃分成了一個個更小的子網(wǎng),通過不斷的子網(wǎng)劃分,子網(wǎng)中 IP 地址對應(yīng)的主機號就越來越短,因此子網(wǎng)當(dāng)中可用 IP 地址的個數(shù)也就越來越少,這也就避免了 IP 地址被大量浪費的情況。

  比如在某一子網(wǎng)中將 IP 地址的前 24 位作為網(wǎng)絡(luò)號,那么該網(wǎng)絡(luò)對應(yīng)的子網(wǎng)掩碼的 32 個比特位中的前 24 位就為 1,剩下的 8 個比特位為 0,將其用點分十機制表示就是 255.255.255.0。

  假設(shè)該子網(wǎng)當(dāng)中有一臺主機對應(yīng)的 IP 地址是 192.168.128.10,那么將這個 IP 地址與該網(wǎng)絡(luò)對應(yīng)的子網(wǎng)掩碼進行 “按位與” 操作后得到的就是 192.168.128.0,這就是這個子網(wǎng)對應(yīng)的網(wǎng)絡(luò)號。

  實際在用子網(wǎng)掩碼與子網(wǎng)當(dāng)中主機的 IP 地址進行 “按位與” 操作時,本質(zhì)就是保留了主機 IP 地址中前 24 個比特位的原貌,將剩下的 8 個比特位的值清 0 了而已,也就是將主機號清 0 了,所以 “按位與” 后的結(jié)果就是該網(wǎng)絡(luò)對應(yīng)的網(wǎng)絡(luò)號。

  需要注意的是,子網(wǎng)劃分不是只能進行一次,我們可以在劃分出來的子網(wǎng)的基礎(chǔ)上繼續(xù)進行子網(wǎng)劃分。

  因此一個數(shù)據(jù)在路由的時候,隨著數(shù)據(jù)不斷路由進入更小的子網(wǎng),其網(wǎng)絡(luò)號的位數(shù)是在不斷變化的,準確來說其網(wǎng)絡(luò)號的位數(shù)是在不斷增加的,這也就意味著 IP 地址當(dāng)中的主機號的位數(shù)在不斷減少。最終當(dāng)數(shù)據(jù)路由到達目標主機所在的網(wǎng)絡(luò)時,就可以在該網(wǎng)絡(luò)當(dāng)中找到對應(yīng)的目標主機并將數(shù)據(jù)交給該主機,此時該數(shù)據(jù)的路由也就結(jié)束了。

  特殊的 IP 地址

  并不是所有的 IP 地址都能夠作為主機的 IP 地址,有些 IP 地址本身就是具有特殊用途的。

  將 IP 地址中的主機地址全部設(shè)為 0,就成為了網(wǎng)絡(luò)號,代表這個局域網(wǎng)。

  將 IP 地址中的主機地址全部設(shè)為 1,就成為了廣播地址,用于給同一個鏈路中相互連接的所有主機發(fā)送數(shù)據(jù)包。

  127.* 的 IP 地址用于本機環(huán)回(loop back)測試,通常是 127.0.0.1。

  也就是說,IP 地址中主機號為全 0 的代表的是當(dāng)前局域網(wǎng)的網(wǎng)絡(luò)號,IP 地址中主機號為全 1 的代表的是廣播地址,這兩個 IP 地址都是不能作為主機的 IP 地址的。因此在某個局域網(wǎng)中最多能存在的主機個數(shù)是 2 主機號位數(shù) − 2 2^{主機號位數(shù)}-22主機號位數(shù)−2。

  本機環(huán)回基本原理

  本機環(huán)回會將數(shù)據(jù)貫穿網(wǎng)絡(luò)協(xié)議棧,但最終并不會將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)當(dāng)中,相當(dāng)于本機環(huán)回時不會將數(shù)據(jù)寫到網(wǎng)卡上面。

  本機環(huán)回的目的就是將數(shù)據(jù)自頂向下貫穿協(xié)議棧,進行一次數(shù)據(jù)封裝的過程的過程,然后再自底向上貫穿協(xié)議棧,進行一次數(shù)據(jù)的解包和分用,用于測試本地的網(wǎng)絡(luò)功能是否正常。

  本機環(huán)回的基本原理:

  當(dāng)數(shù)據(jù)到達 IP 層需要繼續(xù)向下交付時,如果是環(huán)回程序,那么 IP 輸出函數(shù)會將該數(shù)據(jù)放入到 IP 輸入隊列當(dāng)中,然后再由 IP 輸入函數(shù)讀取上去。

  而 IP 輸入函數(shù)將數(shù)據(jù)讀取上去的本應(yīng)該是鏈路層交付上來的數(shù)據(jù),因此該數(shù)據(jù)后續(xù)就會被當(dāng)作從網(wǎng)絡(luò)中讀取上來的數(shù)據(jù)看待,各層協(xié)議會對該數(shù)據(jù)依次進行解包和分用。

  如果不是環(huán)回程序的話,那么接下來就會判斷該數(shù)據(jù)對應(yīng)的目的 IP 地址是否為廣播或多播地址,或者目的 IP 地址是否與本主機的 IP 地址相同,如果是則也會將該數(shù)據(jù)放入到 IP 輸入隊列當(dāng)中,等待 IP 輸入函數(shù)將其讀走。

  只有判斷程序不是環(huán)回程序,并且也不是廣播或多播,或發(fā)給本主機的數(shù)據(jù)后,才會用 ARP 獲取該數(shù)據(jù)目的主機的以太網(wǎng)地址并進行后續(xù)數(shù)據(jù)發(fā)送的操作。

  loopback 設(shè)備:

  

IP協(xié)議14

  IP 地址的數(shù)量限制

  IP 地址數(shù)量不足問題

  我們知道,IP 地址(IPv4)是一個 4 字節(jié) 32 位的正整數(shù),因此一共有2 32 2^{32}232 個 IP 地址,也就是將近 43 億個 IP 地址。但 TCP/IP 協(xié)議規(guī)定,每個主機都需要有一個 IP 地址。

  現(xiàn)在全世界人口已經(jīng)有 70 多億了,就算有一半的人沒有智能手機,算下來也有 30 多億臺智能手機需要 IP 地址。

  隨著科技的發(fā)展,我們使用的電腦、智能手表、智能冰箱、智能洗衣機等設(shè)備如果要入網(wǎng)也是需要 IP 地址的。

  另外,IP 地址并不是按照主機臺數(shù)來配置的,因此一個主機可能需要多個 IP 地址,更別談還有很多組網(wǎng)的路由設(shè)備也需要 IP 地址,以及一些特殊的 IP 地址不能使用的問題。所以 43 億個 IP 地址其實早就不夠用了,因此才提出了 CIDR 的方案對已經(jīng)劃分好的五類網(wǎng)絡(luò)繼續(xù)進行子網(wǎng)劃分,其目的就是為了減少 IP 地址的浪費,根本原因就是 IP 地址本來就不夠了,所以不能夠再浪費了。

  CIDR 雖然在一定程度上緩解了 IP 地址不夠用的問題,因為 CIDR 提高了 IP 地址的利用率,減少了浪費,但 IP 地址的絕對上限并沒有增加。

  如何解決 IP 地址不足問題

  解決 IP 地址不足有以下幾種方式:

  動態(tài)分配 IP 地址:只給接入網(wǎng)絡(luò)的設(shè)備分配 IP 地址,因此同一個 MAC 地址的設(shè)備,每次接入互聯(lián)網(wǎng)中,得到的 IP 地址不一定是相同的,避免了 IP 地址強綁定于某一臺設(shè)備。

  NAT 技術(shù):能夠讓不同局域網(wǎng)當(dāng)中同時存在兩個相同的 IP 地址,NAT 技術(shù)不僅能解決 IP 地址不足的問題,而且還能夠有效地避免來自網(wǎng)絡(luò)外部的攻擊,隱藏并保護網(wǎng)絡(luò)內(nèi)部的計算機。

  IPv6:IPv6 用 16 字節(jié) 128 位來表示一個 IP 地址,能夠大大緩解 IP 地址不足的問題。但 IPv6 并不是 IPv4 的簡單升級版,它們是互不相干的兩個協(xié)議,彼此并不兼容,因此目前 IPv6 還沒有普及。

  私網(wǎng) IP 地址和公網(wǎng) IP 地址

  私網(wǎng) IP 地址的種類

  如果一個組織內(nèi)部組建局域網(wǎng),IP 地址只用于局域網(wǎng)內(nèi)的通信,而不直接連到 Internet 上,理論上使用任意的 IP 地址都可以,但是 RFC 1918 規(guī)定了用于組建局域網(wǎng)的私有 IP 地址。

  10.*,前 8 位是網(wǎng)絡(luò)號,共 16,777,216 個地址。

  172.16.* 到 172.31.*,前 12 位是網(wǎng)絡(luò)號,共 1,048,576 個地址。

  192.168.*,前 16 位是網(wǎng)絡(luò)號,共 65,536 個地址。

  包含在這個范圍中的,都稱為私網(wǎng) IP,其余的則稱為公網(wǎng) IP(或全局 IP)。

  我們連接云服務(wù)器時,連接的這個 IP 地址就是云服務(wù)器的公網(wǎng) IP 地址。

IP協(xié)議15

  我們可以通過ifconfig命令來查看我們這臺機器的私網(wǎng) IP,其中網(wǎng)絡(luò)接口 lo(loop)代表的是本地環(huán)回,而 eth0 代表的就是我這臺機器的網(wǎng)絡(luò)接口,可以看到我的私網(wǎng) IP 地址是 172.21.0.15。

IP協(xié)議16

  需要注意的是,這里連接云服務(wù)器時的 IP 地址 49.232.66.206,是云服務(wù)器的公網(wǎng) IP,由于我使用的是騰訊云,因此這里的 172.21.0.15 是我這個云服務(wù)器在騰訊內(nèi)部的私網(wǎng) IP,可以看到這個 IP 正好在第二種私網(wǎng) IP 范圍內(nèi)。

  此外,打開 Windows 當(dāng)中的 cmd 窗口,通過ipconfig命令可以看到大量以 192.168 開頭的私網(wǎng) IP。

IP協(xié)議17

  我們?yōu)槭裁匆o運營商交錢?

  我們享受的是互聯(lián)網(wǎng)公司提供服務(wù),但為什么需要向運營商交錢呢?

  實際網(wǎng)絡(luò)通信的基礎(chǔ)設(shè)施都是運營商搭建的,我們訪問服務(wù)器的數(shù)據(jù)并不是直接發(fā)送到了對應(yīng)的服務(wù)器,而是需要經(jīng)過運營商建設(shè)的各種基站以及各種路由器,最終數(shù)據(jù)才能到達對應(yīng)的服務(wù)器。

  因為運營商為我們提供了通信的基礎(chǔ)設(shè)施,所以我們交網(wǎng)費實際就相當(dāng)于購買入網(wǎng)許可一樣。

  沒有運營商提供的這些基礎(chǔ)設(shè)施,就不會誕生所謂的互聯(lián)網(wǎng)公司,因為互聯(lián)網(wǎng)公司是誕生在網(wǎng)絡(luò)通信基礎(chǔ)之上的。

  也就是說,用戶上網(wǎng)的數(shù)據(jù)首先必須經(jīng)過運營商的相關(guān)網(wǎng)絡(luò)設(shè)備,然后才能發(fā)送到互聯(lián)網(wǎng)公司對應(yīng)的服務(wù)器。因此所謂的網(wǎng)段劃分、子網(wǎng)劃分等工作實際都是運營商做的。

  數(shù)據(jù)是如何發(fā)送到服務(wù)器的

  路由器是連接兩個或多個網(wǎng)絡(luò)的硬件設(shè)備,在路由器上有兩種網(wǎng)絡(luò)接口,分別是 LAN 口和 WAN 口:

  LAN 口(Local Area Network):表示連接本地網(wǎng)絡(luò)的端口,主要與家庭網(wǎng)絡(luò)中的交換機、集線器或 PC 相連。

  WAN 口(Wide Area Network):表示連接廣域網(wǎng)的端口,一般指互聯(lián)網(wǎng)。

  我們將 LAN 口的 IP 地址叫做 LAN 口 IP,也叫做子網(wǎng) IP,將 WAN 口的 IP 地址叫做 WAN 口 IPO,也叫做外網(wǎng) IP。

  我們使用的電腦、家用路由器、運營商路由器、廣域網(wǎng)以及我們要訪問的服務(wù)器之間的關(guān)系大致如下:

IP協(xié)議18

  不同的路由器,子網(wǎng) IP 其實都是一樣的(通常都是 192.168.1.1),子網(wǎng)內(nèi)的主機 IP 地址不能重復(fù),但是子網(wǎng)之間的 IP 地址就可以重復(fù)了。

  每一個家用路由器,其實又作為運營商路由器的子網(wǎng)中的一個節(jié)點,這樣的運營商路由器可能會有很多級,最外層的運營商路由器的 WAN 口 IP 就是一個公網(wǎng) IP 了。

  如果希望我們自己實現(xiàn)的服務(wù)器程序,能夠在公網(wǎng)上被訪問到,就需要把程序部署在一臺具有外網(wǎng) IP 的服務(wù)器上,這樣的服務(wù)器可以在阿里云 / 騰訊云上進行購買。

  由于私網(wǎng) IP 不能出現(xiàn)在公網(wǎng)當(dāng)中,因此子網(wǎng)內(nèi)的主機在和外網(wǎng)進行通信時,路由器會不斷將數(shù)據(jù)包 IP 首部中的源 IP 地址替換成路由器的 WAN 口 IP,這樣逐級替換,最終數(shù)據(jù)包中的源 IP 地址成為一個公網(wǎng) IP,這種技術(shù)成為 NAT(Network Address Translation,網(wǎng)絡(luò)地址轉(zhuǎn)換)。

  為什么私網(wǎng) IP 不能出現(xiàn)在公網(wǎng)當(dāng)中?

  不同的局域網(wǎng)中主機的 IP 地址可能是相同的,所以私網(wǎng) IP 無法唯一標識一臺主機,因此不能讓私網(wǎng) IP 出現(xiàn)在公網(wǎng)上,因為 IP 地址要能唯一標識公網(wǎng)上的一臺主機。

  但由于 IP 地址不足的原因,我們不能讓主機直接使用公網(wǎng) IP 而讓主機使用私網(wǎng) IP,因為私網(wǎng) IP 可以重復(fù)也就意味著我們可以在不同的局域網(wǎng)使用相同的 IP 地址,緩解了 IP 的不足。

  此外,我們不能直接使用公網(wǎng) IP 還有一個原因就是,因為我們的數(shù)據(jù)包必須要經(jīng)過運營商的路由器,如果我們發(fā)送的數(shù)據(jù)直接到了公網(wǎng),那也就意味著我們再也不用交網(wǎng)費了,這是不現(xiàn)實的。

  兩個局域網(wǎng)當(dāng)中的主機不能不跨公網(wǎng)進行通信

  兩個局域網(wǎng)當(dāng)中的主機理論上是不能不跨公網(wǎng)進行通信的,因為一個主機要將數(shù)據(jù)發(fā)送給另一臺主機的前提是得先知道另一臺主機的 IP 地址。

  即便現(xiàn)在這個主機知道了另一臺主機的 IP 地址,但有可能這兩臺主機的 IP 地址是一樣的,因為它們的 IP 地址都是私網(wǎng) IP 地址。

  當(dāng)這一臺主機發(fā)送數(shù)據(jù)時將目的 IP 地址填成和自己相同的 IP 地址,操作系統(tǒng)就會認為這個數(shù)據(jù)就是要發(fā)給自己的,而不會向外進行發(fā)送了。

  所以數(shù)據(jù)要從一個局域網(wǎng)發(fā)送到另一個局域網(wǎng),如果不經(jīng)過公網(wǎng)是基本上不可能的。我們在和別人聊天的時候,也不是直接將數(shù)據(jù)從一個局域網(wǎng)直接發(fā)送到了另一個局域網(wǎng),而是先將數(shù)據(jù)經(jīng)過公網(wǎng)發(fā)送到了服務(wù)器,然后再由服務(wù)器將數(shù)據(jù)經(jīng)過公網(wǎng)轉(zhuǎn)發(fā)到了另一個局域網(wǎng)。

  但實際確實存在一些技術(shù)能夠使數(shù)據(jù)包在發(fā)送過程中不進行公網(wǎng) IP 的替換,而將數(shù)據(jù)正確送到目標主機,這種技術(shù)叫做內(nèi)網(wǎng)穿透,也叫做 NAT 穿透。

  路由

  數(shù)據(jù) “問路” 的過程

  數(shù)據(jù)在路由的過程中,實際就是一跳一跳(Hop by Hop)“問路”的過程。所謂 “一跳” 就是數(shù)據(jù)鏈路層中的一個區(qū)間,具體在以太網(wǎng)中指從源 MAC 地址到目的 MAC 地址之間的幀傳輸區(qū)間。

IP協(xié)議19

  IP 數(shù)據(jù)包的傳輸過程中會遇到很多路由器,這些路由器會幫助數(shù)據(jù)包進行路由轉(zhuǎn)發(fā),每當(dāng)數(shù)據(jù)包遇到一個路由器后,對應(yīng)路由器都會查看該數(shù)據(jù)的目的 IP 地址,并告知該數(shù)據(jù)下一跳應(yīng)該往哪跳。

  路由器的查找結(jié)果可能有以下三種:

  路由器經(jīng)過路由表查詢后,得知該數(shù)據(jù)下一跳應(yīng)該跳到哪一個子網(wǎng)。

  路由器經(jīng)過路由表查詢后,沒有發(fā)現(xiàn)匹配的子網(wǎng),此時路由器會將該數(shù)據(jù)轉(zhuǎn)發(fā)給默認路由。

  路由器經(jīng)過路由表查詢后,得知該數(shù)據(jù)的目標網(wǎng)絡(luò)就是當(dāng)前所在的網(wǎng)絡(luò),此時路由器就會將該數(shù)據(jù)轉(zhuǎn)給當(dāng)前網(wǎng)絡(luò)中對應(yīng)的主機。

  路由表查詢的具體過程

  每個路由器內(nèi)部會維護一個路由表,我們可以通過route命令查看云服務(wù)器上對應(yīng)的路由表。

IP協(xié)議20

  Destination代表的是目的網(wǎng)絡(luò)地址。

  Gateway代表的是下一跳地址。

  Genmask代表的是子網(wǎng)掩碼。

  Flags中,U 標志表示此條目有效(可以禁用某些條目)G 標志表示此條目的下一跳地址是某個路由器的地址,沒有 G 標志的條目表示目的網(wǎng)絡(luò)地址是與本機接口直接相連的網(wǎng)絡(luò),不必經(jīng)路由器轉(zhuǎn)發(fā)。

  Iface代表的是發(fā)送接口。

  當(dāng) IP 數(shù)據(jù)包到達路由器時,路由器就會用該數(shù)據(jù)的目的 IP 地址,依次與路由表中的子網(wǎng)掩碼 Genmask進行 “按位與” 操作,然后將結(jié)果與子網(wǎng)掩碼對應(yīng)的目的網(wǎng)絡(luò)地址Destination進行比對,如果匹配則說明該數(shù)據(jù)包下一跳就應(yīng)該跳去這個子網(wǎng),此時就會將該數(shù)據(jù)包通過對應(yīng)的發(fā)送接口Iface發(fā)出。

  如果將該數(shù)據(jù)包的目的 IP 地址與子網(wǎng)掩碼進行 “按位與” 后,沒有找到匹配的目的網(wǎng)絡(luò)地址,此時路由器就會將這個數(shù)據(jù)包發(fā)送到默認路由,也就是路由表中目標網(wǎng)絡(luò)地址中的default??梢钥吹侥J路由對應(yīng)的Flags是UG,實際就是將該數(shù)據(jù)轉(zhuǎn)給了另一臺路由器,讓該數(shù)據(jù)在另一臺路由器繼續(xù)進行路由。

  數(shù)據(jù)包不斷經(jīng)過路由器路由后,最終就能到達目標主機所在的目標網(wǎng)絡(luò),此時就不再根據(jù)該數(shù)據(jù)包目的 IP 地址當(dāng)中的網(wǎng)絡(luò)號進行路由了,而是根據(jù)目的 IP 地址當(dāng)中的主機號進行路由,最終根據(jù)該數(shù)據(jù)包對應(yīng)的主機號就能將數(shù)據(jù)發(fā)送給目標主機了。

  路由表生成算法

  路由可分為靜態(tài)路由和動態(tài)路由:

  靜態(tài)路由:是指由網(wǎng)絡(luò)管理員手工配置路由信息。

  動態(tài)路由:是指路由器能夠通過算法自動建立自己的路由表,并且能夠根據(jù)實際情況進行調(diào)整。

  路由表相關(guān)生成算法:距離向量算法、LS 算法、Dijkstra 算法等。

tags:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學(xué)習(xí)老師24小時內(nèi)將與您1V1溝通
免費領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
為什么SpringBoot的 jar 可以直接運行?

一、JAR文件的結(jié)構(gòu)與執(zhí)行方式Spring Boot的JAR包是Java Archive的縮寫,它是一種壓縮文件格式,可以將Java項目的類文件、資源文件以及依賴庫等...詳情>>

2023-10-14 23:01:49
站群服務(wù)器是什么?

站群服務(wù)器的含義與用途站群服務(wù)器主要用于支持站群,即由一組相互鏈接的網(wǎng)站組成的群體。這些網(wǎng)站通常由同一組織或個人擁有,并且經(jīng)常會互相鏈...詳情>>

2023-10-14 22:46:12
自編碼器是什么?

一、自編碼器原理自編碼器的設(shè)計靈感源于神經(jīng)科學(xué)中關(guān)于感知系統(tǒng)的認知原理,它的核心思想是將輸入數(shù)據(jù)經(jīng)過編碼過程,形成一個隱藏層的特征表示...詳情>>

2023-10-14 22:41:10
什么是云網(wǎng)融合?

一、云網(wǎng)融合的定義云網(wǎng)融合是指將云計算與網(wǎng)絡(luò)技術(shù)相結(jié)合,實現(xiàn)資源的共享、業(yè)務(wù)的協(xié)同,將網(wǎng)絡(luò)與云端服務(wù)深度融合,提供更靈活、高效、安全的...詳情>>

2023-10-14 22:31:47
什么是setnx、Redlock、Redisson?

一、setnxsetnx是Redis中的一個命令,用于將鍵值對(key-value)設(shè)置到Redis數(shù)據(jù)庫中。其中,setnx表示”Set if Not Exists”,即當(dāng)...詳情>>

2023-10-14 22:22:53