網路裝置在接收到來自網路中其它主機的資料報,或本地環迴介面的資料報之後,交給協議棧的netif_rx函式,該函式首先要為收到的這個skb打上當前的時間戳(skb->tstamp成員),這個時間戳表示該資料到達的時間,它不是必選的,可以通過套接字選項
so_timestamp
將其開啟,該選項開啟時間戳時,會將鏈路層的全域性變數netstamp_needed加1,netif_rx在檢查到這個變數不為零時,為skb打上時間戳。
softnet_data是型別為struct softnet_data結構體的全域性變數,每個cpu定義乙個,它是鏈路層的資料接收佇列,該結構體的定義如下:
struct softnet_data
;input_pkt_queue是skb的佇列,接收到的skb全部進入該佇列等待後續處理,netif_rx首先檢查該佇列當前的長度input_pkt_queue.qlen,即當前排在佇列中的skb的數量,當數量超過netdev_max_backlog的值時,直接丟棄新收到的包,netdev_max_backlog在協議棧中定義的預設值為1000,可以通過檔案/proc/sys/net/core/netdev_max_backlog進行修改。如果當前佇列長度未達到上限,把新收到的skb加到這個佇列中,在加到佇列之前,要確保對這個佇列的接收處理已啟動,如果當前隊列為空,則要先呼叫netif_rx_schedule啟動佇列的處理,再把skb加到佇列中。需要注意的是softnet_data是cpu繫結的,但不是網路裝置繫結的,多個網路裝置收到的資料報可能存放在同乙個佇列中待處理。
netif_rx_schedule函式的主要作用是觸發乙個軟中斷net_rx_softirq,使中斷處理函式net_rx_action處理接收佇列中的資料報。net_rx_action開始時會記錄下系統的當前時間,然後進行處理,當處理時間持續超過1個時鐘嘀嗒時,它會再觸發乙個中斷net_rx_softirq,並退出,在下乙個中斷中繼續處理。一次中斷處理除了時間上有限制,處理的資料報的數量上也有限制。
softnet_data的成員poll_list中存放的是成員backlog_dev的位址,由netif_rx_schedule存入,backlog_dev的成員poll在系統初始化時被指向函式process_backlog,net_rx_action呼叫該函式進行實際的資料報處理,process_backlog把資料報從input_pkt_queue佇列中取出,傳給netif_receive_skb,由netif_receive_skb傳給相應的網路層接收函式。process_backlog的處理時間也有1個時鐘嘀嗒的限制,同時一次處理的資料報的數量不得超過backlog_dev->quota和netdev_budget兩個值中較小的那個值,backlog_dev->quota由netif_rx_schedule初始化為全域性變數weight_p的值,預設為64,netdev_budget預設為300。從**可以看出,process_backlog一次處理最大資料報數量為64,而net_rx_action為300。weight_p和netdev_budget這兩個值分別可以在檔案/proc/sys/net/core/dev_weight和/proc/sys/net/core/netdev_budget中檢視和修改。
netif_receive_skb是鏈路層接收資料報的最後一站。它根據註冊在全域性陣列ptype_all和ptype_base裡的網路層資料報型別,把資料報遞交給不同的網路層協議的接收函式(inet域中主要是ip_rcv和arp_rcv)。
資料鏈路協議
鏈路就是一條無源的從點到點的物理線路段,中間沒有任何其他的交換節點。在進行通訊時,兩台計算機的通訊通路是由多條鏈路串接而成的。當需要在一條鏈路上通訊時,除了需要物理鏈路,還需要一些規程來控制這些資料的傳輸,把實現這些規程的硬體和軟體加到鏈路上,就構成了資料鏈路 差錯控制自動請求重發又可以稱為後向糾錯...
Linux 資料鏈路訪問
緬懷stevens大師。1.師從網際網路。2.linux man 命令 man netlink,man rtnetlink。3.unp v1第29章 原始套介面使得我們可以讀寫核心不處理的ip資料報,而對資料鏈路層訪問則把這種能力進一步擴大 讀寫任何型別的資料鏈路幀,而不僅僅是ip資料報。訪問資料鏈...
資料鏈路相關技術
mac位址是用來識別資料鏈路中相互連線的節點。大多數裝置都是根據ieee802.3規範使用mac位址。第3 24位 有ieee管理的廠商識別碼,每個廠商都有自己唯一的識別碼。第25 48位 廠商管理的產品識別碼,每個網絡卡都有自己唯一的識別碼。ieee802.3在指定mac位址規範的時候沒有限制資料...