windows USB 設備驅動開發-發送MDL和錯誤恢復

?USB 驅動程序可以在堆棧中使用鏈接式 MDL 功能發送數據,并且USB驅動的客戶端可以將傳輸緩沖區作為 MDL 結構鏈發送。

大多數 USB 主機控制器要求傳輸緩沖區幾乎是連續的。 幾乎連續意味著緩沖區可以開始和結束頁中的任意位置,但緩沖區的其余部分必須在頁面邊界上開始和結束。 許多 USB 客戶端驅動程序都能夠滿足該要求。 但是,對于某些客戶端驅動程序,特別是那些需要向緩沖區添加或刪除其他數據的客戶端驅動程序,為傳輸緩沖區分配幾乎連續的內存是不可取的。

例如,假設網絡堆棧包含三個驅動程序、一個網絡協議驅動程序、一個中間驅動程序和一個微型端口驅動程序。 協議驅動程序啟動傳輸并將數據包發送到堆棧中的下一個驅動程序:中間驅動程序。 中間驅動程序希望向數據包添加單獨的內存塊中包含的自定義標頭 。 中間驅動程序將該標頭和收到的數據包發送到堆棧中的下一個驅動程序:微型端口驅動程序。 微型端口驅動程序與 USB 驅動程序堆棧接口,因此必須準備幾乎連續的傳輸緩沖區。 若要創建此類緩沖區,微型端口驅動程序會分配一個大型緩沖區,添加自定義標頭,然后復制有效負載。 由于有效負載通常很大,因此復制整個有效負載可能會對性能產生重大影響。

使用鏈式MDL

客戶端驅動程序可以通過將傳輸緩沖區作為 內存描述符列表 鏈 (MDL) 來克服這種性能影響。 Windows 8 中的新 USB 驅動程序堆棧能夠接受鏈接的 MDL (從客戶端驅動程序查看 MDL) 。 通過提供鏈接的 MDL,客戶端驅動程序可以引用內存中的不連續頁面,而不是執行無關的復制操作。 此功能消除了對緩沖區的數量、大小和對齊方式的限制,從而允許在物理內存中對傳輸緩沖區進行分段。

若要使用鏈接的 MDL,客戶端驅動程序必須檢測 Windows 加載的基礎 USB 驅動程序堆棧是否支持該功能,然后以正確的順序生成 MDL 鏈。

鏈式 MDL 功能僅支持批量傳輸、常時等傳輸和中斷傳輸。 在查詢鏈接 MDL 功能之前,請確保客戶端驅動程序具有 USBD 句柄,用于向 USB 驅動程序堆棧注冊驅動程序。 若要創建 USBD 句柄,請調用 USBD_CreateHandle。通常,客戶端驅動程序在其 AddDevice 例程中創建 USBD 句柄。

可以在客戶端驅動程序的 IRP_MN_START_DEVICE 處理程序中查詢鏈接的 MDL 功能,或稍后隨時查詢。 客戶端驅動程序不得在其 AddDevice 例程中查詢此功能:

1.調用 USBD_QueryUsbCapability 例程以確定 USB 驅動程序堆棧是否支持鏈接的 MDL 功能。 若要查詢該功能,請將 UsbCapabilityChainedMdls 指定為 GUID。 將 OutputBuffer 參數設置為 NULL, 將 OutputBufferSize 參數設置為 0;

2.檢查 USBD_QueryUsbCapability 返回的 NTSTATUS 值并評估結果。 如果例程成功完成,則支持鏈接的 MDL 功能。 任何其他值表示不支持該功能;

3.創建 MDL 鏈。 每個 MDL 都有一個指向另一個 MDL 的 Next 指針;

驅動程序可以通過手動設置 Next 指針來生成鏈 MDL;

在前面的示例中,協議驅動程序將數據包作為 MDL 發送。 中間驅動程序可以創建另一個 MDL,該 MDL 使用標頭數據引用內存塊。 若要創建鏈,中間驅動程序可以將標頭 MDL 的 Next 指針指向從協議驅動程序接收的 MDL。 然后,中間驅動程序可以將兩個 MDL 的鏈轉發到微型端口驅動程序,該驅動程序為請求的 URB 中的鏈接 MDL 提供引用,并將請求提交到 USB 驅動程序堆棧。?

4.為使用鏈接的 MDL 的 I/O 請求生成 URB 時,請將關聯 URB 結構的 TransferBufferMDL 成員 ((如 _URB_BULK_OR_INTERRUPT_TRANSFER 或 _URB_ISOCH_TRANSFER) )設置為鏈中的第一個 MDL,并將 TransferBufferLength 設置為要傳輸的總字節數。 數據可以跨 MDL 鏈中的多個 MDL 條目。

在 Windows 8 中添加了兩種新類型的 URB 函數,使客戶端驅動程序能夠使用鏈接的 MDL 進行數據傳輸。 如果要使用此功能,請確保將 URB 標頭的 Function 成員設置為以下 URB 函數之一:

  • URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER_USING_CHAINED_MDL
  • URB_FUNCTION_ISOCH_TRANSFER_USING_CHAINED_MDL
如何從 USB 管道錯誤中恢復

在數據傳輸到 USB 管道失敗時,USB設備可以嘗試某些步驟來處理這個異常信息。 本文中所述的機制涵蓋批量、中斷和常時常量管道上的中止、重置和循環端口操作。

USB 客戶端驅動程序通過將控制傳輸發送到默認端點來與其設備通信;數據傳輸到設備的批量、中斷和常時等量端點。 有時,這些傳輸可能會由于各種原因(例如端點中的停止條件)而失敗。 如果傳輸失敗,則在清除錯誤條件之前,關聯的管道無法處理請求。

對于控制傳輸,USB 驅動程序堆棧會自動清除錯誤條件。 對于數據傳輸,客戶端必須采取適當的步驟從錯誤條件中恢復。 數據傳輸失敗時,USB 驅動程序堆棧會通過失敗的 USBD 狀態代碼向客戶端驅動程序報告錯誤。 然后,驅動程序可以根據狀態代碼提供錯誤恢復機制。

下面是有關通過這些操作進行錯誤恢復的準則:

  • 重置 USB 管道
  • 重置設備連接到的 USB 端口
  • 循環 USB 端口以重新枚舉客戶端驅動程序的設備堆棧

若要清除錯誤條件,請從重置管道操作開始,并僅在必要時執行更復雜的操作,例如 reset-port 和 cycle-port。

關于協調各種恢復機制:

客戶端驅動程序必須協調不同的恢復操作,并確保在給定時間僅使用一種方法。 例如,假設某個設備有兩個端點:批量端點和中斷端點。 向設備發送一些數據傳輸請求后,驅動程序會注意到請求在批量管道上失敗。 若要從這些錯誤中恢復,驅動程序會重置批量管道。 但是,該操作無法解決傳輸錯誤,并且批量傳輸將繼續失敗。 因此,驅動程序發出重置 USB 端口的請求。 同時,傳輸開始在中斷管道上失敗,然后重置設備請求。 若要從中斷傳輸失敗中恢復,驅動程序將在中斷管道上發出重置管道請求。 如果這兩個操作未協調,驅動程序可以同時啟動兩個重置設備操作,因為兩個管道都失敗。 這些同時操作可能會出現問題。

客戶端驅動程序必須確保在給定的時間,驅動程序只執行一個重置端口或周期端口操作。 在這些操作期間,不應在任何管道上進行重置管道操作,并且驅動程序不得發出新的重置管道請求。

先決條件
  • 客戶端驅動程序必須已創建框架 USB 目標設備對象。如果使用 Microsoft Visual Studio Professional 2012 隨附的 USB 模板,則模板代碼將執行這些任務。 模板代碼會獲取目標設備對象的句柄并將其存儲在設備上下文中。KMDF 客戶端驅動程序必須調用 WdfUsbTargetDeviceCreateWithParameters 方法來獲取 WDFUSBDEVICE 句柄;?
  • 客戶端驅動程序必須具有框架目標管道對象的句柄;?
步驟 1:確定錯誤條件的原因

客戶端驅動程序使用 USB 請求塊 (URB) 啟動數據傳輸。 請求完成后,USB 驅動程序堆棧將返回 USBD 狀態代碼,指示傳輸是成功還是失敗。 在失敗時,USBD 代碼指示失敗的原因。

  • 如果通過調用 WdfUsbTargetDeviceSendUrbSynchronously 方法提交了 URB,請在方法返回后檢查 URB 結構的 Hdr.Status 成員。
  • 如果通過調用 WdfRequestSend 方法異步提交了 URB,檢查EVT_WDF_REQUEST_COMPLETION_ROUTINE中的 URB 狀態。 Params 參數指向WDF_REQUEST_COMPLETION_PARAMS結構。 若要檢查 USBD 狀態代碼,請檢查 Usb-UsbdStatus> 成員。 有關代碼的信息,請參閱 USBD_STATUS。

傳輸失敗可能是由設備錯誤引起的,例如USBD_STATUS_STALL_PID或USBD_STATUS_BABBLE_DETECTED。 它們也可能是由于主機控制器報告的錯誤(例如USBD_STATUS_XACT_ERROR)導致的。

步驟 2:確定設備是否已連接到端口

在發出重置管道或設備的任何請求之前,請確保設備已連接。 可以通過調用 WdfUsbTargetDeviceIsConnectedSynchronous 方法來確定設備的連接狀態。

步驟 3:取消到管道的所有掛起傳輸

在發送任何重置管道或端口的請求之前,請取消對管道的所有掛起的傳輸請求,USB 驅動程序堆棧尚未完成這些請求。 可以通過以下方式之一取消請求:

  • 通過調用 WdfIoTargetStop 方法停止 I/O 目標:

若要停止 I/O 目標,請首先通過調用 WdfUsbTargetPipeGetIoTarget 方法獲取與框架管道對象關聯的 WDFIOTARGET 句柄 。 通過使用 句柄,調用 WdfIoTargetStop。 在調用中,將操作設置為 WdfIoTargetCancelSentIo (see WDF_IO_TARGET_SENT_IO_ACTION) ** 指示框架取消 USB 驅動程序堆棧尚未完成的所有請求。 對于已完成的請求,客戶端驅動程序必須等待框架調用其完成回調。

  • 發送中止管道請求。 可以通過調用以下方法之一來發送請求:

調用 WdfUsbTargetPipeAbortSynchronously 方法。

調用是同步的,僅在取消所有掛起的請求后返回。 WdfUsbTargetPipeAbortSynchronously 采用可選的 Request 參數。 建議將 WDFREQUEST 句柄傳遞給預先分配的框架請求對象。 參數允許框架使用指定的請求對象,而不是驅動程序無法訪問的內部請求對象。 此參數值可確保 WdfUsbTargetPipeAbortSynchronously 不會因內存不足而失敗。

調用 WdfUsbTargetPipeFormatRequestForAbort 方法以格式化 abort-pipe 請求的請求對象,然后通過調用 WdfRequestSend 方法發送請求。

如果驅動程序異步發送請求,則必須指定指向驅動程序實現的驅動程序 EVT_WDF_REQUEST_COMPLETION_ROUTINE 的指針。 若要指定指針,請調用 WdfRequestSetCompletionRoutine 方法。

驅動程序可以通過將 WDF_REQUEST_SEND_OPTION_SYNCHRONOUS 指定為 WdfRequestSend 中的請求選項之一來同步發送請求。 如果以同步方式發送請求,請改為調用 WdfUsbTargetPipeAbortSynchronously 。

步驟 4:重置 USB 管道

通過重置管道啟動錯誤恢復。 可以通過調用以下方法之一來發送重置管道請求:

  • 調用 WdfUsbTargetPipeResetSynchronously 以同步發送重置管道請求;
  • 調用 WdfUsbTargetPipeFormatRequestForReset 方法以格式化重置管道請求的請求對象,然后通過調用 WdfRequestSend 方法發送請求。 這些調用類似于中止管道請求的調用,如步驟 3 中所述;

在重置管道操作完成之前,不要發送任何新的傳輸請求。

重置管道請求清除設備和主機控制器硬件中的錯誤條件。 為了清除設備錯誤,USB 驅動程序堆棧使用ENDPOINT_HALT功能選擇器向設備發送CLEAR_FEATURE控制請求。 請求的接收方是與管道關聯的端點。 如果錯誤條件發生在常時常量管道上,則驅動程序堆棧不會執行任何操作來清除設備,因為發生錯誤時,會自動清除常量端點。

為了清除主機控制器錯誤,驅動程序堆棧會清除管道的 HALT 狀態,并將管道的數據開關重置為 0。

步驟 5:重置 USB 端口

如果重置管道操作未清除錯誤條件,并且數據傳輸繼續失敗,請發送重置端口請求。

  • 1.取消到設備的所有傳輸:為此,請枚舉當前配置中的所有管道,并取消為每個管道計劃的掛起請求;
  • 2.停止設備的 I/O 目標:調用 WdfUsbTargetDeviceGetIoTarget 方法以獲取與框架目標設備對象關聯的 WDFIOTARGET 句柄。 然后,調用 WdfIoTargetStop 并指定 WDFIOTARGET 句柄。 在調用中,將操作設置為 WdfIoTargetCancelSentIo (WDF_IO_TARGET_SENT_IO_ACTION) ;
  • 3.通過調用 WdfUsbTargetDeviceResetPortSynchronously 方法發送重置端口請求;

重置端口操作會導致設備在 USB 總線上重新枚舉。 USB 驅動程序堆棧在 枚舉后保留設備配置。 客戶端驅動程序可以使用以前獲取的管道句柄,因為驅動程序堆棧可確保現有管道句柄保持有效。

無法重置復合設備的單個功能。 對于復合設備,當特定函數的客戶端驅動程序發送重置端口請求時,將重置整個設備。 如果 USB 設備保持狀態,該重置端口請求可能會影響其他功能的客戶端驅動程序。 因此,客戶端驅動程序必須在重置端口之前嘗試重置管道。

步驟 6:循環使用 USB 端口

循環端口操作類似于拔出電源并插回端口的設備,不同之處在于設備未以電氣方式斷開連接。 設備在軟件中斷開連接并重新連接。 此操作會導致設備重置和枚舉。 因此,PnP 管理器會重新生成設備節點。

如果重置端口操作未清除錯誤條件,并且數據傳輸繼續失敗,請發送周期端口請求。

1.取消到設備的所有傳輸。 請確保取消針對當前配置中每個管道計劃的掛起請求 ;

2.停止設備的 I/O 目標:調用 WdfUsbTargetDeviceGetIoTarget 方法以獲取與框架目標設備對象關聯的 WDFIOTARGET 句柄。 然后,調用 WdfIoTargetStop 并指定 WDFIOTARGET 句柄。 在調用中,將操作設置為 WdfIoTargetCancelSentIo (WDF_IO_TARGET_SENT_IO_ACTION) ;

3.通過調用以下方法之一發送循環端口請求:

  • 調用 WdfUsbTargetDeviceCyclePortSynchronously 以同步發送周期端口請求。
  • 調用 WdfUsbTargetDeviceFormatRequestForCyclePort 方法以格式化循環端口請求的請求對象,然后通過調用 WdfRequestSend 方法發送請求。 這些調用類似于中止管道請求的調用,如步驟 3 中所述;

客戶端驅動程序只能在周期端口請求完成后向設備發送傳輸請求。 這是因為在 USB 驅動程序堆棧處理周期端口請求時刪除了設備節點。

循環端口請求會導致設備重新枚舉。 USB 驅動程序堆棧通知 PnP 管理器設備已斷開連接。 PnP 管理器會拆掉與客戶端驅動程序關聯的設備堆棧。 驅動程序堆棧重置設備,在 USB 總線上重新枚舉該設備,并通知 PnP 管理器設備已連接。 然后,PnP 管理器為 USB 設備重新生成設備堆棧。

由于循環端口操作,如果應用程序注冊了此類通知,則任何對設備打開句柄的應用程序都會獲得設備刪除通知 。 作為響應,應用程序可能會向用戶報告設備斷開連接的消息。 因為它會影響用戶體驗,因此僅當其他恢復機制無法解決錯誤條件時,客戶端驅動程序才應選擇周期端口請求。

與步驟 6) 中所述的重置端口操作 類似,對于復合設備,循環端口操作會影響整個設備,而不是設備的各個功能驅動模塊。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44044.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44044.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44044.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

53-4 內網代理6 - frp搭建三層代理

前提:53-3 內網代理5 - frp搭建二級代理-CSDN博客 三級網絡代理 在辦公區入侵后,發現需要進一步滲透核心區網絡(192.168.60.0/24),并登錄域控制器的遠程桌面。使用FRP在EDMZ區、辦公區與核心區之間建立三級網絡的SOCKS5代理,以便訪問核心區的域控制器。 VPS上的FRP服…

海豚調度器(DolphinScheduler)修改時區為東八區

海豚調度器設置了定時,執行的時間和設置時間不同,后來排查發現是時區問題。可以用下面方法和步驟來修改: 修改DolphinScheduler服務器時區 登錄服務器:首先,通過SSH或其他方式登錄到運行DolphinScheduler服務的服務器…

壓縮感知3——重構算法正交匹配追蹤算法

算法流程 問題的實質是&#xff1a;AX Y 求解&#xff08;A是M維&#xff0c;Y是N維且N>>M并且稀疏度K<M&#xff09;明顯X有無窮多解&#xff0c;重構過程是M次采樣得到的采樣值升維的過程。OMP算法的具體步驟&#xff1a;(1)用X表示信號&#xff0c;初始化殘差e0 …

計算給定數字的階乘

1 問題 計算給定數字的階乘. 2 方法 使用while循環。使用for循環。使用函數。 通過實驗、實踐等證明提出的方法是有效的&#xff0c;是能夠解決開頭提出的問題。 代碼清單 1 使用while循環numberint(input(請輸入一個數字:))factorial1i1while i<number: factorialfactor…

【論文速讀】| JADE:用于大語言模型的基于語言學的安全評估平臺

本次分享論文&#xff1a;JADE : A Linguistics-based Safety Evaluation Platform for Large Language Models 基本信息 原文作者&#xff1a;Mi Zhang, Xudong Pan, Min Yang 作者單位&#xff1a;Whitzard-AI, System Software and Security Lab Fudan University 關鍵…

AWS Glue 與 Amazon Redshift 的安全通信配置

1. 引言 在 AWS 環境中,確保服務間的安全通信至關重要。本文將探討 AWS Glue 與 Amazon Redshift 之間的安全通信配置,特別是為什么需要特定的安全組設置,以及如何正確實施這些配置。 2. 背景 AWS Glue:全托管的 ETL(提取、轉換、加載)服務Amazon Redshift:快速、完全…

嵌入式底層開發 入門學習路線

入門嵌入式底層開發的學習路線可以分為幾個關鍵階段&#xff0c;下面是一個較為系統的學習路徑&#xff0c;它涵蓋了從基礎知識到實際項目應用的全過程。 1. 基礎知識 計算機科學基礎&#xff1a;理解數據結構、算法、操作系統等基本概念。電子和電路理論&#xff1a;學習數字…

『大模型筆記』GraphRAG:用于復雜數據發現的新工具現已在GitHub上發布

GraphRAG:用于復雜數據發現的新工具現已在GitHub上發布 文章目錄 一. GraphRAG:用于復雜數據發現的新工具現已在GitHub上發布1. 評估和結果2. 研究見解和未來方向二. 參考文獻一. GraphRAG:用于復雜數據發現的新工具現已在GitHub上發布 下載 GraphRAG今年早些時候,我們介紹…

倒計時 2 周!CommunityOverCode Asia 2024 IoT Community 專題部分

CommunityOverCode 是 Apache 軟件基金會&#xff08;ASF&#xff09;的官方全球系列大會&#xff0c;其前身為 ApacheCon。自 1998 年以來&#xff0c;在 ASF 成立之前&#xff0c;ApacheCon 已經吸引了各個層次的參與者&#xff0c;在 300 多個 Apache 項目及其不同的社區中探…

【Unix】SunOS/Oracle Solaris系統介紹

一.SunOS系統介紹 SunOS 是由 Sun Microsystems 開發的 Unix 操作系統。它最初是為 Sun 的 SPARC 架構計算機設計的&#xff0c;后來也支持了 Intel x86 架構。SunOS 是基于 UNIX System V 4.1 版本&#xff0c;并且隨著時間的發展&#xff0c;SunOS 經歷了多個版本迭代&#…

百度文心4.0 Turbo開放,領跑國內AI大模型賽道!

百度文心4.0 Turbo開放&#xff0c;領跑國內AI大模型賽道&#xff01; 前言 文心一言大模型 就在7月5日&#xff0c;在2024世界人工智能大會 (WAIC) 上&#xff0c;百度副總裁謝廣軍宣布文心大模型4.0 Turbo正式向企業客戶全面開放&#xff01;這一舉動直接引發了業界的關注。那…

springboot中@bean注解的創建和使用

bean的創建順序 在Spring Boot中&#xff0c;當一個配置類&#xff08;使用Configuration注解的類&#xff09;中定義了多個bean時&#xff0c;這些bean的創建順序并不完全由它們在類中的聲明順序決定。Spring框架在創建和管理bean時&#xff0c;遵循了復雜的依賴注入和生命周…

qt connect 函數詳解

在 Qt 框架中&#xff0c;connect 函數是一個非常重要的機制&#xff0c;用于在信號&#xff08;signal&#xff09;和槽&#xff08;slot&#xff09;之間建立連接。信號和槽是 Qt 中用于對象間通信的一種機制。當某個特定事件發生時&#xff0c;一個對象可以發射&#xff08;…

短鏈接day3

短鏈接分組模塊 新增短鏈接分組 在新增之前&#xff0c;需要判斷gid是否是唯一的。 //檢查gid是否已存在&#xff0c;保證gid唯一public boolean hasGid(String gid){LambdaQueryWrapper<GroupDO> queryWrapper Wrappers.lambdaQuery(GroupDO.class).eq(GroupDO::getG…

在Windows中使用開源高性能編輯器Zed(持續更新)

簡介 “Zed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter. It’s also open source.” “Zed是一款高性能的支持多人協作的代碼編輯器&#xff0c;由Atom和Tree-sitter的創建者開發。它也是開源的。” Zed主打“高性能”&…

為什么選擇開放式耳機?悠律凝聲環開放式耳機體驗

開放式耳機相對于其他傳統耳機優勢有以下幾點&#xff1a; 配戴舒適性更好&#xff1a;由于開放式耳機的背面是開放的&#xff0c;空氣可以自由流動&#xff0c;減少了耳朵的悶熱感。長時間佩戴時更加舒適。&#xff0c;而傳統入耳式耳機一般都是塞入耳道&#xff0c;久戴會脹…

Java中的 this 關鍵字是什么意思? this() 又是什么?

目錄 問題問題一&#xff1a;什么是this關鍵字?問題二&#xff1a;什么是this()&#xff1f; 問題 問題一&#xff1a;什么是this關鍵字? 定義&#xff1a;this 代表當前對象。這個定義比較抽象&#xff0c;舉例來回答。 思考一個問題&#xff1a;如果沒有 this 會怎樣&…

鴻蒙開發學習筆記2

一、class 類 類是用于 創建對象模版。同時類聲明也會引入一個 新類型&#xff0c;可定義其 實例屬性、方法 和 構造函數。 // 類名 首字母大寫&#xff08;規范&#xff09; class 類名 {// 1、實例屬性&#xff08;字段&#xff09;// 2、構造函數// 3、方法 }1、屬性&…

IO練習網絡爬蟲獲取

題目&#xff1a; 具體文字內容如下&#xff1a; 練習&#xff1a;制造假數據 需求&#xff1a;制造假數據是開發中的一項重要能力&#xff0c;從各個網站爬取數據是其中的一種方法。 獲取姓氏示例及鏈接&#xff1a; 趙錢孫李 周吳鄭王 鏈接&#xff1a;百家姓_詩詞_百度漢…

如何追蹤ping連接中的所有路由器的數量和IP

如何快速判斷ping連接經過的路由器個數和IP&#xff1f; 方法一&#xff1a; ping命令會返回一個TTL&#xff0c;TTL&#xff08;Time To Live&#xff09;存活時間&#xff0c;一般初始值為64&#xff0c;每經過一個路由器就減一&#xff0c;當TTL為0時丟棄網絡包&#xff0…