共用方式為


診斷封包損失

每當網路封包未到達其預定目的地時,就會發生封包遺失。 某些封包遺失是正常的,而且不一定會導致較高層級的網路問題。 在其他時候,封包遺失可能會降低效能,並導致應用程式開發介面(API)或應用程式失敗。

擷取和診斷封包遺失

進行封包遺失調查的第一個步驟是擷取 封包監視器 (Pktmon) 追蹤,通常是使用 pktmon 命令行工作流程。 Pktmon 可以擷取封包追蹤、將本機封包遺失歸因於特定原因和程序代碼位置,以及收集封包遺失統計數據。 結合 Wireshark 分析通訊協定層級行為時,pktmon追蹤就足以識別許多封包遺失案例的根本原因。

如果 pktmon 診斷不確定,則可以分別針對客戶端和伺服器案例使用 netsh.exe trace start scenario=InternetClientnetsh.exe trace start scenario=InternetServer 命令來擷取更詳盡的元件層級追蹤。 擷取事件之後,請使用 netsh.exe trace stop 命令停止追蹤。 這些元件層級的追蹤訊號雜亂且不清晰,但通常在本機封包被丟棄前後包含額外的上下文。 針對遠端遺失,可能表示本機系統推斷發生了封包遺失的情況。 追蹤可以使用 netsh.exe trace convert nettrace.etl 轉換成文字,開啟於 Windows Performance Analyzer,或搭配任何其他 Windows 事件追蹤 (ETW) 工具使用。

如果懷疑網路介面卡 (NIC) 是封包遺失的原因,您可以透過任何 性能計數器 介面或 Get-NetAdapterStatistics Cmdlet 來監視其捨棄計數器。

本機封包遺失的常見原因

本機封包遺失是完全可觀察的,而且可能是由各種內部和外部因素所造成。

  • 地方政策

    檢查軟體可能預設丟棄來自遠端機器的封包,例如,當 Windows 防火牆拒絕入站連線嘗試時。 系統上的網路安全性或反惡意代碼軟體也可能造成這些問題。

  • 低資源

    如果系統或套接字用盡資源無法處理封包,該封包會被丟棄。 資源限制的範例包括系統上的實體記憶體和連接埠的傳送或接收緩衝區。 根據資源限制,這些事件可能只持續數微秒,例如,當系統的 CPU 無法快速回應完整接收緩衝區時。

  • ARP 或 ND 失敗

    如果封包的下一個躍點未響應位址解析協定(ARP)或鄰居探索(ND)要求,則本機系統會丟棄送往該下一個躍點的封包。 如果超過 ARP 或 ND 封包佇列限制,則 ARP 或 ND 進程期間也會卸載封包。 ARP 或 ND 封包本身通常不會在本機卸除,且屬於遠端封包遺失類別。

  • 無路由

    如果網路層找不到通往目的地的有效路由,封包可能會被丟棄。

  • 無效的封包

    如果封包標頭無效,封包可能會被丟棄。 例如,封包標頭包含無效的總和檢查碼或域值。

遠端封包遺失的常見原因

遠端封包在被丟棄時,本機電腦無法直接觀察到封包遺失。 因特網協議通訊(IP)及其下方大部分層都是「盡力而為」且不可靠。 端 對端原則 要求當需要對封包遺失進行復原時,端點必須在其通訊協定中實作可靠性。 在某些情況下,網路或遠端端點會傳送通訊協定特定的錯誤訊息,指出遺失的原因。 不過,在許多情況下,封包遺失的唯一跡象是缺乏回應。

  • 擁塞

    遺失型壅塞控制演算法會更快且更快速地傳送,直到封包遺失為止。 如果演算法推斷遺失是因為 壅塞所造成,它會暫時降低以回應方式傳送的速率。 這些演算法需要少量的損失,才能提供意見反應訊號。

  • 遠程政策

    網路或遠端電腦可能會根據自己的政策丟棄封包。

  • 無法連線到目的地

    如果遠端電腦沒有系結至遠端埠的套接字、遠端電腦已離線,或網路找不到遠端電腦的路徑,就可能會發生這種情況。

  • Session失敗

    如果網路(包括具狀態網路位址轉換(NAT)、防火牆和負載平衡器),或遠端電腦重設,或最近未收到封包,則其會話內容可能會過期,並丟棄後續封包。

  • 最大傳輸單位 (MTU) 下降

    如果封包大小超過傳送至遠端電腦的網路路徑上最大傳輸單元(MTU),可能會因為 MTU 削減而產生錯誤:需要網際網路控制訊息協定(ICMP)分段或封包過大。

封包監視器追蹤的範例

執行以下命令:

pktmon.exe start -c
pktmon.exe stop
pktmon.exe etl2txt PktMon.etl

產生的 PktMon.txt 檔案包含類似下列幾行:

[30]0000.0000::<DateTime> [Microsoft-Windows-PktMon] Drop: PktGroupId 8444249301423149, PktNumber 1, Appearance 0, Direction Rx , Type IP , Component 49, Filter 1, DropReason INET: transport endpoint was not found , DropLocation 0xE000460A, OriginalSize 402, LoggedSize 148
       Drop: ip: 192.168.5.88.50005 > 192.168.5.68.50005: UDP, length 374

此資訊表示目的地為埠 50005 的輸入 UDP 封包已丟棄,因為沒有本機套接字連接到此埠。

網路命令列追蹤的範例

執行以下命令:

netsh.exe trace start scenario=InternetClient
netsh.exe trace stop
netsh.exe trace convert NetTrace.etl

產生的 NetTrace.txt 檔案包含類似下列幾行:

[30]0000.0000::<DateTime> [Microsoft-Windows-TCPIP]TCPIP: Network layer (Protocol 1(ICMP), AddressFamily = 2(IPV4)) dropped 1 packet(s) on interface 13. SourceAddress = 192.168.5.68. DestAddress = 192.168.5.88. Reason = 9(Inspection drop). Direction = 0(Send). NBL = 0xFFFFE189BEAF3AC0.

此資訊顯示由於 Windows 篩選平臺 (WFP) 的檢查,輸出 ICMP 封包被丟棄。 糧食計劃署的下一個步驟是遵循 WFP 實況操作疑難解答步驟

在另一種情況下,遠端端點無法確認先前傳送的 TCP 區段,隨著時間推移會觸發本地重新傳輸計時器,導致 TCP 重新傳送一些可能遺失的資料。

[31]0000.0000::<DateTime> [Microsoft-Windows-TCPIP]TCP: Connection 0xFFFFE189BD811AA0 0(RetransmitTimer) timer has expired.
[31]0000.0000::<DateTime> [Microsoft-Windows-TCPIP]TCP: Tail Loss Probe Event Connection = 0xFFFFE189BD811AA0, Event = 2(TimerFired).
[31]0000.0000::<DateTime> [Microsoft-Windows-TCPIP]TCP: Tail Loss Probe Send Connection = 0xFFFFE189BD811AA0 SndUna = 2526318360, SndMax = 2526321759, SendAvailable = 3399, TailProbeSeq = 2526320299, TailProbeLast = 2526321759, ControlsToSend = 0, ThFlags = 16.
[31]0000.0000::<DateTime> [Microsoft-Windows-TCPIP]TCP: connection 0xFFFFE189BD811AA0 (local=192.168.5.68:55330 remote=6.6.0.27:443): TCP send event, SeqNo = 2526320299, BytesSent = 1460, CWnd = 18538, SndWnd = 197632, SRtt = 17631, RttVar = 4947, RTO = 300, RcvWnd = 65535, PacingRate = 0, State = 4(EstablishedState), CongestionState = 0, SndUna = 2526318360, SndMax = 2526321759, RecoveryMax = 0, RcvBufSet = 0(FALSE), MaxRcvBuf = 65535.
[31]0000.0000::<DateTime> [Microsoft-Windows-TCPIP]TCP: connection = 0xFFFFE189BD811AA0 send tracker marked a transmit as rexmit. Start = 2526320299, End = 2526321759, Timestamp = 467744252, InFlightCount = 2, SackedBytes = 0, BytesInFlight = 4859.
[31]0000.0000::<DateTime> [Microsoft-Windows-TCPIP]TCP: Connection 0xFFFFE189BD811AA0 0(RetransmitTimer) timer started. Scheduled to expire in 300 ms. Processor 31: LastInterruptTime 305324952689 100-ns ticks; LastMicrosecondCount 30532515324 msec

詳細資訊