以太網的數據鏈路層
在數據鏈路層,以太網負責以太網編址,這通常稱為硬件編址或 MAC 編址。以太網還負責把來自網絡層的分組封裝成幀。
以太網編址
以太網編址使用固化在每個以太網網卡(NIC)中的 MAC (Media Access Control,介質訪問控制)地址。MAC (硬件)地址長 48 位,采用十六進制格式。
OUI(Organizationally Unique Identifier,組織唯一標識符)是由 IEEE 分配給組織(廠商)的,它包含 24 位,而組織給其生產的每個網卡都分配一個唯一的全局管理地址,該地址長 24 位。查看上圖您會發現最高位是 I/G(Individual/Group) 位:如果它的值為 0,我們就可以認為相應的地址為某台設備的 MAC 地址,很可能出現在MAC 報頭的源地址部分;如果它的值為 1,我們就可以認為相應的地址要么是以太網中的廣播地址或組播地址,要么是令牌環和 FDDI 中的廣播地址或功能地址。
接下來是 G/L 位(全局/本地位,也稱為 U/L 位,其中 U 表示 universal):如果這一位為 0,則表示相應的地址為全局地址,由 IEEE 分配;如果為 1,則表示相應的地址為本地管理地址。在以太網地址中,右邊 24 位為本地管理(制造商分配)的編碼,特定制造商在生產第一個網卡時,通常將這部分設置為 24 個 0,然后遞增,直到 24 個1。
以太網幀
數據鏈路層負責將比特合並成字節,再將字節封裝成幀(frame)。在數據鏈路層我們使用幀封裝來自網絡層的分組,以便通過特定類型的介質進行傳輸。
以太網工作站的職責是,使用 MAC 幀格式彼此傳遞數據幀。它利用 CRC(Cyclic Redundancy Check,循環冗余校驗)提供錯誤檢測功能,記住,僅僅是檢測,不是糾錯。
下圖說明了 802.3 幀和以太網幀的格式:
注意:使用一種幀封裝另一種幀稱為隧道技術。
下面詳細介紹各個字段。
前導碼
交替的 0 和 1,在每個分組的開頭提供 5MHz 的時鍾信號,讓接收設備能夠跟蹤到來的比特流。
幀起始位置分隔符(SFD)/同步
前導碼為 7Byte,而 SFD(同步)為 1Byte。SFD 的值為 10101011,其中最后兩個1讓接收方能夠識別中間的 0 和 1 交替模式,進而同步並檢查到數據開頭。
目標地址 (DA)
包含一個 48 位的值,且 LSB(Least Significant Bit,最低有效位)優先。接收方根據 DA 判斷到來的分組是否是發送給特定節點的。目標地址可以是單播地址、廣播地址或組播 MAC 地址。廣播地址全為 1(十六進制格式下全為F),廣播發送給所有設備,而組播只發送給網絡中一組類似的節點。
源地址(SA)
SA 是一個 48 位的 MAC 地址,用於標識傳輸設備,也使用 LSB 優先格式。在 SA 字段中,不能包含廣播地址或組播地址。
長度或類型
802.3 幀使用長度字段,而 Ethernet_II 幀使用類型字段標識網絡層協議。802.3 不能標識上層協議,只能用於專用 LAN,如 IPX。
數據
這是網絡層傳遞給數據鏈路層的幀,其長度為 46-1500 Bytes。
幀校驗序列(FCS)
FCS 字段位於,用於存儲 CRC(Cyclic Redundancy Check,循環冗余校驗)結果的幀的幀尾。CRC 是一種數學算法,創建每個幀時都將運行它。作為接收方的主機收到幀並運行 CRC 時,其結果必須相同,否則接收方將認為發生了錯誤,進而將幀丟棄。
數據封裝
主機通過網絡將數據傳輸給另一台設備時,數據將經歷封裝:OSI 模型的每一層都使用協議信息將數據包裝起來。每層都只與其在接收設備上的對等層通信。
為了通信和交換信息,每層都使用 PDU(Protocaol Data Unit,協議數據單元)。PDU 包含在每一層給數據添加的控制信息。這些控制信息通常被添加在數據字段前面的報頭中,但也可能被添加在報尾中。
OSI 模型每一層都對數據進行封裝來形成 PDU,PDU 的名稱隨報頭提供的信息而異。這些 PDU 信息僅在接收設備的對等層被讀取,然后剝離,然后數據被交給下一層。
下圖顯示了各層的 PDU 及每層添加的控制信息:
該圖說明了如何對上層用戶數據進行轉換,以便通過網絡傳輸。然后,數據被交給傳輸層,而傳輸層通過發送同步分組來建立到接收設備的虛電路。接下來,數據流被分割成小塊,傳輸層報頭被創建並放在數據字段前面的報頭中,此時的數據塊稱為數據段(一種PDU)。我們可以對每個數據段進行排序,以便在接收端按發送順序重組數據流。
接下來,每個數據段都交給網絡層進行編址,並在互聯網絡中路由。為讓每個數據段前往正確的網絡,這里使用邏輯地址(如IP地址)。對於來自傳輸層的數據段,網絡層協議給它添加一個控制報頭,這樣就生成了分組或數據報。在接收主機上,傳輸層和網絡層協同工作以重建數據流,但它們不負責將 PDU 放到本地網段上--這是將信息傳輸給路由器或主機的唯一途徑。
數據鏈路層負責接收來自網絡層的分組,並將其放到網絡介質(電纜或無線)上。數據鏈路層將每個分組封裝成幀,其中幀頭包含源主機的硬件地址。如果目標設備在遠程網絡中,則幀將被發送給路由器,以便在互聯網絡中路由。到達目標網絡后,新的正被用來將分組傳輸到目標主機。
要將幀放到網絡上,首先必須將其轉換為數字信號。幀是有 1 和 0 組成的邏輯編組,網絡層負責將這些 0 和 1 編碼成數字信號,供本地網絡中的設備讀取。接收設備將同步數字信號,並從中提取 1 和 0 (解碼)。接下來,設備將重組幀,運行 CRC,並將結果與幀中 FCS 字段的值進行比較。如果它們相同,設備從幀中提取分組,並將其他部分丟棄,這個過程稱為拆封。分組被交給網絡層,而網絡層將檢查分組地址。如果地址匹配,數據段被從分組中提取出來,而其他部分將被丟棄。數據段將在傳輸層處理,而后者負責重建數據流,然后向發送方確認,指出接收方收到了所有信息。然后傳輸層將數據流交給上層應用程序。
在發送端,數據封裝的過程大致如下:
1. 用戶信息被轉換為數據,以便通過網絡進行傳輸。
2. 數據被轉換為數據段,發送主機和接收主機之間建立一條可靠的連接。
3. 數據段被轉換為分組或數據報,連接地址被添加在報頭中,以便能夠在互聯網絡中路由分組。
4. 分組或數據報被轉換為幀,以便在本地網絡中測試。硬件(以太網)地址被用於唯一標識本地網段中的主機。
5. 幀被轉換為比特,並使用數據編碼方法和時鍾同步方案。
下圖解釋了數據封裝的過程:
傳輸層使用端口號標識虛電路和上層進程,如下圖所示:
使用面向連接的協議(即TCP)時,傳輸層將數據流轉換為數據段,並創建一條虛電路以建立可靠的會話。接下來,它對每個數據段進行編號,並使用確認和流量控制。如果你使用的是 TCP,虛電路將由源端口號和目標端口號已經源 IP 地址和目標 IP 地址(稱為套接字)標識。主機只能使用不小於 1024 的端口號。目標端口號標識了上層進程(應用程序),在接收主機可靠地重建數據流后,數據流將被交給進程(應用程序)。
下面讓我們回到數據封裝的過程。
給數據塊添加傳輸層報頭信息后,便形成了數據段;隨后,數據段和目標 IP 地址一起唄交給網絡層。(目標IP地址是隨數據流一起由上層交給傳輸層的,它是由上層使用名稱解析方法(可能是DNS)發現的。)
網絡層在每個數據段的前面添加報頭和邏輯地址(IP地址)。給數據段添加報頭后,形成的 PDU 為分組。分組包含一個協議字段,該字段指出了數據段來自何方(UDP或TCP),這樣當分組到達接收主機后,傳輸層便能夠將數據段交給正確的協議。
網絡層負責獲悉目標硬件地址(這種地址指出了分組應發送到本地網絡的什么地方),為此,它使用 ARP(Address Resolution Protocol,地址解析協議)。網絡層查看目標 IP 地址,並將其與主機的 IP 地址和子網掩碼進行比較。如果比較表明分組是前往本地主機的,則 ARP 請求被用於請求該主機的硬件地址;如果分組是前往遠程主機的,IP 將獲悉默認網關(路由器)的 IP 地址。
接下來,網絡層將分組向下傳遞給數據鏈路層,一同傳遞的還有本地主機或默認網關的硬件地址。數據鏈路層在分組前面添加一個報頭,這樣數據塊將變成真(之所以稱其為幀,是因為同時給分組添加了報頭和報尾,使其類似於書檔)。幀包含一個以太網類型(Ether-Type)字段,它指出了分組來自哪種網絡層協議。現在,將對幀運行CRC 校驗,並將結果放在幀尾的 FCS 字段中。
至此,可以用每次 1 比特的方式將幀向下傳遞給網絡層了,而網絡層將使用比特定時規則(bit timing rule)將數據編碼成數字信號。網段中的每台設備都將同步時鍾,從數字信號中提取 1 和 0,並重建幀。重建幀后,設備運行 CRC,以確保幀是正確的。如果一切順利,主機將檢查目標 MAC 地址和目標 IP 地址,以檢查這個幀是不是發送給它的。