關於IP數據報轉發的疑問?

TCP/IP詳解卷一第一版第3.3小結IP Routing里有一段話:

In our general scheme, IP can receive a datagram from TCP, UDP, ICMP, or IGMP (that is, a
locally generated datagram) to send, or one that has been received from a network interface (a
datagram to forward). The IP layer has a routing table in memory that it searches each time it
receives a datagram to send. When a datagram is received from a network interface, IP first checks
if the destination IP address is one of its own IP addresses or an IP broadcast address. If so, the
datagram is delivered to the protocol module specified by the protocol field in the IP header. If the
datagram is not destined for this IP layer, then
(1) if the IP layer was configured to act as a router
the packet is forwarded (that is, handled as an outgoing datagram as described below), else (2) the
datagram is silently discarded.

加粗的部分是我不大理解的,我想問下什麼情況主機(非路由器)會收到不是發給自己的IP數據報?

我自己做了個實驗,我一台linux,一台mac,一台手機,在一個區域網中,是連的同一個路由器。我在linux上打開了wireshark,當我用mac來ping手機時,linux上收不到從mac ping 手機的數據報的。

請教各路大神,幫忙解釋下?謝謝了


第一個問題:什麼情況主機(非路由器)會收到不是發給自己的IP數據報?

情況一:別的主機(10.1.1.2)的預設網關設置成10.1.1.1,而你的主機恰好是10.1.1.1,你們處於一個廣播域,當10.1.1.2想訪問8.8.8.8時,IP包就會發給10.1.1.1,如果主機沒有打開路由模式,丟棄處理,如果已經打開路由模式,查找路由表,進一步轉發。作者已經詳細解釋,就不再解釋了。

情況二:別的主機(10.1.1.2)的預設網關設置成10.1.1.1,你的主機是10.1.1.3,但你的主機想欺騙10.1.1.2,讓它誤以為你的主機是10.1.1.1,於是你的主機持續發送Gratuitous ARP廣播,ARP消息里的IP= 10.1.1.1 ,硬體地址是你主機的MAC地址。

此ARP廣播會覆蓋主機10.1.1.2,關於網關的ARP Cache,所以發給網關10.1.1.1的IP包都錯誤地發給了10.1.1.3。

情況三:所有主機使用HUB相連,廣播域里的單播、廣播都會廣播,作為廣播域里的一員,你的主機自然也會收到發給網關10.1.1.1的IP包。至於需不需要進一步處理,作者已經詳細解釋,不再闡述。

第二個問題:無論採用空中介面、還是非空中介面,你只能捕獲到發給你(MAC= Yourself)主機的單播包、或者廣播包,儘管你的空中介面可以看到別的無線信號在面前穿梭。

綁定在一個無線AP上的所有主機共享一個廣播session key,而單播的session key 卻是獨一無二的,意味著你的主機可以理解廣播包,但無法理解別的主機的單播包,因為無法解密。

理論上,別的主機是可以計算出別的主機的session key的,只需要知道AP nonce (鹽)、MAC,別的主機nonce、MAC,以上都是明文傳輸,都可以獲得,以及master key (這個已知),所以可以計算出session key,進而解包。


什麼情況主機(非路由器)會收到不是發給自己的IP數據報?

考慮這本書的成書年代(1993年),估計作者指的是這兩種常見情況:

  1. 有線乙太網絡使用同軸電纜(俗稱細纜)組網或雙絞線接HUB組網,且網卡處於混雜模式(promiscuous mode)。
  2. 別的機器誤將其設為路由器。

非路由器

收到非自己IP的IP包

只有兩種情況,某人的路由配錯了,或者你的IP地址配的和別人衝突了。沒有其他可能。

其他可能都不是IP層的事情,不是這個文章要說明的。

為什麼這麼寫?

因為寫協議棧要寫完整了,以防出現理解不一致實現的時候出問題。

寫協議要寫完整,哪怕很少出現或者出錯的處理都要寫清楚。理解協議這樣寫,比東拉西扯去找犄角旮旯的理由更重要。


1,什麼情況主機(非路由器)會收到不是發給自己的IP數據報?

當網卡不處於混雜模式時(promiscuous mode),只會接收目的MAC為本網卡的數據包和廣播包。

那為什麼我會收到目的IP不是自己,目的MAC卻是自己的數據包?很可能其他主機將你設為了下一跳地址,希望通過你來轉發目的地址為其他主機的IP數據包。

2,datagram is silently discarded

其他主機將你設為下一跳(或網關),而你其實並沒有將自己配置為一台路由器的功能(在 Linux 下的意思就是 ip_forward 這個系統參數被置0),這種場景下,內核發現收到了目的IP不是自己的數據包,而自己又關閉了轉發功能,於是就默默把數據包丟掉了。

你先理解上面說的這兩點,實際上網路上的細節很多,只要你刨根問底仔細推敲的話,會有更多疑惑,解決這些疑惑就能夠學到更多有趣的東西。但時間有限,除非你對網路極其有興趣,否則要有所取捨,理解到一定程度就夠了。


linux 下建個 TUN 或者 TAP 設備,目標地址想填啥就填啥


1.什麼情況主機(非路由器)會收到不是發給自己的IP數據報?

當這一台主機被其他人的路由表指定為下一跳的時候

2.我自己做了個實驗,我一台linux,一台mac,一台手機,在一個區域網中,是連的同一個路由器。我在linux上打開了wireshark,當我用mac來ping手機時,linux上收不到從mac ping 手機的數據報的。

1.對於有線區域網有兩種情況

1.1.路由器的內網側是相當於連交換機的

交換機可以根據arp記憶某個埠的mac,linux那裡不是目的mac所以收不到

1.2.路由器內網側是相互獨立的

linux不是目的ip所以收不到

2.對於無線區域網的情況

linux的網卡沒開/不支持監聽模式

3.對於兩台機器是有線而手機是無線的情況

同1.2


說的是iplayer並沒說是host或者router


什麼情況下會收到不是發給自己的數據包,舉個例子,arp通訊協議的時候就會收到不是發給自己的數據包。區域網中一個主機想要向另外一台主機發送數據,但是不知道它的物理地址,於是它向區域網中廣播誰是192.168.x.x,請把你的物理地址發給我?這時候區域網中所有的機器都會收到這個包,但是只有192.168.x.x這台機器才會回復它這個包,對於其他機器來說,它們就收到了不是發給自己的包。


區域網內包一般是廣播的。你之所以看不到,大概率原因是網卡沒有激活雜湊模式,底層就丟棄了


IP地址是配置在內核上的,而不是在網卡驅動上,只要修改內核就可以讓TCP/IP協議棧接收到目標地址不是自己的包。


推薦閱讀:

個人計算機裡面包含網路7層協議的所有協議嗎,每一層分別對應哪個部分?
交換機mac表的獲取?
rip,ospf屬於應用層協議,但是路由器只是工作在下三層啊,網路層,數據鏈路層,以及物理層,這怎麼解釋啊?
關於IP分組的分段是什麼原理?
ipconfig下的IPv4地址是什麼意思?

TAG:計算機網路 | 計算機科學 | TCPIP |