前言
從前一篇文章,我們也知道大概的網絡相關知識,網絡這個系列文章就從底層往頂層講解,本篇文章就來接觸一下網絡底層的相關知識
。
概述網絡中的數據遞交
當用戶發送數據時,將數據向下交給傳輸層,這是處于應用層的操作,應用層
可以通過調用傳輸層的接口來編寫特定的應用程序,并且TCP/IP
協議棧一般也會包含一些簡單的應用協議如 Telnet
遠程登錄、FTP
文件傳輸、SMTP
郵件傳輸協議等,這些協議有自己的首部——APP首部
。傳輸層
會在接收到上層協議的數據前面加上傳輸層
首部(此處以TCP
協議為例,圖的傳輸層
首部為TCP首部
。當然傳輸層
協議還有UDP
協議),傳輸層會向下交給網絡層
。同樣地,網絡層
會在數據前面加上網絡層首部(如IP
首部),然后網絡層
再將數據向下交給鏈路層
,數據鏈路層
會對數據進行最后一次封裝,即在數據前面加上數據鏈路層
首部(此處使用以太網接口為例),然后將數據交給網卡
。最后,網卡
將數據轉換成物理鏈路上的電平信號,數據就這樣被發送到了網絡中。數據的發送過程,可以概括為TCP/IP的各層協議對數據進行封裝的過程;
當設備的網卡接收到某個數據包后,它會將其放置在網卡的接收緩存中,并告知TCP/IP
協議棧內核。然后TCP/IP
協議棧內核就開始工作了,它會將數據包從接收緩存中取出,并逐層解析數據包中的協議首部信息,并最終將數據
交給某個應用程序。數據的接收過程與發送過程正好相反,可以概括為TCP/IP的各層協議對數據進行解析的過程。
各層協議封裝
鏈路層
以太網
關于以太網的理論我就不介紹了,因為這些理論太多了,有興趣可以自己去網上查看。
鏈路與數據鏈路
我們在這里要明確一下, “鏈路”和“數據鏈路”并不是一回事。
所謂鏈路
就是從一個結點到相鄰結點的一段物理線路(有線或無線)這是實實在在看得見的,比如我們的網線,而中間沒有任何其他的交換結點。 在進行數據通信時, 兩臺計算機之間的通信路徑往往要經過許多段這樣的鏈路。
數據鏈路
則是另一個概念。 這是因為當需要在一條線路上傳送數據時, 除了必須
有一條物理線路外,還必須有一些必要的協議來控制這些數據的傳輸,這就是我們TCP/IP
協議棧要做的事情。 把這些TCP/IP
協議棧加到鏈路上,就構成了數據鏈路。
一般我們所說的鏈路層
指的都是數據鏈路
。下文均采用鏈路層
表示。
LwIP中的“鏈路層”
我們知道,網絡接口(如以太網接口)是硬件接口,(提示:網絡接口又可以稱之為網卡,為了統一,下文均采用網卡表示網絡接口),LwIP是軟件,那么怎么讓硬件與軟件無縫連接起來呢?
而且,網卡又有多種多樣,怎么能讓LwIP
使用同樣的軟件程序能兼容不同的硬件呢?
因此LwIP
使用一個數據結構——netif
來描述一個網卡,由于網卡是直接與硬件打交道的,硬件不同則處理基本是不同的,比如網卡的有各種各樣的芯片,所以必須由我們自己
提供最底層接口函數,LwIP
提供統一的接口,比如網卡的初始化,網卡的收發數據,當LwIP
底層得到了網絡的數據之后,才會經過層層傳入內核中去處理;同理,當應用層需要發送一個數據包的時候,也是講數據包層層往下遞交,然后也需要調用網卡的發送函數
,將數據發送到網絡中,這樣子才能把數據從硬件接口到軟件內核無縫連接起來。因此LwIP移植的關鍵是底層的移植,而很多人就卡在這里,如果底層的處理不好,那么就會導致各種各樣的問題,比如網卡無縫接收太多數據,導致網速過慢,出現掛掉的現象,時常丟包,或者運行一段時間就導致內存泄漏等等等等亂七八糟的問題。
簡單來說,netif
是LwIP
抽象出來的網卡描述符,它擁有描述設備中的不同網卡,一個設備至少與一個網卡,才能與網絡進行通訊,LwIP
協議棧可以使用多個不同的接口,而源碼中的ethernetif.c
文件則提供了netif
訪問各種不同的網卡,每個網卡有不同的實現方式,我們呢一般只需要修改ethernetif.c
文件就行了,但是本篇文章不講移植。(此處用LwIP協議棧講解,本系列教程均基于LwIP
)
舉個例子:我們可以理解將整個網絡的數據傳輸理解為物流,那么網卡就是不同的運輸工具,我們可以選擇汽車、飛機、輪船等運輸工具,不同的運輸工具速度是不一樣的,但是對于一個物流公司而言,可能同時存在很多種運輸的工具,這就需要物流公司去記錄這些運輸工具,當有一個包裹需要通過飛機運輸出去,那么物流公司就會將這個包裹通過飛機發送出去,這就好比我們的網卡,需要哪個網卡發送或者接收網絡數據的時候,就會讓對應的網卡去工作。(可能不太貼切)
MAC地址簡介
MAC地址(英語:Media Access Control Address),直譯為媒體訪問控制地址,也稱為局域網地址(LAN Address),以太網地址(Ethernet Address)或物理地址(Physical Address),它是一個用來確認網絡設備位置的地址。在OSI模型中,第三層網絡層負責IP地址,第二層數據鏈接層則負責MAC地址。MAC地址用于在網絡中唯一標示一個網卡,一臺設備若有一或多個網卡,則每個網卡都需要并會有一個唯一的MAC地址。(引用來自維基百科)
可能我們做計算機相關專業的人,多多少少都會知道IP地址
、MAC地址
(也稱之為鏈路層地址)。在前一篇文章說了,想要不同主機之間進行通訊,那么就必須有IP地址,那現在為什么我們在鏈路層都需要地址呢?
事實上,并不是主機或路由器具有鏈路層地址,而是它們的網卡
具有鏈路層地址。因此,一個主機擁有多少個網卡,那么它就有多少個MAC地址
。MAC地址實際上就是網卡地址或網卡標識符。當某臺計算機使用某塊網卡后,網卡上的標識符就成為該計算機的MAC地址。MAC地址長度為6
字節(48bit
),其前3
個字節表示組織唯一標志符(Organizationally Unique Identifier,即OUI
),由IEEE
的注冊管理機構給不同廠家分配的代碼,以區分不同的廠家,后3個字節由廠家自行分配,稱為擴展標識符。同一個廠家生產的網卡中MAC地址后24
位是不同的。
IP地址與MAC地址的關系
TCP/IP
協議有自己的IP地址,IP地址(IPv4)是一個32
位的IP地址,網絡層發送數據包只需要知道目標主機IP地址即可,而以網卡發送數據則必須知道對方的硬件MAC
地址,同時IP
地址的分配與硬件MAC
地址是沒有關系的,為了讓網絡層只需要知道IP地址
就可以完成通信工作,那就需要有一個協議將IP
地址映射成為對應的MAC
地址,此外還需要考慮IP
地址可能是動態的,非常靈活,使用靜態的映射方法是行不通的,所以ARP
協議就提供優質的地址動態解析服務,讓32
位的IP
地址能映射
成為48位的MAC地址
,讓上層應用與底層完全分離開,這樣子在上層應用就能靈活使用IP
地址作為標識,進行通信。
簡單來說,就是計算機中會維護一個ARP緩存表,這個表記錄著IP地址與MAC地址的映射關系,我們可以通過在電腦的控制臺通過arp -a指令查看一下我們自己計算機的ARP緩存表:
ARP緩存表
我給大家舉個例子,IP地址就相當于你家的地址,MAC就是你的身份證,你的身份證是全國唯一的,這沒疑問吧,但你的地址是可以跟別人重疊的(你家人也是住在你家)。當你寄快遞的時候,快遞員要確認這個快遞是從你家寄出去的,是你本人親自寄出去的,同樣的,當你收快遞的時候,快遞員也是先電話找到你,然后必須是你本人才能拿到快遞,再拿回家。(可能也不貼切,將就理解一下)## 數據幀
鏈路層的主體部分是網卡中實現的,在發送的數據幀的時候,協議棧取得由高層傳遞過來的數據報(注意,數據幀與數據報不是一個東西,數據報是形容網絡層及其以上的報文,而數據幀一般形容鏈路層的數據,是一幀一幀的,也是鏈路層的服務——數據成幀),在鏈路層中封裝該數據報,也就是填寫數據幀的各個字段,然后遵循鏈路接入協議將該幀數據進行傳輸;在接收端,控制器接收了整個數據幀,抽取出網絡層的數據報,往上層傳遞。
下面來看看以太網幀:
以太網幀
事實上,前同步碼與幀開始符字段不能算是真正的以太網幀數據結構,他們是在網卡發送的時候自動添加進去的,為了數據的準確傳輸。
以太網幀以一個7字節的前同步碼開始。該前同步碼的值都是規定為10101010
;而后緊接著一個字節的幀開始符,其值是10101011
。前同步碼字段的作用是實現物理層幀輸入輸出的同步,而幀開始符表示著以太網數據幀的開始,剩下的5個字段才是真正的以太網數據幀結構。
目標MAC地址(6字節) :這個字段包含目標網卡的MAC地址,當一個網卡收到一個以太網數據幀,如果該數據幀的目標地址是網卡自身的MAC地址或者是MAC廣播地址,它都將該幀的數據字段的內容傳遞給網絡層;如果它收到了具有任何其他MAC地址的幀,則將該數據幀丟棄。
源MAC地址(6字節) :自身的MAC地址。
類型字段(2字節) :類型字段允許以太網復用多種網絡層協議。我們只需要記住主機能夠使用除了IP協議
以外的其他網絡層協議。事實上,一臺給定的主機可以支持多種網絡層協議,以對不同的應用采用不同的協議。因此,當以太網幀到達網卡中,網卡需要知道它應該將數據字段的內容傳遞給哪個網絡層協議。比如如有IP
協議、ARP
協議等。
注意了:當這個字段的值小于1518時,它表示后面數據字段的數據長度,當大于1518的時候才表示遞交給哪個協議。
數據字段(46~1500字節) :這個字段承載了IP數據報。以太網的最大傳輸單元(MTU)是1500字節。這意味著如果IP數據報超過了1500
字節,則主機必須將該數據報分片(IPv4
支持數據報分片,而IPv6
不支持)。數據字段的最小長度是46字節,這意味著如果IP數據報小于46
字節,數據報必須被填充到46
字節。當采用填充時,傳遞到網絡層的數據包括IP數據報和填充部分,網絡層使用IP
數據報首部中的長度字段來去除填充部分。
CRC(4字節) :CRC字段包含了以太網的差錯校驗信息。
補充 :所有的以太網都向網絡層提供不可靠的無連接服務,在接收到不對的以太網幀時,或者CRC
校驗不通過時,主機將直接丟棄以太網幀,并不會告知發送的一方。
-
傳輸協議
+關注
關注
0文章
78瀏覽量
11451 -
應用層
+關注
關注
0文章
46瀏覽量
11507 -
傳輸層
+關注
關注
0文章
29瀏覽量
10902
發布評論請先 登錄
相關推薦
評論