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的負荷,而且也是不符合標準應用的!
網絡卡如何傳送和接收資料報
網絡卡如何傳送資料報 文章出處 http blog.21ic.org user1 1066 archives 2007 40803.html ip報文可以看作乙個包。linux網絡卡驅動程式,將ip包新增14位元組的mac包頭,構成mac包。mac包中含有傳送端和接收端的mac位址資訊。既然是驅動程...
網絡卡傳送與接收資料報
網絡卡如何傳送資料報 ip報文可以看作乙個包。linux網絡卡驅動程式,將ip包新增14位元組的mac包頭,構成mac包。mac包中含有傳送端和接收端的mac位址資訊。既然是驅動程式建立的mac包頭資訊,當然可以隨便輸入位址資訊的。主機偽裝就是這麼實現的。驅動程式將mac包拷貝到網絡卡晶元內部的緩衝...
Python選擇網絡卡發包及接收資料報
當一台計算機上有多個網絡卡時,需要選擇對應ip位址的網絡卡進行傳送資料報或者接受資料報。1 選擇網絡卡發包 應用scapy plface conf.route.route 0 為對應網絡卡網路中存在裝置的ip位址。不能是需要傳送資料報的網絡卡的ip位址 會報 result too large pkt...