天天看點

TCP/IP詳解學習筆記(2)

IP協定,ARP協定,RARP協定

把這三個協定放到一起學習是因為這三個協定處于同一層,ARP協定用來找到目标主機的Ethernet網卡Mac位址,IP則承載要發送的消息。資料鍊路層可以從ARP得到資料的傳送資訊,而從IP得到要傳輸的資料資訊。

1.IP協定

IP協定是TCP/IP協定的核心,所有的TCP,UDP,IMCP,IGCP的資料都以IP資料格式傳輸。要注意的是,IP不是可靠的協定,這是說,IP協定沒有提供一種資料未傳達以後的處理機制--這被認為是上層協定--TCP或UDP要做的事情。是以這也就出現了TCP是一個可靠的協定,而UDP就沒有那麼可靠的差別。這是後話,暫且不提

1.1.IP協定頭

如圖所示

挨個解釋它是教科書的活計,我感興趣的隻是那八位的TTL字段,還記得這個字段是做什麼的麼?這個字段規定該資料包在穿過多少個路由之後才會被抛棄(這裡就展現出來IP協定包的不可靠性,它不保證資料被送達),某個ip資料包每穿過一個路由器,該資料包的TTL數值就會減少1,當該資料包的TTL成為零,它就會被自動抛棄。這個字段的最大值也就是255,也就是說一個協定包也就在路由器裡面穿行255次就會被抛棄了,根據系統的不同,這個數字也不一樣,一般是32或者是64,Tracerouter這個工具就是用這個原理工作的,tranceroute的-m選項要求最大值是255,也就是因為這個TTL在IP協定裡面隻有8bit。

現在的ip版本号是4,是以也稱作IPv4。現在還有IPv6,而且運用也越來越廣泛了。

1.2.IP路由選擇

當一個IP資料包準備好了的時候,IP資料包(或者說是路由器)是如何将資料包送到目的地的呢?它是怎麼選擇一個合适的路徑來"送貨"的呢?

最特殊的情況是目的主機和主機直連,那麼主機根本不用尋找路由,直接把資料傳遞過去就可以了。至于是怎麼直接傳遞的,這就要靠ARP協定了,後面會講到。

稍微一般一點的情況是,主機通過若幹個路由器(router)和目的主機連接配接。那麼路由器就要通過ip包的資訊來為ip包尋找到一個合适的目标來進行傳遞,比如合适的主機,或者合适的路由。路由器或者主機将會用如下的方式來處理某一個IP資料包

如果IP資料包的TTL(生命周期)以到,則該IP資料包就被抛棄。

搜尋路由表,優先搜尋比對主機,如果能找到和IP位址完全一緻的目标主機,則将該包發向目标主機

搜尋路由表,如果比對主機失敗,則比對同子網的路由器,這需要“子網路遮罩(1.3.)”的協助。如果找到路由器,則将該包發向路由器。

搜尋路由表,如果比對同子網路由器失敗,則比對同網号(第一章有講解)路由器,如果找到路由器,則将該包發向路由器。

搜尋陸遊表,如果以上都失敗了,就搜尋預設路由,如果預設路由存在,則發包

如果都失敗了,就丢掉這個包。

這再一次證明了,ip包是不可靠的。因為它不保證送達。

1.3.子網尋址

IP位址的定義是網絡号+主機号。但是現在所有的主機都要求子網編址,也就是說,把主機号在細分成子網号+主機号。最終一個IP位址就成為 網絡号碼+子網号+主機号。例如一個B類位址:210.30.109.134。一般情況下,這個IP位址的紅色部分就是網絡号,而藍色部分就是子網号,綠色部分就是主機号。至于有多少位代表子網号這個問題上,這沒有一個硬性的規定,取而代之的則是子網路遮罩,校園網相信大多數人都用過,在校園網的設定裡面有一個255.255.255.0的東西,這就是子網路遮罩。子網路遮罩是由32bit的二進制數字序列,形式為是一連串的1和一連串的0,例如:255.255.255.0(二進制就是11111111.11111111.11111111.00000000)對于剛才的那個B類位址,因為210.30是網絡号,那麼後面的109.134就是子網号和主機号的組合,又因為子網路遮罩隻有後八bit為0,是以主機号就是IP位址的後八個bit,就是134,而剩下的就是子網号碼--109。

2. ARP協定

還記得資料鍊路層的以太網的協定中,每一個資料包都有一個MAC位址頭麼?我們知道每一塊以太網卡都有一個MAC位址,這個位址是唯一的,那麼IP包是如何知道這個MAC位址的?這就是ARP協定的工作。

ARP(位址解析)協定是一種解析協定,本來主機是完全不知道這個IP對應的是哪個主機的哪個接口,當主機要發送一個IP包的時候,會首先查一下自己的ARP高速緩存(就是一個IP-MAC位址對應表緩存),如果查詢的IP-MAC值對不存在,那麼主機就向網絡發送一個ARP協定廣播包,這個廣播包裡面就有待查詢的IP位址,而直接收到這份廣播的包的所有主機都會查詢自己的IP位址,如果收到廣播包的某一個主機發現自己符合條件,那麼就準備好一個包含自己的MAC位址的ARP包傳送給發送ARP廣播的主機,而廣播主機拿到ARP包後會更新自己的ARP緩存(就是存放IP-MAC對應表的地方)。發送廣播的主機就會用新的ARP緩存資料準備好資料鍊路層的的資料包發送工作。

一個典型的arp緩存資訊如下,在任意一個系統裡面用“arp -a”指令:

Interface: 192.168.11.3 --- 0x2

  Internet Address      Physical Address      Type

  192.168.11.1          00-0d-0b-43-a0-2f     dynamic

  192.168.11.2          00-01-4a-03-5b-ea     dynamic

都會得到這樣的結果。

這樣的高速緩存是有時限的,一般是20分鐘(伯克利系統的衍生系統)。

ICMP協定,ping和Traceroute

1.IMCP協定介紹

前面講到了,IP協定并不是一個可靠的協定,它不保證資料被送達,那麼,自然的,保證資料送達的工作應該由其他的子產品來完成。其中一個重要的子產品就是ICMP(網絡控制封包)協定。

當傳送IP資料包發生錯誤--比如主機不可達,路由不可達等等,ICMP協定将會把錯誤資訊封包,然後傳送回給主機。給主機一個處理錯誤的機會,這 也就是為什麼說建立在IP層以上的協定是可能做到安全的原因。ICMP資料包由8bit的錯誤類型和8bit的代碼和16bit的校驗群組成。而前 16bit就組成了ICMP所要傳遞的資訊。書上的圖6-3清楚的給出了錯誤類型和代碼的組合代表的意思。

盡管在大多數情況下,錯誤的包傳送應該給出ICMP封包,但是在特殊情況下,是不産生ICMP錯誤封包的。如下

ICMP差錯封包不會産生ICMP差錯封包(出IMCP查詢封包)(防止IMCP的無限産生和傳送)

目的位址是廣播位址或多點傳播位址的IP資料報。

作為鍊路層廣播的資料報。

不是IP分片的第一片。

源位址不是單個主機的資料報。這就是說,源位址不能為零位址、環回位址、廣播地 址或多點傳播位址。

雖然裡面的一些規定現在還不是很明白,但是所有的這一切規定,都是為了防止産生ICMP封包的無限傳播而定義的。

ICMP協定大緻分為兩類,一種是查詢封包,一種是差錯封包。其中查詢封包有以下幾種用途:

ping查詢(不要告訴我你不知道ping程式)

子網路遮罩查詢(用于無盤工作站在初始化自身的時候初始化子網路遮罩)

時間戳查詢(可以用來同步時間)

而差錯封包則産生在資料傳送發生錯誤的時候。就不贅述了。

2.ICMP的應用--ping

ping可以說是ICMP的最著名的應用,當我們某一個網站上不去的時候。通常會ping一下這個網站。ping會回顯出一些有用的資訊。一般的資訊如下:

Reply from 10.4.24.1: bytes=32 time<1ms TTL=255

Reply from 10.4.24.1: bytes=32 time<1ms TTL=255

Reply from 10.4.24.1: bytes=32 time<1ms TTL=255

Reply from 10.4.24.1: bytes=32 time<1ms TTL=255

Ping statistics for 10.4.24.1:

    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),

Approximate round trip times in milli-seconds:

    Minimum = 0ms, Maximum = 0ms, Average = 0ms

ping這個單詞源自聲納定位,而這個程式的作用也确實如此,它利用ICMP協定包來偵測另一個主機是否可達。原理是用類型碼為0的ICMP發請 求,受到請求的主機則用類型碼為8的ICMP回應。ping程式來計算間隔時間,并計算有多少個包被送達。使用者就可以判斷網絡大緻的情況。我們可以看到, ping給出來了傳送的時間和TTL的資料。我給的例子不太好,因為走的路由少,有興趣地可以ping一下國外的網站比如sf.net,就可以觀察到一些 丢包的現象,而程式運作的時間也會更加的長。

ping還給我們一個看主機到目的主機的路由的機會。這是因為,ICMP的ping請求資料報在每經過一個路由器的時候,路由器都會把自己的ip放到該數 據報中。而目的主機則會把這個ip清單複制到回應icmp資料包中發回給主機。但是,無論如何,ip頭所能紀錄的路由清單是非常的有限。如果要觀察路由, 我們還是需要使用更好的工具,就是要講到的Traceroute(windows下面的名字叫做tracert)。

3.ICMP的應用--Traceroute

Traceroute是用來偵測主機到目的主機之間所經路由情況的重要工具,也是最便利的工具。前面說到,盡管ping工具也可以進行偵測,但是,因為ip頭的限制,ping不能完全的記錄下所經過的路由器。是以Traceroute正好就填補了這個缺憾。

Traceroute的原理是非常非常的有意思,它受到目的主機的IP後,首先給目的主機發送一個TTL=1(還記得TTL是什麼嗎?)的UDP(後面就 知道UDP是什麼了)資料包,而經過的第一個路由器收到這個資料包以後,就自動把TTL減1,而TTL變為0以後,路由器就把這個包給抛棄了,并同時産生 一個主機不可達的ICMP資料報給主機。主機收到這個資料報以後再發一個TTL=2的UDP資料報給目的主機,然後刺激第二個路由器給主機發ICMP資料 報。如此往複直到到達目的主機。這樣,traceroute就拿到了所有的路由器ip。進而避開了ip頭隻能記錄有限路由IP的問題。

有人要問,我怎麼知道UDP到沒到達目的主機呢?這就涉及一個技巧的問題,TCP和UDP協定有一個端口号定義,而普通的網絡程式隻監控少數的幾個号碼較 小的端口,比如說80,比如說23,等等。而traceroute發送的是端口号>30000(真變态)的UDP報,是以到達目的主機的時候,目的 主機隻能發送一個端口不可達的ICMP資料報給主機。主機接到這個報告以後就知道,主機到了,是以,說Traceroute是一個騙子一點也不為過:)

Traceroute程式裡面提供了一些很有用的選項,甚至包含了IP選路的選項,請察看man文檔來了解這些,這裡就不贅述了。

IP選路,動态選路,和一些細節

1.靜态IP選路

1.1.一個簡單的路由表

選路是IP層最重要的一個功能之一。前面的部分已經簡單的講過路由器是通過何種規則來根據IP資料包的IP位址來選擇路由。這裡就不重複了。首先來看看一個簡單的系統路由表。

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

192.168.11.0    *               255.255.255.0   U     0      0        0 eth0

169.254.0.0     *               255.255.0.0     U     0      0        0 eth0

default         192.168.11.1    0.0.0.0         UG    0      0        0 eth0

對于一個給定的路由器,可以列印出五種不同的flag。

U表明該路由可用。

G表明該路由是到一個網關。如果沒有這個标志,說明和Destination是直連的,而相應的Gateway應該直接給出Destination的位址。

H表明該路由是到一個主機,如果沒有該标志,說明Destination是一個網絡,換句話說Destination就應該寫成一個網絡号和子網号的組合,而不包括主機号(主機号碼處為0),例如 192.168.11.0

D表明該路由是為重定向封包建立的

M該路由已經被重定向封包修改

U沒啥可說的,G說明這是一個網關,如果你要發資料給Destination,IP頭應該寫Destination的IP位址,而資料鍊路層的MAC位址就應該是GateWay的Mac位址了;反之,如果沒有G标志,那麼資料鍊路層和IP層的位址應該是對應的。H說明了Destination的性質,如果是H的,則說明該位址是一個完整的位址,既有網絡号又有主機号,那麼再比對的時候就既要比對網絡号,又要比對主機号;反之,Destination就代表一個網絡,在比對的時候隻要比對一下網絡号就可以了。

這樣,IP選路的方式就可以更加具體化了。如下

首先用IP位址來比對那些帶H标志的DestinationIP位址。

如果1失敗就比對那些網絡位址。

如果2失敗就發送到Default網關

順便提一下那個GenMask(還記得子網路遮罩麼),它指定了目的位址的子網号,例如第一條的子網就是11。

1.2.其他有關路由表的知識

一般,我們在配置好一個網絡接口的時候,一個路由就被直接建立好了。當然我們也可以手動添加路由。用route add指令就可以了。

而當一個IP包在某一個路由器的時候發現沒有路由可走,那麼該路由器就會給源主機發送“主機不可達”或者“網絡不可達”的ICMP包來報錯。

注意,一般的作業系統預設是沒有路由功能的,這需要自己配置。這些曆史原因就不細說了,

1.3.ICMP的IP重定向封包和路由發現封包

當IP包在某一個地方轉向的時候,都回給發送IP報的源主機一個ICMP重定向封包,而源主機就可以利用這個資訊來更新自己的路由表,這樣,随着網絡通信的逐漸增多,路由表也就越來越完備,資料轉發的速度也會越來越快。我們需要注意的是:

重定向封包隻能由路由器發出。

重定向封包為主機所用,而不是為路由器所用。

在主機引導的時候,一般會發送在網内廣播一個路由請求的ICMP封包,而多個路由器則會回應一個路由通告封包。而且,路由其本身不定期的在網絡内釋出路由通告封包,這樣,根據這些封包,每一個主機都會有機會建立自己的路由表而實作網絡通信。路由器在一份通告封包中可以通告多個位址,并且給出每一個位址的優先等級,這個優先等級是該IP作為預設路由的等級,至于怎麼算的就不深究了。

路由器一般會在450-600秒的時間間隔内釋出一次通告,而一個給定的通告封包的壽命是30分鐘。而主機在引導的時候會每三秒發送一次請求封包,一旦接受到一個有效的通告封包,就停止發送請求封包。

在TCP/IP詳解編寫的時候,隻有Solaris2.x支援這兩種封包,大多數系統還不支援這兩種封包。(後面還會講到一些有用的路由封包)

動态選路協定

前面的選路方法叫做靜态選路,簡要地說就是在配置接口的時候,以預設的方式生成路由表項。并通過route來增加表項,或者通過ICMP封包來更新表項(通常在預設方式出錯的情況下)。 而如果上訴三種方法都不能滿足,那麼我們就使用動态選路。

動态選路協定是用于動态選路的重要組成部分,但是他們隻是使用在路由器之間,相鄰路由器之間互相通信。系統(路有選擇程式)選擇比較合适的路有放到核心路由表中,然後系統就可以根據這個核心路有表找到最合适的網路。也就是說,動态選路是在系統核心網絡外部進行的,它隻是用一些選路的政策影響路由表,而不會影響到最後通過路由表選擇路由的那一部分。選路協定有一大類常用的叫做内部網關協定(IGP),而在IGP中,RIP就是其中最重要的協定。一種新的IGP協定叫做開放最短路經優先(OSPF)協定,其意在取代RIP。另一種最早用在網路骨幹網上的IGP協定--HELLO,現在已經不用了。

如今,任何支援動态選路的路由器都必須同時支援OSPF和RIP,還可以選擇性的支援其他的IGP協定。

2.1.Unix選路程式

Unix系統上面通常都有路由守護程式--routed。還有一個叫做gate。gate所支援的協定要比routed多,routed隻是支援RIPv1版本。而gate則支援RIPv1、v2,BGPv1 等等。

2.1.RIP:選路資訊協定

它的定義可以在RFC1058内找到,這種協定使用UDP作為載體(也就是UDP的上層協定)。我們最關心的就是RIP其中的一個段,叫做度量的段,這是一個以hop作為計數器(就是以走過多少路由為計數器)的段(IP協定裡面也有一個TTL不是麼)。這個度量段将最終影響到路由表的建立。參考圖:

一般說來routed要承擔如下的工作:

給每一個已知的路由器發送rip請求封包,要求其他路由器給出完整的路由表。這種封包的指令字段為1,位址字段為0,度量地段為16(相當于無窮大)。

接受請求,如果接收到剛才的那個請求,就把自己的完整的路由表交給請求者。如果沒有,就處理IP請求表項,把表項中自己有的部分添上跳數,沒有的部分添上16。然後發給請求者。

接受回應。更新自己的路由表。使用hop數小的規則。

定期更新路由表,一般是30s(真頻繁)給相鄰的路有啟發一次自己的路由表。這種形式可以使廣播形式的。

這個協定看起來會工作的很好,但是,這裡面其實有很多隐藏的憂患,比如說RIP沒有子網的概念,比如說環路的危險。而且hop數的上限也限制了網絡的大小。

是以,出現了很多RIPv1的替代品,比如說RIPv2,比如說OSPF。他們都是通過某種政策來影響路由表,是以就不說了。

UDP協定

1.UDP簡要介紹

UDP是傳輸層協定,和TCP協定處于一個分層中,但是與TCP協定不同,UDP協定并不提供逾時重傳,出錯重傳等功能,也就是說其是不可靠的協定。

2.UDP協定頭

2.1.UDP端口号

由于很多軟體需要用到UDP協定,是以UDP協定必須通過某個标志用以區分不同的程式所需要的資料包。端口号的功能就在于此,例如某一個UDP程式A在系統中注冊了3000端口,那麼,以後從外面傳進來的目的端口号為3000的UDP包都會交給該程式。端口号理論上可以有2^16這麼多。因為它的長度是16個bit

2.2.UDP檢驗和

這是一個可選的選項,并不是所有的系統都對UDP資料包加以檢驗和資料(相對TCP協定的必須來說),但是RFC中标準要求,發送端應該計算檢驗和。

UDP檢驗和覆寫UDP協定頭和資料,這和IP的檢驗和是不同的,IP協定的檢驗和隻是覆寫IP資料頭,并不覆寫所有的資料。UDP和TCP都包含一個僞首部,這是為了計算檢驗和而攝制的。僞首部甚至還包含IP位址這樣的IP協定裡面都有的資訊,目的是讓UDP兩次檢查資料是否已經正确到達目的地。如果發送端沒有打開檢驗和選項,而接收端計算檢驗和有差錯,那麼UDP資料将會被悄悄的丢掉(不保證送達),而不産生任何差錯封包。

2.3.UDP長度

UDP可以很長很長,可以有65535位元組那麼長。但是一般網絡在傳送的時候,一次一般傳送不了那麼長的協定(涉及到MTU的問題),就隻好對資料分片,當然,這些是對UDP等上級協定透明的,UDP不需要關心IP協定層對資料如何分片,下一個章節将會稍微讨論一些分片的政策。

3.IP分片

IP在從上層接到資料以後,要根據IP位址來判斷從那個接口發送資料(通過選路),并進行MTU的查詢,如果資料大小超過MTU就進行資料分片。資料的分片是對上層和下層透明,而資料也隻是到達目的地還會被重新組裝,不過不用擔心,IP層提供了足夠的資訊進行資料的再組裝。

在IP頭裡面,16bit識别号唯一記錄了一個IP包的ID,具有同一個ID的IP片将會被重新組裝;而13位片偏移則記錄了某IP片相對整個包的位置;而這兩個表示中間的3bit标志則标示着該分片後面是否還有新的分片。這三個标示就組成了IP分片的所有資訊,接受方就可以利用這些資訊對IP資料進行重新組織(就算是後面的分片比前面的分片先到,這些資訊也是足夠了)。

因為分片技術在網絡上被經常的使用,是以僞造IP分片包進行流氓的軟體和人也就層出不窮。

可以用Trancdroute程式來進行簡單的MTU偵測。請參看教材。

3.UDP和ARP之間的互動式用

這是不常被人注意到的一個細節,這是針對一些系統地實作來說的。當ARP緩存還是空的時候。UDP在被發送之前一定要發送一個ARP請求來獲得目的主機的MAC位址,如果這個UDP的資料包足夠大,大到IP層一定要對其進行分片的時候,想象中,該UDP資料包的第一個分片會發出一個ARP查詢請求,所有的分片都輝等到這個查詢完成以後再發送。事實上是這樣嗎?

結果是,某些系統會讓每一個分片都發送一個ARP查詢,所有的分片都在等待,但是接受到第一個回應的時候,主機卻隻發送了最後一個資料片而抛棄了其他,這實在是讓人匪夷所思。這樣,因為分片的資料不能被及時組裝,接受主機将會在一段時間内将永遠無法組裝的IP資料包抛棄,并且發送組裝逾時的ICMP封包(其實很多系統不産生這個差錯),以保證接受主機自己的接收端緩存不被那些永遠得不到組裝的分片充滿。

4.ICMP源站抑制差錯

當目标主機的處理速度趕不上資料接收的速度,因為接受主機的IP層緩存會被占滿,是以主機就會發出一個“我受不了”的一個ICMP封包。

5.UDP伺服器設計

UDP協定的某些特性将會影響我們的伺服器程式設計,大緻總結如下:

關于客戶IP和位址:伺服器必須有根據客戶IP位址和端口号判斷資料包是否合法的能力(這似乎要求每一個伺服器都要具備)

關于目的位址:伺服器必須要有過濾廣播位址的能力。

關于資料輸入:通常伺服器系統的每一個端口号都會和一塊輸入緩沖區對應,進來的輸入根據先來後到的原則等待伺服器的處理,是以難免會出現緩沖區溢出的問題,這種情況下,UDP資料包可能會被丢棄,而應用伺服器程式本身并不知道這個問題。

伺服器應該限制本地IP位址,就是說它應該可以把自己綁定到某一個網絡接口的某一個端口上。

廣播和多點傳播,IGMP協定

1.單點傳播,多點傳播,廣播的介紹

1.1.單點傳播(unicast)

單點傳播是說,對特定的主機進行資料傳送。例如給某一個主機發送IP資料包。這時候,資料鍊路層給出的資料頭裡面是非常具體的目的位址,對于以太網來 說,就是網卡的MAC位址(不是FF-FF-FF-FF-FF-FF這樣的位址)。現在的具有路由功能的主機應該可以将單點傳播資料定向轉發,而目的主機的網 絡接口則可以過濾掉和自己MAC位址不一緻的資料。

1.2.廣播(unicast)

廣播是主機針對某一個網絡上的所有主機發送資料包。這個網絡可能是網絡,可能是子網,還可能是所有的子網。如果是網絡,例如A類網址的廣播就是 netid.255.255.255,如果是子網,則是netid.netid.subnetid.255;如果是所有的子網(B類IP)則是則是 netid.netid.255.255。廣播所用的MAC位址FF-FF-FF-FF-FF-FF。網絡内所有的主機都會收到這個廣播資料,網卡隻要把 MAC位址為FF-FF-FF-FF-FF-FF的資料交給核心就可以了。一般說來ARP,或者路由協定RIP應該是以廣播的形式播發的。

1.3.多點傳播(multicast)

可以說廣播是多點傳播的特例,多點傳播就是給一組特定的主機(多點傳播組)發送資料,這樣,資料的播發範圍會小一些(實際上播發的範圍一點也沒有變小),多點傳播的MAC位址是最高位元組的低位為一,例 如01-00-00-00-00-00。多點傳播組的位址是D類IP,規定是224.0.0.0-239.255.255.255。

雖然多點傳播比較特殊,但是究其原理,多點傳播的資料還是要通過資料鍊路層進行MAC位址綁定然後進行發送。是以一個以太網卡在綁定了一個多點傳播IP位址之後,必 定還要綁定一個多點傳播的MAC位址,才能使得其可以像單點傳播那樣工作。這個多點傳播的IP和多點傳播MAC位址有一個對應的算法,在書的p133到p134之間。可以看到 這個對應不是一一對應的,主機還是要對多點傳播資料進行過濾。

個人的看法:廣播和多點傳播的性質是一樣的,路由器會把資料放到區域網路裡面,然後網卡對這些資料進行過濾,隻拿到自己打算要的資料,比如自己感興趣的多 播資料,自己感興趣的多點傳播資料。當一個主機運作了一個處理某一個多點傳播IP的程序的時候,這個程序會給網卡綁定一個虛拟的多點傳播mac位址,并做出來一個多點傳播 ip。這樣,網卡就會讓帶有這個多點傳播mac位址的資料進來,進而實作通信,而那些沒有監聽這些資料的主機就會把這些資料過濾掉,換句話說,多點傳播,是讓主機 的核心輕松了,而網卡,對不起,您就累點吧。

一些文章也印證了這種想法,最明顯的就是區域網路監聽的原理、實作與防範

2.一些驗證性實驗

這些實驗并不是很複雜,我們隻是要ping一下一般的ip和一個廣播位址。首先我ping一下自己所在的子網的某一台主機:

Reply from 192.168.11.1: bytes=32 time<1ms TTL=255

Reply from 192.168.11.1: bytes=32 time<1ms TTL=255

Reply from 192.168.11.1: bytes=32 time<1ms TTL=255

Reply from 192.168.11.1: bytes=32 time=1ms TTL=255

可以看到,機器傳回的是一台主機的回應結果,進而推測,如果我ping一個廣播位址呢?結果如下

Reply from 192.168.11.9: bytes=32 time=1ms TTL=255

Reply from 192.168.11.174: bytes=32 time<1ms TTL=64

Reply from 192.168.11.174: bytes=32 time<1ms TTL=64

Reply from 192.168.11.174: bytes=32 time<1ms TTL=64

Reply from 192.168.11.218: bytes=32 time<1ms TTL=64

Reply from 192.168.11.174: bytes=32 time<1ms TTL=64

可以看到,ping傳回了一些随機的ip的結果,這些ip都是與主機在同一子網内的ip。我們可以看到,廣播實際上是給處于子網内的所有ip發信。

再來一個多點傳播的例子,但是要實作這個多點傳播并不容易,因為我不知道網絡内有多少個多點傳播組,就隻好利用幾個特殊的多點傳播位址來驗證了。

對于多點傳播位址,有幾個特殊的多點傳播位址被占用,他們是

224.0.0.1--該子網内所有的系統組。

224.0.0.2--該子網内所有的路由器。

224.0.1.1--網絡實作協定NTP專用IP。

224.0.0.9--RIPv2專用IP

是以隻要ping這幾個IP,就應該能得到一些結果,比如說我ping 224.0.0.2。

Reply from 192.168.11.1: bytes=32 time<1ms TTL=255

Reply from 192.168.11.1: bytes=32 time<1ms TTL=255

Reply from 192.168.11.1: bytes=32 time<1ms TTL=255

Reply from 192.168.11.1: bytes=32 time<1ms TTL=255

Reply from 192.168.11.1: bytes=32 time<1ms TTL=255

Reply from 192.168.11.1: bytes=32 time<1ms TTL=255

Reply from 192.168.11.1: bytes=32 time<1ms TTL=255

我們可以看到,這回ping隻傳回了一個ip的回應。而這個就是我的網關的位址,這也驗證了224.0.0.2是所有路由器的多點傳播(多點傳播)位址

3.IGMP協定

IGMP的作用在于,讓其他所有需要知道自己處于哪個多點傳播組的主機和路由器知道自己的狀态。一般多點傳播路由器根本不需要知道某一個多點傳播組裡面有多少個主機,而隻要知道自己的子網内還有沒有處于某個多點傳播組的主機就可以了。隻要某一個多點傳播組還有一台主機,多點傳播路由器就會把資料傳輸出去,這樣,接受方就會通過網卡過濾功能來得到自己想要的資料。為了知道多點傳播組的資訊,多點傳播路由器需要定時的發送IGMP查詢,IGMP的格式可以看書,各個多點傳播組裡面的主機要根據查詢來回複自己的狀态。路由器來決定有幾個多點傳播組,自己要對某一個多點傳播組發送什麼樣的資料。

這種查詢回應資料報的TTL一般是1,而且就算是出錯也不産生ICMP差錯(沒必要)。