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

移植ubuntu core 16.04(ubuntu-base)到i.MX6ULL開發(fā)板
AD16版本為什么底層不可以鋪銅
無線傳感器網(wǎng)絡(luò)底層平臺由什么組成?
基于近距離無線技術(shù)的家電集中控制方法

基于GPRS無線散狀控制網(wǎng)絡(luò)的底層設(shè)計(下位機(jī)篇)
能有效提高實(shí)時性和可靠性的嵌入式實(shí)時操作系統(tǒng)微機(jī)保護(hù)裝置設(shè)計

華為路由WS5200評測 值不值得買
區(qū)塊鏈技術(shù)和加密貨幣的意義是什么
Chainlink的去中心化預(yù)言機(jī)網(wǎng)絡(luò)底層設(shè)計方案

分布式存儲加持區(qū)塊鏈 數(shù)據(jù)將追溯、監(jiān)控、存儲、共享
CAN網(wǎng)絡(luò)底層的重要知識點(diǎn)介紹
【原創(chuàng)】網(wǎng)絡(luò)安全篇--網(wǎng)絡(luò)底層嗅探掃描基礎(chǔ)

四種數(shù)據(jù)中心網(wǎng)絡(luò)虛擬化技術(shù)對比

評論