Linux網絡編程——以太網
宗旨:技術的學習是有限的,分享的精神是無限的。
1、以太網幀格式
源地址和目的地址是指網卡的硬件地址(也叫MAC地址),長度是48位,是在網卡出廠時固化的。用ifconfig命令查看,“ 硬件地址 00:0c:29:cf:7e:1a ” 。協議字段有三種值,分別相應IP、 ARP、 RARP。幀末尾是CRC校驗碼。
ARP和RARP數據包的長度不夠46字節。要在后面補填充位。
最大值1500稱為以太網的最大傳輸單元( MTU),不同的網絡類型有不同的MTU,假設一個數據包從以太網路由到撥號鏈路上,數據包長度大於撥號鏈路的MTU了。則須要對數據包進行分片( fragmentation)。
ifconfig查看“ MTU:1500”。
MTU這個概念指數據幀中有效載荷的最大長度,不包含幀首部的長度。
2、數據報格式
在網絡通訊時,源主機的應用程序知道目的主機的IP地址和port號。卻不知道目的主機的硬件地址,而數據包首先是被網卡接收到再去處理上層協議的,假設接收到的數據包的硬件地址與本機不符,則直接丟棄。因此在通訊前必須獲得目的主機的硬件地址。 ARP協議就起到這個作用。源主機發出ARP請求,詢問“IP地址是192.168.0.1的主機的硬件地址是多少”,並將這個請求廣播到本地網段(以太網幀首部的硬件地址填FF:FF:FF:FF:FF:FF表示廣播),目的主機接收到廣播的ARP請求,發現當中的IP地址與本機相符。則發送一個ARP應答數據包給源主機。將自己的硬件地址填寫在應答包中。
每台主機都維護一個ARP緩存表,能夠用arp -a命令查看。緩存表中的表項有過期時間(一般為20分鍾),假設20分鍾內沒有再次使用某個表項,則該表項失效,下次還要發ARP請求來獲得目的主機的硬件地址。
ARP數據報格式:
注意到源MAC地址、目的MAC地址在以太網首部和ARP請求中各出現一次。對於鏈路層為以太網的情況是多余的,但假設鏈路層是其他類型的網絡則有可能是必要的。硬件類型指鏈路層網絡類型。1為以太網,協議類型指要轉換的地址類型,0x0800為IP地址,后面兩個地址長度對於以太網地址和IP地址分別為6和4(字節)。op字段為1表示ARP請求,op字段為2表示ARP應答。
比如請求幀:
以太網首部( 14字節)
0000: ff ff ff ff ff ff 00 05 5d 61 58 a8 08 06
ARP幀( 28字節)
0000: 00 01
0010: 08 00 06 04 00 01 00 05 5d 61 58 a8 c0 a8 00 37
0020: 00 00 00 00 00 00 c0 a8 00 0218
填充位( 字節)
0020: 00 77 31 d2 50 10
0030: fd 78 41 d3 00 00 00 00 00 00 00 00
以太網首部:目的主機採用廣播地址,源主機的MAC地址是00:05:5d:61:58:a8。上層協議類型0x0806表示ARP。
ARP幀:硬件類型0x0001表示以太網。協議類型0x0800表示IP協議,硬件地址(MAC地址)長度為6,協議地址(IP地址)長度為4,op為0x0001表示請求目的主機的MAC地址。源主機MAC地址為00:05:5d:61:58:a8,源主機IP地址為c0 a8 00 37(192.168.0.55),目的主機MAC地址全0待填寫。目的主機IP地址為c0 a8 00 02(192.168.0.2)。
因為以太網規定最小數據長度為46字節。 ARP幀長度僅僅有28字節。因此有18字節填充位,填充位的內容未定義,與詳細實現相關。
應答幀例如以下:
以太網首部
0000: 00 05 5d 61 58 a8 00 05 5d a1 b8 40 08 06
ARP幀0000: 00 01
0010: 08 00 06 04 00 02 00 05 5d a1 b8 40 c0 a8 00 02
0020: 00 05 5d 61 58 a8 c0 a8 00 37
填充位0020: 00 77 31 d2 50 100030: fd 78 41 d3 00 00 00 00 00 00 00 00
以太網首部:目的主機的MAC地址是00:05:5d:61:58:a8,源主機的MAC地址是00:05:5d:a1:b8:40。上層協議類型0x0806表示ARP。
ARP幀:硬件類型0x0001表示以太網,協議類型0x0800表示IP協議。硬件地址( MAC地址)長度為6,協議地址( IP地址)長度為4,op為0x0002表示應答,源主機MAC地址為00:05:5d:a1:b8:40,源主機IP地址為c0 a8 00 02( 192.168.0.2)。目的主機MAC地址為00:05:5d:61:58:a8。目的主機IP地址為c0 a8 00 37( 192.168.0.55)。
3、數據報格式
IP數據報的首部長度和數據長度都是可變長的。但總是4字節的整數倍。對於IPv4,4位版本號字段是4。4位首部長度的數值是以4字節為單位的。最小值為5。也就是說首部長度最小是4x5=20字節,也就是不帶不論什么選項的IP首部,4位能表示的最大值是15,也就是說首部長度最大是60字節。8位TOS字段有3個位用來指定IP數據報的優先級(眼下已經廢棄不用),還有4個位表示可選的服務類型(最小延遲、最大呑吐量、最大可靠性、最小成本),另一個位總是0。
總長度是整個數據報(包含IP首部和IP層payload)的字節數。每傳一個IP數據報,16位的標識加1,可用於分片和又一次組裝數據報。3位標志和13位片偏移用於分片。 TTL(Time to live)是這樣用的:源主機為數據包設定一個生存時間,比方64,每過一個路由器就把該值減1。假設減到0就表示路由已經太長了仍然找不到目的主機的網絡,就丟棄該包,因此這個生存時間的單位不是秒,而是跳(hop)。協議字段指示上層協議是TCP、UDP、ICMP還是IGMP。然后是校驗和,僅僅校驗IP首部,數據的校驗由更高層協議負責。IPv4的IP地址長度為32位。
4、IP地址
IPv4的IP地址長度為4字節,通常採用點分十進制表示法(dotted decimal representation)比如0xc0a80002表示為192.168.0.2。 Internet被各種路由器和網關設備分隔成非常多網段。為了標識不同的網段,須要把32位的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
一個A類網絡可容納的地址數量最大,一個B類網絡的地址數量是65536。一個C類網絡的地址數量是256。 D類地址用作多播地址。 E類地址保留未用。
網絡號和主機號的划分須要用一個額外的子網掩碼(subnet mask)來表示,而不能由IP地址本身的數值決定,也就是說,網絡號和主機號的划分與這個IP地址是A類、 B類還是C類無關,因此稱為Classless的。
這樣,多個子網就能夠匯總(summarize)成一個Internet上的網絡,比如,有8個網站都申請了C類網絡,本來網絡號是24位的,可是這8個網站通過同一個ISP(Internet serviceprovider)連到Internet上,它們網絡號的高21位是同樣的,僅僅有低三位不同,這8個網站就能夠匯總,在Internet上僅僅須要一個路由表項,數據包通過Internet上的路由器到達ISP,然后在ISP這邊再通過次級的路由器選路到某個網站。
比如:子網1
子網2:
IP地址與子網掩碼做與運算能夠得到網絡號。主機號從全0到全1就是子網的地址范圍。IP地址和子網掩碼另一種更簡潔的表示方法。比如140.252.20.68/24。表示IP地址為140.252.20.68。子網掩碼的高24位是1。也就是255.255.255.0。
假設一個組織內部組建局域網, IP地址僅僅用於局域網內的通信,而不直接連到Internet上,理論上使用隨意的IP地址都能夠。可是RFC 1918規定了用於組建局域網的私有IP地址,這些地址不會出如今Internet上,例如以下表所看到的。
10.*,前8位是網絡號,共16,777,216個地址
172.16.*到172.31.*。前12位是網絡號。共1,048,576個地址
192.168.*,前16位是網絡號。共65,536個地址
127.*的IP地址用於本機環回(loop back)測試,一般是127.0.0.1。loopback是系統中一種特殊的網絡設備。假設發送數據包的目的地址是環回地址,或者與本機其他網絡設備的IP地址同樣,則數據包不會發送到網絡介質上,而是通過環回設備再發回給上層協議和應用程序。主要用於測試。