TCP/IP讀書筆記(4) IPv4和IPv6 路由選擇
網絡層是位於鏈路層之上,TCP/IP模型中網絡層的核心協議是IP協議(Internet protocol)。
目前主流的IP協議是IPv4(Internet protocol version 4),但是IPv6(Internet protocol version 6)會是趨勢。
IP協議提供不可靠,無連接的數據傳輸服務,它只負責接受數據包,轉發數據庫,不維護兩端的連接狀態。IP層唯一的校驗是,IPv4規定通過在路由節點計算校驗和來確保IP數據報頭是正確的,但是IPv6的時候已經沒有了。因為這些本就不該是IP層應該考慮的事情。
IP協議定義了網絡層數據包的格式,和如何轉發數據包。
IP數據包的格式
IPv6是對IPv4的一個最小擴展,只修改了IP頭部,IPv4和IPv6頭部數據包的格式,參考TCP/IP卷一第二版第182頁。
無論是IPv4還是IPv6,數據包包括兩部分:IP頭部、IP數據,頭部都提供了
- 版本號 IPv4這個值是4,IPv6是6
- 包長度 這個數據包的長度
- 源IP的地址 發送端的IP地址,在IPv4中占4字節,IPv6中占16字節,局域網內傳輸時通常不會改變,但是如果使用了nat的話,會被修改。
- 目的IP的地址 完全同上
- 上層協議號 標識上層協議,列如TCP,UDP,VRRP等。在v4和v6中都只有8位字節,也就是最多256種上層協議。
- 數據包生存時間 為了防止一個數據包被永遠轉發下去,需要需要設置:這個數據包被路由器發送“生存時間“次數后如果還是沒到達目的地就將它拋棄,每個路由器轉發數據包之后都會將生存時間-1,直到它變成0就不再轉發。
- 服務類型 主要是運營商做qos使用,IPv4允許選擇置3位優先級級別(現已被忽略),4位TOS(服務類型),包括4種類型:最小時延,最大吞吐率,最高可靠性。IPv6提供8位的Traffic Class(通信級別),類似的作用。
IPv6和IPv4頭部的一些主要區別在於:
- IPv6頭部中沒有校驗和,路由器不需要對每個達到的數據包計算校驗和,判斷頭部是否正確,提高速度。
- IPv4可以設置分片標識,這里牽扯到上一篇筆記中提到的MTU的概念,如果一個數據包長內容長1400字節又允許分片,而當前路由器的MTU是500,那就會將它分成500,500,400的三部分發出去,如果不允許分片,這個數據包會被丟棄,並產生一個錯誤。
- IPv6頭部中沒有分片標識,它只允許數據發送方決定對數據包進行分片,中間路由器不可以分片,如果發送方的分片不合適,中間路由器會丟棄數據。
- IPv6支持的服務類型更多,詳細可以看思科的這篇文章實現服務質量策略與DSCP
為什么IPv4中傳輸層,網絡層,鏈路層都有校驗和,IPv6網絡層不設置校驗和?
鏈路層的校驗只能保證數據從一個路由器到另一個路由器中間沒有出錯(絕大多數情況下能保證)。
數據包到了路由器之后,路由器會把這個數據包拆開,根據下一跳的地址,設置新的鏈路層頭部的目的地址,crc校驗值,IP首部的的ttl值,甚至可能還會對數據包進行分片,這樣修改的更多了,如果在路由器處理的過程中這個數據出錯,那么鏈路層的校驗是發現不了錯誤的。
所以要保證數據包從發送端到目的地址都沒有出錯,還需要傳輸層有自己的校驗。
至於網絡層的校驗,現在看來確實是沒必要的,IPv6網絡層為了提高速度,已經不再校驗。
IPv6中間路由器也不會對數據包進行分片
路由選擇
路由轉發,ip層通過路由器,將數據從源目的地址發送到目的地址的功能,沒啥好說的,大學都很清楚了。
路由轉發不僅僅是路由器的功能,服務器也有路由轉發,在linux機器上執行route -n可以看到類似下圖的結果
當ip層發送一個數據包時:
- 它會根據目的ip地址,在路由表中搜尋完全匹配的項
- 如果搜尋不到,搜尋網絡地址(cidr中的地址)匹配的項
- 如果搜尋不到,搜尋默認地址
- 將數據包從搜尋到的項中的接口對應的設備發出
需要注意的是,使用靜態路由時,路由表在以下幾種情況可能會被修改:
- 路由器發現這個數據包不應該被發送給它(路由器r2將數據發給r1,r1發現它需要將數據發給r2)時,產生ICMP重定向錯誤,告訴發送方直接把數據發給r2
- 主機或者網卡啟動時發送三份路由請求報文,如果收到,就停止發送,根據報文內容更新路由表。可能之前網絡是通的,啟動了一個網卡之后,默認路由被更改,部分網絡不再聯通
- 鏈路斷開時,部分路由項被移除
另外,服務器默認不轉發不是由它產生的數據包,可以將網卡配置成混雜模式,當做路由器使用,轉發不屬於它產生的數據包。