網絡卡如何傳送資料報:
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包拷貝到網絡卡晶元內部的快取區,就算完事了。有網絡...