天天看點

Linux C進階程式設計——網絡程式設計之以太網(2)

Linux網絡程式設計——以太網

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

1、以太網幀格式

Linux C進階程式設計——網絡程式設計之以太網(2)

        源位址和目的位址是指網卡的硬體位址(也叫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資料報格式:

Linux C進階程式設計——網絡程式設計之以太網(2)

        注意到源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、資料報格式

Linux C進階程式設計——網絡程式設計之以太網(2)

        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位址劃分成網絡号和主機号兩部分。網絡号同樣的各主機位于同一網段,互相間能夠直接通信,網絡号不同的主機之間通信則須要通過路由器轉發。

Linux C進階程式設計——網絡程式設計之以太網(2)

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

Linux C進階程式設計——網絡程式設計之以太網(2)

子網2:

Linux C進階程式設計——網絡程式設計之以太網(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位址同樣,則資料包不會發送到網絡媒體上,而是通過環回裝置再發回給上層協定和應用程式。主要用于測試。