IPV6基礎


Pv6與IPv4的區別

Pv6報文與IPv4報文差別就兩個地方:

一個是數據鏈路層(以太網協議)中協議類型,IPv4是0x0800,IPv6是0x86DD

另一個是IPv6 Header是40字節,IPv4只有20字節。

圖一
圖二

  • Version一個是4,一個是6

  • IHL(Internet Header Length)在IPv6中去除了,因為IPv6 Header不支持Option,所以長度是固定的40字節,因此也沒必要表明Header的長度。實際上IPv4 option也很少使用。

  • Type of Service,在IPv6中改名成為了Traffic Class。不過功能保留了,還是用來標識流量做QoS用。

  • Total Length,在IPv6中改名成為了Payload Length。並且,IPv4的Total Length是要包含IPv4 Header的,而IPv6 Payload Length直接是IP payload的長度。這樣在IPv6包有效性校驗的時候,不必考慮Total Length必須要大於IHL,能夠提升一丟丟的性能。

  • Flow Label,IPv6中新增的字段,用來標識一個TCP連接或者一個會話。通過Flow Label可以不看其他的Header,就標識出流量,對於QoS的實現有幫助。

  • Identification, Flags, and Fragment Offset,這些字段在IPv6中去除了。這些是用來實現IP報文分片的,也就是說IPv6不支持分片。

    IPv6的數據只在源端分片,目的端重組,中間路由器收到超過它MTU的數據會發送ICMPv6告訴源主機它的MTU大小,並把數據拋棄.
    ipv6包發向一個目的地址的第一個包,如果在路由過程中被某個路由器卡住,那個路由器是會向源IP發icmpv6報文告訴源ip的主機,包太大了,同時會附上一個MTU,源主機再調整包大小,重發,然后后面的包就都不會超過這個大小,也就是說,第1個包可能會重發。
    再如果過了上面被卡的路由器,報文繼續往下走,又遇到一個路由器,MTU更小,同樣,也會向源主機發個icmpv6的報文,告訴源主機,包大了,要調后重發,就這樣直到數據包到達目的地址。
    
  • TTL在IPv6中改名為Hop Limit。功能是一樣的,改名之后更貼近實際的作用。

  • Protocol Field在IPv6中改名為Next Header。

  • Checksum在IPv6中移除了。因為更高層的協議自己有錯誤檢測,而更底層的協議通常有CRC校驗也能發現錯誤,所以IPv6放棄了自己的Checksum,這也是能提升一丟丟性能的改動。

  • Source Address,Destination Address,從IPv4的32bit,改成了IPv6的128bit。

IPv6 地址表示方式

IPv6地址是由bit組成,它的表示方法是為了讓人更好的記住和書寫這些地址。從最標准的角度來看,一個IPv6地址是這樣:

0010 0000 0000 0001 0000 1101 1011 1000 
0000 0000 0000 0000 0000 0000 0000 0000 
0000 0000 0000 0000 0000 0000 0101 0010 
0000 0000 0000 0000 0000 0000 0000 0001 

為了簡化,第一步是用16進制表示地址,因此上面的地址可以表示為8段16進制數:

2001:0db8:0000:0000:0000:0052:0000:0001 

這已經是一個完全合法的IPv6地址了。但是在實際應用中,要記住這么一串地址基本不可能,尤其某些場合還不能復制黏貼。不得不說,IPv6地址太長也是阻礙IPv6發展的另一大因素。

為了進一步簡化,每一段地址起始的0可以不用寫出來(寫出來也合法)。任一段,如果少於4個字符,則認為前面用0補齊至4個字符。如果一段全是0,可以用單個0來表示。因此上面的地址可以表示為:

2001:db8:0:0:0:52:0:1 

為了進一步簡化,任何全0組成的1個或者多個連續地址段,可以用雙冒號 “::” 表示。但是在IPv6地址中,不能出現兩個雙冒號。雙冒號應當用於盡可能縮短地址。因此上面的地址可以簡化成:

2001:db8::52:0:1 

這就是一個常見IPv6地址的形態,雖然還是很長,但是相比較之前的形態已經簡化了很多。

DHCPv6

DHCPv6除了工作模式與DHCP類似以外,與DHCP也不兼容,它的協議內容也進行了重新定義。

因為IPv6中沒有廣播的概念,所以不像DHCP基於廣播地址255.255.255.255來發現DHCP Server,DHCPv6中,有兩個保留的組播地址,用來發現網絡中的DHCP Server:

  • All_DHCP_Relay_Agents_and_Servers (ff02::1:2)
    • DHCPv6 client使用這個地址將DHCP請求發送給所有的DHCPv6 relay(中繼)agent和DHCPv6 server,這樣可以發現網絡中的DHCPv6 Server
  • All_DHCP_Servers (ff05::1:3)
    • DHCPv6 relay agent通過這個地址將DHCP請求轉發給所有的DHCPv6 server

DHCPv6仍然是基於UDP協議,但是使用的是UDP的547(Server監聽端口)和546(Client監聽端口)。

IPv6協議下,每個網卡都默認帶一個link-local地址,這個地址是fe80::/10的前綴加上(一般情況下)網卡的MAC地址生成[RFC4291]。IPv6的link-local用來在一個二層鏈路中唯一標識一塊網卡,並且可以在有限場景下在一個二層鏈路中用來通信。

在DHCP(IPv4)協議下,DHCP Client在發起請求的時候,因為還沒有IP地址,所以源IP只能是Unspecified Address(0.0.0.0)。而DHCPv6 Client在發起請求的時候,網卡已經有IPv6地址了,所以源IPv6地址就是網卡的link-local地址,目的地址是DHCPv6保留的組播地址ff02::1:2

DHCPv6 Server在收到請求之后,將IPv6地址在單播回給Client網卡的link-local地址。其中IPv6地址包含在Advertise和Reply中,這個過程與DHCP類似。

兩個協議,三種模式

IPv6的動態地址配置主要依賴兩個協議,一個是DHCPv6(RFC8415),另一個是IPv6 Stateless Address Autoconfiguration(RFC4862)。IPv6的動態地址配置方式客觀的說是合理的,並且一定程度結合了IPv4動態地址配置的經驗。

實際中,經常將DHCP Server配置在路由器上,或者路由器作為一個DHCP relay agent。另一方面,如果沒有路由器,網絡只是一個二層網絡,作用有限。因此,這兩個設備本身可以只是一個設備,並且它們之中,路由器占主導地位。基於這個背景,IPv6的動態地址配置有三種模式:

  • SLAAC,Stateless Auto Address Configuration
  • Stateless DHCPv6
  • Stateful DHCPv6

這里的Stateful,指的就是DHCP Server管理的IP地址,因為這些地址存在一個分配關系,需要一個程序去管理這個狀態。Stateless Address是指這個地址就是分配給某一個確定的主機使用,沒有其他狀態。

SLAAC

SLAAC基於協議RFC4861和RFC4862。在SLAAC的世界里,沒有DHCPv6。SLAAC協議由路由器來通告配置IPv6地址所需要的信息。具體工作流程是這樣:支持IPv6的網卡啟動的時候會發送一條RS(Router Solicitation)消息,源IP是網卡的link-local地址,目的IP是ff02::2。ff02::2也是保留的組播地址,用來表示所有的路由器。這條消息用來查找當前網絡中的路由器。

路由器收到這條消息之后,會回傳一條RA(Router Advertisement)。一般情況下,RA的源IP地址是Router的link-local地址,目的地址是ff02::1。ff02::1也是一個保留的組播地址,用來表示所有的主機。也就是說任意網卡發起的RS消息,都會引起路由器將RA消息在整個網絡中發送給所有的主機。除此之外,就算沒有任何RS消息,路由器也應當定期向所有主機發送RA。

RA可以發送給網絡中所有主機的基礎就是,不像DHCP消息,RA是無狀態的,任何主機接收到了RA消息之后,都能根據其中的信息完成IP地址配置。RA的options中通常包括:

MTU
主機可以根據這個MTU值配置自己的MTU
路由器的MAC地址
0或者N個prefix(網段)

如果RA中一個prefix的auto標志位是1,那相當於告訴網卡,可以自己從這個prefix中生成一個IPv6的地址。網卡只需要使用一個局域網中唯一的標識符,再加上這個prefix,就能生成一個IPv6地址。網卡在局域網中的天然唯一標識符就是MAC地址,因此一般情況下,SLAAC協議中,網卡是通過RA中的prefix和自身的MAC地址,再根據EUI-64格式生成一個IPv6地址。SLAAC協議的基礎就是IPv6地址長度足夠大,能支持這樣的配置。

RA消息還能帶來一個潛在的配置,主機會將IPv6的默認網關,指向RA的源IP地址,也就是Router的link-local地址。生成的默認路由是有時效的,時間是Router Lifetime。所以需要路由器定時發布RA(類似於心跳),更新主機的默認路由。這個機制講道理是合理的,默認路由只有在路由器還活着的時候才有意義。但是這個機制增加了管理的復雜度,尤其在SDN場景,虛擬路由器下定時發布RA。

SLAAC協議有兩個問題,一個是IPv6的地址不可控了,一般情況下與主機的MAC地址相關;另一個是RA格式比較簡單,能傳遞的配置有限,一些復雜的主機配置無法通過RA傳遞。

但是好處是簡單,只用路由器,不需要DHCPv6的介入,就可以完成簡單的IP地址配置;另外無狀態地址能簡化管理,只需要一些簡單的程序就能完成Prefix分發,不需要集中的管理地址,處理多節點數據同步,這有點像分布式架構。SLAAC的配置過程如下如所示:

Stateless DHCPv6

Stateless DHCPv6就是結合了SLAAC和DHCPv6。其中IPv6地址配置通過SLAAC下發,其他配置通過DHCPv6下發。這樣能彌補SLAAC模式下,RA所能傳遞配置有限的問題。

Stateful DHCPv6

這里就是純純的DHCPv6了,但是前面說過,DHCPv6不支持子網掩碼長度,路由,和默認路由。這樣就導致通過DHCPv6獲得的IPv6地址,因為沒有掩碼長度,地址的掩碼都是128位。而路由和默認網關,還是需要依賴RA。因為在IPv6中,動態配置路由和默認網關的唯一方式就是使用Router Advertisement消息。所以,就算使用了DHCPv6,也不能完全擺脫RA消息。只是說DHCPv6下,IPv6地址變得可控了。所以,在IPv6動態地址配置中,Router Advertisement是必不可少的,因為它控制了主機路由和默認路由。同時Router Advertisement還控制了IPv6的動態地址配置模式。在RA的數據中,有兩個標志位M(Managed)和O(Other)。

  • 當M=0,O=0時,IPv6地址工作在SLAAC模式下
  • 當M=0,O=1時,IPv6地址工作在Stateless DHCPv6模式下
  • 當M=1時,IPv6地址工作在Stateful DHCPv6模式下

文章來源:https://zhuanlan.zhihu.com/p/79405231

https://zhuanlan.zhihu.com/p/78674906


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM