1、MTU編程
以太網和IEEE 802.3對數據幀的長度都有限制,其最大值分別是1500和1492字節,將這個限制稱做最大傳輸單元(MTU,Maximum Transmission Unit)。若是IP層有一個數據報要傳,並且數據的長度比鏈路層的MTU還大,那麼IP層就要進行分片(Fragmentation),把數據報分紅若干片,這樣每一片都小於MTU。當網絡上的兩臺主機互相進行通訊時,兩臺主機之間要通過多個網絡,每一個網絡的鏈路層可能有不一樣的MTU,其中兩臺通訊主機路徑中的最小MTU被稱做路徑MTU,Internet上標準MTU爲576B(TCP)、512B(UDP)。如何測算路徑MTU? 以下所述:緩存
For IPv4 packets, Path MTU Discovery works by setting the Don't Fragment (DF) option bit in the IP headers of outgoing packets. Then, any device along the path whose MTU is smaller than the packet will drop it, and send back an Internet Control Message Protocol (ICMP) Fragmentation Needed (Type 3, Code 4) message containing its MTU, allowing the source host to reduce its Path MTU appropriately. The process is repeated until the MTU is small enough to traverse the entire path without fragmentation.
網絡
下圖是返回的ICMP 錯誤的報文,包含路由器的MTU。app
2、以太網幀格式函數
其中的源地址和目的地址是指網卡的硬件地址(也叫MAC地址),長度是48位,是在網卡出廠時固化的。用ifconfig命令看一下,「HWaddr 00:15:F2:14:9E:3F」部分就是硬件地址。協議字段有三種值,分別對應IP、ARP、RARP。幀末尾是CRC校驗碼。
以太網幀中的數據長度規定最小46字節,最大1500字節,ARP和RARP數據包的長度不夠46字節,要在後面補填充位。ifconfig命令的輸出中也有「MTU:1500」。注意,MTU這個概念指數據幀中有效載荷的最大長度,不包括幀首部的長度。
學習
3、ARP(address resolution protocol)spa
在網絡通信時,源主機的應用程序知道目的主機的IP地址和端口號,殊不知道目的主機的硬件地址,而數據包首先是被網卡接收到再去處理上層協議的,若是接收到的數據包的硬件地址與本機不符,則直接丟棄。所以在通信前必須得到目的主機的硬件地址。ARP協議就起到這個做用。源主機發出ARP請求,詢問「IP地址是10.0.0.1的主機的硬件地址是多少」,並將這個請求廣播到本地網段(以太網幀首部的硬件地址填FF:FF:FF:FF:FF:FF表示廣播),目的主機接收到廣播的ARP請求,發現其中的IP地址與本機相符,則發送一個ARP應答數據包給源主機,將本身的硬件地址填寫在應答包中。以下圖所示.net
每臺主機都維護一個ARP緩存表,能夠用arp -a命令查看。緩存表中的表項有過時時間(通常爲20分鐘),若是20分鐘內沒有再次使用某個表項,則該表項失效,下次還要發ARP請求來得到目的主機的硬件地址。
blog
注意到源MAC地址、目的MAC地址在以太網首部和ARP請求中各出現一次,對於鏈路層爲以太網的狀況是多餘的,但若是鏈路層是其它類型的網絡則有多是必要的。硬件類型指鏈路層網絡類型,1爲以太網,協議類型指要轉換的地址類型,0x0800爲IP地址,後面兩個地址長度對於以太網地址和IP地址分別爲6和4(字節),op字段爲1表示ARP請求,op字段爲2表示ARP應答。
ip
地址解析協議的處理流程以下圖:
4、RARP(Reverse Address Resolution Protocol)
跟ARP相反的協議,主要用於獲取無盤工做站的ip地址,以下圖所示,再也不贅述。
5、ICMP(Internet Control Message Protocol)
ICMP協議用於傳遞差錯信息、時間、回顯、網絡信息等控制數據,以下圖所示。
ICMP報文是封裝在IP數據報文中進行傳輸的,以下圖所示。
具體的類型和代碼見下圖。
6、利用ARP和ICMP協議解釋ping程序
先看下面的流程圖,再來解釋。
步驟a:應用程序ping會判斷髮送的是主機名仍是IP地址,若是是主機名會調用函數gethostbyname()解析主機B,將主機名轉換成一個32位的IP地址。這個過程叫作DNS域名解析。
步驟b:ping程序向目的IP地址發送一個ICMP的ECHO包
步驟c:將目標主機的IP地址轉換爲48位硬件地址,在局域網內發送ARP請求廣播,查找主機B的硬件地址。
步驟d:主機B的ARP協議層接收到主機A的ARP請求後,將本機的硬件地址填充到應答包,發送ARP應答到主機A。
步驟e:發送ICMP數據包到主機B。
步驟f:主機B接收到主機A的ICMP包,發送響應包。
步驟g:主機A接收到主機B的ICMP包響應包。
參考:
《Linux C 編程一站式學習》
《TCP/IP詳解 卷一》