1. 程式人生 > >Linux C高階程式設計——網路程式設計之乙太網(2)

Linux C高階程式設計——網路程式設計之乙太網(2)

Linux網路程式設計——乙太網

宗旨:技術的學習是有限的,分享的精神是無限的。

1、乙太網幀格式

        源地址和目的地址是指網絡卡的硬體地址(也叫MAC地址),長度是48位,是在網絡卡出廠時固化的。用ifconfig命令檢視,“ 硬體地址 00:0c:29:cf:7e:1a  。協議欄位有三種值,分別對應IP、 ARP、 RARP。幀末尾是CRC校驗碼

        ARPRARP資料包的長度不夠46位元組,要在後面補填充位。最大值1500稱為乙太網的最大傳輸單元( MTU),不同的網路型別有不同的MTU,如果一個數據包從乙太網路由到撥號鏈路上,資料包長度大於撥號鏈路的MTU了,則

需要對資料包進行分片( fragmentation。ifconfig檢視“ MTU:1500”。MTU這個概念指資料幀中有效載荷的最大長度,不包括幀首部的長度。

2資料報格式

        在網路通訊時,源主機的應用程式知道目的主機的IP地址和埠號,卻不知道目的主機的硬體地址,而資料包首先是被網絡卡接收到再去處理上層協議的,如果接收到的資料包的硬體地址與本機不符,則直接丟棄。因此在通訊前必須獲得目的主機的硬體地址。 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為乙太網,協議型別指要轉換的地址型別,

0x0800IP地址,後面兩個地址長度對於乙太網地址和IP地址分別為64(位元組),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地址)長度為4op0x0001表示請求目的主機的MAC地址,源主機MAC地址為00:05:5d:61:58:a8,源主機IP地址為c0 a8 00 37192.168.0.55),目的主機MAC地址全0待填寫,目的主機IP地址為c0 a8 00 02192.168.0.2)。

由於乙太網規定最小資料長度為46位元組, ARP幀長度只有28位元組,因此有18位元組填充位,填充位的內容沒有定義,與具體實現相關。

應答幀如下:

乙太網首部

0000: 00 05 5d 61 58 a8 00 05 5d a1 b8 40 08 06

ARP0000: 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地址)長度為4op0x0002表示應答,源主機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位元組的整數倍。對於IPv44位版本欄位是44位首部長度的數值是以4位元組為單位的,最小值為5,也就是說首部長度最小是4x5=20位元組,也就是不帶任何選項的IP首部,4位能表示的最大值是15,也就是說首部長度最大是60位元組。8TOS欄位有3個位用來指定IP資料報的優先順序(目前已經廢棄不用),還有4個位表示可選的服務型別(最小延遲、最大呑吐量、最大可靠性、最小成本),還有一個位總是0。總長度是整個資料報(包括IP首部和IPpayload)的位元組數。每傳一個IP資料報,16位的標識加1,可用於分片和重新組裝資料報。3位標誌和13位片偏移用於分片。 TTLTime to live)是這樣用的:源主機為資料包設定一個生存時間,比如64,每過一個路由器就把該值減1,如果減到0就表示路由已經太長了仍然找不到目的主機的網路,就丟棄該包,因此這個生存時間的單位不是秒,而是跳(hop)。協議欄位指示上層協議是TCPUDPICMP還是IGMP。然後是校驗和,只校驗IP首部,資料的校驗由更高層協議負責。IPv4IP地址長度為32位。

4、IP地址

        IPv4IP地址長度為4位元組,通常採用點分十進位制表示法(dotted decimal representation)例如0xc0a80002表示為192.168.0.2。 Internet被各種路由器和閘道器裝置分隔成很多網段,為了標識不同的網段,需要把32位的IP地址劃分成網路號和主機號兩部分,網路號相同的各主機位於同一網段,相互間可以直接通訊,網路號不同的主機之間通訊則需要通過路由器轉發。

A類 0.0.0.0127.255.255.255

B類 128.0.0.0191.255.255.255

C類 192.0.0.0223.255.255.255

D類 224.0.0.0239.255.255.255

E類 240.0.0.0247.255.255.255

        一個A類網路可容納的地址數量最大,一個B類網路的地址數量是65536,一個C類網路的地址數量是256。 D類地址用作多播地址, E類地址保留未用。

        網路號和主機號的劃分需要用一個額外的子網掩碼(subnet mask)來表示,而不能由IP地址本身的數值決定,也就是說,網路號和主機號的劃分與這個IP地址是A類、 B類還是C類無關,因此稱為Classless的。這樣,多個子網就可以彙總(summarize)成一個Internet上的網路,例如,有8個站點都申請了C類網路,本來網路號是24位的,但是這8個站點通過同一個ISPInternet 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.1loopback是系統中一種特殊的網路裝置,如果傳送資料包的目的地址是環回地址,或者與本機其它網路裝置的IP地址相同,則資料包不會發送到網路介質上,而是通過環回裝置再發回給上層協議和應用程式,主要用於測試。