Linux C高级编程——网络编程之以太网(2)
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地址和端口號,卻不知道目的主機的硬件地址,而數據包首先是被網卡接收到再去處理上層協議的,如果接收到的數據包的硬件地址與本機不符,則直接丟棄。因此在通訊前必須獲得目的主機的硬件地址。?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地址相同,則數據包不會發送到網絡介質上,而是通過環回設備再發回給上層協議和應用程序,主要用于測試。
總結
以上是生活随笔為你收集整理的Linux C高级编程——网络编程之以太网(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国大学MOOC 视频字幕获取及处理方法
- 下一篇: fnt 图字原理