網絡卡傳送與接收資料報

2021-06-03 00:01:55 字數 1339 閱讀 2542

網絡卡如何傳送資料報:

ip報文可以看作乙個包。

linux網絡卡驅動程式,將ip包新增14位元組的mac包頭,構成mac包。

mac包中含有傳送端和接收端的mac位址資訊。既然是驅動程式建立的mac包頭資訊,當然可以隨便輸入位址資訊的。主機偽裝就是這麼實現的。

驅動程式將mac包拷貝到網絡卡晶元內部的緩衝區,就算完事了。有網絡卡晶元接手處理。

網絡卡晶元對mac包,再次封裝成物理幀,新增頭部同步資訊和crc校驗。然後丟到網線上,就完成乙個ip報文的傳送。所有掛接到本網線的網絡卡都可以看到該物理幀。

網絡卡如何接收資料報:

網線可以看作乙個高速公路,物理幀也就是輛汽車,網絡卡呢,或許是個加油站吧。

從這個角度講,汽車和加油站沒有絕對的關係,所有汽車都可以進入該加油站。

正常情況:

網線上的物理幀首先被網絡卡晶元獲取,網絡卡晶元會檢查物理幀的crc,保證完整性。其次,網絡卡晶元將物理幀頭去掉,得到mac包。

網絡卡晶元檢查mac包內的目的mac位址資訊,和本網絡卡的mac位址是否一致?不一致,拋棄。

網絡卡晶元將mac幀拷貝到網絡卡的內部緩衝區,觸發中斷。

驅動程式通過中斷,將mac包拷貝到系統中,構建sk_buff。告訴上層。

上層去掉mac包頭,得到需要的ip包。

過程中,網絡卡晶元對物理幀進行了mac匹配過濾。這樣做可以減小系統負荷。試想一下,若網絡卡晶元對所有的mac幀不加判斷的直接提供給驅動,讓cpu判決會是什麼樣子呢?當匯流排上資料繁忙,cpu將浪費大部分時間去判斷該mac包是否是自己需要的,效率低下。

不正常模式(混聽):

網線上的物理幀首先被網絡卡晶元獲取,網絡卡晶元會檢查物理幀的crc,保證完整性。其次,網絡卡晶元將物理幀頭去掉,得到mac包。網絡卡晶元發現自己當前被配置為混聽模式,就不對mac包過濾。網絡卡晶元將mac幀拷貝到網絡卡內部的緩衝區,觸發中斷。驅動程式通過中斷,將mac包拷貝到系統中,構建sk_buff,告訴上層。上層去掉mac包頭,得到需要的ip包。顯然,這裡的ip包並不一定是發給自己的。

驅動的問題:

網絡卡到底能不能接收其他mac包,完全取決於網絡卡晶元中rcr( receive control register )配置。驅動程式是決定網絡卡能否工作於混聽模式的橋梁。混聽模式會加重cpu的負荷,而且也是不符合標準應用的!

所有的車輛都要從加油站穿過,(有些都不加油),加油站工作人員的任務量就可想而知。

當然也有例外,有些程式不通過驅動,也可以直接訪問網絡卡晶元rcr達到設定混聽模式。

所謂 條條大路通香港,就是這個道理:)沒有絕對的。

網絡卡如何傳送和接收資料報

網絡卡如何傳送資料報 文章出處 http blog.21ic.org user1 1066 archives 2007 40803.html ip報文可以看作乙個包。linux網絡卡驅動程式,將ip包新增14位元組的mac包頭,構成mac包。mac包中含有傳送端和接收端的mac位址資訊。既然是驅動程...

傳送與接收float資料

在寫硬體程式的時候,經常遇到要通過串列埠 can匯流排等傳送float型別的資料。由於mcu是以單個位元組為單位來傳送資料的,所以在遇到要傳送float,double這種占用多個位元組的資料型別的資料時,如果對指標的概念理解不到位,就很難實現。以float型別的資料為例,我的方法如下 傳送 void...

網絡卡如何接收資料報

ip報文可以看作乙個包。linux網絡卡驅動程式,將ip包新增14位元組的mac包頭,構成mac包。mac包中含有傳送端和接收端的mac位址資訊。既然是驅動程式建立的mac包頭資訊,當然可以隨便輸入位址資訊的,主機偽裝就是這麼實現的。驅動程式將mac包拷貝到網絡卡晶元內部的快取區,就算完事了。有網絡...