Behandeln von Problemen mit der Portauslastung
Gilt für: Windows 10
TCP- und UDP-Protokolle funktionieren basierend auf Portnummern, die zum Herstellen der Verbindung verwendet werden. Jede Anwendung oder ein Dienst, die eine TCP/UDP-Verbindung herstellen muss, benötigt einen Port auf ihrer Seite.
Es gibt zwei Arten von Ports:
- Kurzlebige Ports, bei denen es sich um dynamische Ports handelt, sind die Ports, die jeder Computer standardmäßig für eine ausgehende Verbindung herstellen muss.
- Bekannte Ports sind die definierten Ports für eine bestimmte Anwendung oder einen bestimmten Dienst. Beispielsweise befindet sich der Dateiserverdienst an Port 445, HTTPS ist 443, HTTP ist 80 und RPC ist 135. Benutzerdefinierte Anwendungen verfügen auch über eigene definierte Portnummern.
Wenn eine Verbindung mit einer Anwendung oder einem Dienst hergestellt wird, verwenden Clientgeräte einen kurzlebigen Port vom Gerät, um eine Verbindung mit einem bekannten Port herzustellen, der für diese Anwendung oder diesen Dienst definiert ist. Ein Browser auf einem Clientcomputer verwendet einen kurzlebigen Port, um https://www.microsoft.com
eine Verbindung mit Port 443 herzustellen.
In einem Szenario, in dem derselbe Browser viele Verbindungen mit mehreren Websites herstellt, wird für jede neue Verbindung, die der Browser versucht, ein kurzlebiger Port verwendet. Nach einiger Zeit werden Sie feststellen, dass die Verbindungen fehlschlagen, und eine hohe Wahrscheinlichkeit für diesen Fehler besteht darin, dass der Browser alle verfügbaren Ports verwendet hat, um Verbindungen außerhalb herzustellen, und jeder neue Versuch, eine Verbindung herzustellen, fehlschlägt, da keine weiteren Ports verfügbar sind. Wenn alle Ports auf einem Computer verwendet werden, wird dies als Portauslastung bezeichnet.
Dynamischer Standardportbereich für TCP/IP
Um die Empfehlungen der Internet Assigned Numbers Authority (IANA) zu erfüllen, hat Microsoft den dynamischen Clientportbereich für ausgehende Verbindungen erhöht. Der neue Standardstartport ist 49152, und der neue Standardendport ist 65535. Dieser Anstieg ist eine Änderung gegenüber der Konfiguration früherer Versionen von Windows, die einen Standardportbereich von 1025 bis 5000 verwendet haben.
Sie können den dynamischen Portbereich auf einem Computer mit den folgenden netsh
Befehlen anzeigen:
-
netsh int ipv4 show dynamicport tcp
-
netsh int ipv4 show dynamicport udp
-
netsh int ipv6 show dynamicport tcp
-
netsh int ipv6 show dynamicport udp
Der Bereich wird für jeden Transport (TCP oder UDP) separat festgelegt. Der Portbereich ist jetzt ein Bereich mit einem Start- und einem Endpunkt. Microsoft-Kunden, die Server bereitstellen, auf denen Windows Server ausgeführt wird, haben möglicherweise Probleme, die sich auf die RPC-Kommunikation zwischen Servern auswirken, wenn Firewalls im internen Netzwerk verwendet werden. In diesen Situationen wird empfohlen, die Firewalls neu zu konfigurieren, um Datenverkehr zwischen Servern im dynamischen Portbereich 49152 bis 65535 zuzulassen. Dieser Bereich ist zusätzlich zu bekannten Ports, die von Diensten und Anwendungen verwendet werden. Oder der Portbereich, der von den Servern verwendet wird, kann auf jedem Server geändert werden. Sie passen diesen Bereich mit dem Befehl netsh wie folgt an. Der obige Befehl legt den dynamischen Portbereich für TCP fest.
netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range
Der Startport ist number, und die Gesamtzahl der Ports ist Bereich. Im Folgenden sind Beispielbefehle aufgeführt:
-
netsh int ipv4 set dynamicport tcp start=10000 num=1000
-
netsh int ipv4 set dynamicport udp start=10000 num=1000
-
netsh int ipv6 set dynamicport tcp start=10000 num=1000
-
netsh int ipv6 set dynamicport udp start=10000 num=1000
Diese Beispielbefehle legen fest, dass der dynamische Portbereich an Port 10000 beginnt und an Port 10999 (1000 Ports) endet. Der Mindestbereich von Ports, der festgelegt werden kann, ist 255. Der minimale Startport, der festgelegt werden kann, ist 1025. Der maximale Endport (basierend auf dem konfigurierten Bereich) darf 65535 nicht überschreiten. Um das Standardverhalten von Windows Server 2003 zu duplizieren, verwenden Sie 1025 als Startport und dann 3976 als Bereich für TCP und UDP. Dieses Verwendungsmuster führt zu einem Startport von 1025 und einem Endport von 5000.
Insbesondere zu ausgehenden Verbindungen, da eingehende Verbindungen keinen kurzlebigen Port zum Akzeptieren von Verbindungen erfordern.
Da bei ausgehenden Verbindungen ein Fehler auftritt, werden viele Instanzen der folgenden Verhaltensweisen angezeigt:
Die Anmeldung beim Computer kann nicht mit Domänenanmeldeinformationen möglich sein, die Anmeldung mit einem lokalen Konto funktioniert jedoch. Bei der Domänenanmeldung müssen Sie den Domänencontroller für die Authentifizierung kontaktieren. Dies ist wiederum eine ausgehende Verbindung. Wenn Sie Anmeldeinformationen zwischenspeichern, funktioniert die Domänenanmeldung möglicherweise weiterhin.
Gruppenrichtlinie Updatefehler:
Auf Dateifreigaben kann nicht zugegriffen werden:
RDP vom betroffenen Server schlägt fehl:
Jede andere Anwendung, die auf dem Computer ausgeführt wird, gibt Fehler aus.
Durch einen Neustart des Servers wird das Problem vorübergehend behoben, aber nach einem bestimmten Zeitraum werden alle Symptome wieder angezeigt.
Wenn Sie vermuten, dass sich der Computer in einem Zustand der Portauslastung befindet:
Versuchen Sie, eine ausgehende Verbindung herzustellen. Greifen Sie auf dem Server/Computer auf eine Remotefreigabe zu, oder versuchen Sie es mit einem RDP zu einem anderen Server oder telnet zu einem Server an einem Port. Wenn bei der ausgehenden Verbindung für alle diese Optionen ein Fehler auftritt, fahren Sie mit dem nächsten Schritt fort.
Öffnen Sie die Ereignisanzeige, und suchen Sie unter den Systemprotokollen nach den Ereignissen, die den aktuellen Zustand eindeutig angeben:
Ereignis-ID 4227
Ereignis-ID 4231
Sammeln Sie eine
netstat -anob
Ausgabe vom Server. Die netstat-Ausgabe zeigt Ihnen eine große Anzahl von Einträgen für TIME_WAIT Zustand für eine einzelne PID an.Nach einem ordnungsgemäßen oder abrupten Schließen einer Sitzung nach einem Zeitraum von vier Minuten (Standard) wird der vom Prozess oder der Anwendung verwendete Port wieder für den verfügbaren Pool freigegeben. Während dieser vier Minuten ist der TCP-Verbindungsstatus TIME_WAIT Zustand. Wenn Sie eine Portauslastung vermuten, kann eine Anwendung oder ein Prozess nicht alle verbrauchten Ports freigeben und verbleibt im TIME_WAIT Zustand.
Möglicherweise werden in derselben Ausgabe auch CLOSE_WAIT Zustandsverbindungen angezeigt. CLOSE_WAIT Zustand ist jedoch ein Zustand, wenn eine Seite des TCP-Peers keine Daten mehr zu senden hat (FIN gesendet), aber Daten vom anderen Ende empfangen kann. Dieser Zustand weist nicht unbedingt auf eine Portauslastung hin.
Hinweis
Wenn sich große Verbindungen in TIME_WAIT Zustand befinden, bedeutet dies nicht immer, dass der Server derzeit keine Ports mehr hat, es sei denn, die ersten beiden Punkte werden überprüft. Viele TIME_WAIT Verbindungen deuten darauf hin, dass der Prozess viele TCP-Verbindungen erstellt und schließlich zu einer Portauslastung führen kann.
Netstat wurde in Windows 10 mit dem Hinzugefügten des
-Q
Schalters aktualisiert, um Ports anzuzeigen, die außerhalb der Zeit als im BOUND-Zustand übergegangen sind. Ein Update für Windows 8.1 und Windows Server 2012 R2 wurde veröffentlicht, das diese Funktionalität enthält. Das PowerShell-CmdletGet-NetTCPConnection
in Windows 10 zeigt auch diese BOUND-Ports an.Bis 10/2016 war netstat ungenau. Korrekturen für netstat, zurückportiert auf 2012 R2, erlaubt Netstat.exe und
Get-NetTcpConnection
die TCP- oder UDP-Portnutzung ordnungsgemäß in Windows Server 2012 R2 zu melden. Weitere Informationen finden Sie unter Windows Server 2012 R2: Hotfixes für kurzlebige Ports.Öffnen Sie eine Eingabeaufforderung im Administratormodus, und führen Sie den folgenden Befehl aus.
Netsh trace start scenario=netconnection capture=yes tracefile=c:\Server.etl
Öffnen Sie die Datei server.etl mit Network Monitor , und wenden Sie im Abschnitt filter den Filter
Wscore_MicrosoftWindowsWinsockAFD.AFD_EVENT_BIND.Status.LENTStatus.Code == 0x209
an. Es sollten Einträge angezeigt werden, die STATUS_TOO_MANY_ADDRESSES. Wenn Sie keine Einträge finden, sind die Ports für den Server immer noch nicht vorhanden. Wenn Sie sie finden, können Sie bestätigen, dass der Server unter Der Portauslastung liegt.
Problembehandlung bei Der Portauslastung
Der Schlüssel besteht darin, zu ermitteln, welcher Prozess oder welche Anwendung alle Ports verwendet. Im Folgenden finden Sie einige der Tools, die Sie verwenden können, um auf einen einzelnen Prozess zu isolieren.
Methode 1
Sehen Sie sich zunächst die netstat-Ausgabe an. Wenn Sie Windows 10 oder Windows Server 2016 verwenden, können Sie den Befehl netstat -anobq
ausführen und nach der Prozess-ID suchen, die die maximale Anzahl von Einträgen als BOUND aufweist. Alternativ können Sie auch den folgenden PowerShell-Befehl ausführen, um den Prozess zu identifizieren:
Get-NetTCPConnection | Group-Object -Property State, OwningProcess | Select -Property Count, Name, @{Name="ProcessName";Expression={(Get-Process -PID ($_.Name.Split(',')[-1].Trim(' '))).Name}}, Group | Sort Count -Descending
Die meisten Portverluste werden durch Benutzermodusprozesse verursacht, die die Ports nicht ordnungsgemäß schließen, wenn ein Fehler aufgetreten ist. Auf Benutzermodusebene sind Ports (eigentlich Sockets) Handles. Sowohl TaskManager als auch ProcessExplorer können die Handleanzahl anzeigen, sodass Sie ermitteln können, welcher Prozess alle Ports nutzt.
Für Windows 7 und Windows Server 2008 R2 können Sie Ihre PowerShell-Version aktualisieren, um das obige Cmdlet einzuschließen.
Methode 2
Wenn Methode 1 Ihnen nicht hilft, den Prozess zu identifizieren (vor Windows 10 und Windows Server 2012 R2), sehen Sie sich den Task-Manager an:
Fügen Sie unter details/processes eine Spalte namens "handles" hinzu.
Sortieren Sie die Spaltenhandles, um den Prozess mit der höchsten Anzahl von Handles zu identifizieren. Normalerweise kann der Prozess mit Handles größer als 3000 der Schuldige sein, mit Ausnahme von Prozessen wie System, lsass.exe, store.exesqlsvr.exe.
Wenn ein anderer Prozess als diese Prozesse eine höhere Anzahl aufweist, beenden Sie diesen Prozess, und versuchen Sie dann, sich mit Domänenanmeldeinformationen anzumelden und zu überprüfen, ob er erfolgreich ist.
Methode 3
Wenn der Task-Manager Ihnen nicht dabei hilft, den Prozess zu identifizieren, verwenden Sie Process Explorer, um das Problem zu untersuchen.
Schritte zur Verwendung des Prozess-Explorers:
Laden Sie Process Explorer herunter, und führen Sie es mit erhöhten Rechten aus.
Alt + wählen Sie die Spaltenüberschrift aus, wählen Sie Spalten auswählen aus, und fügen Sie auf der Registerkarte Prozessleistunghandle count (Handle count) hinzu.
Wählen Sie Ansicht>Unterer Bereich anzeigen aus.
Wählen Sie Ansichtshandles>im unteren Bereich> aus.
Wählen Sie die Spalte Handles aus, um nach diesem Wert zu sortieren.
Untersuchen Sie die Prozesse mit einer höheren Handleanzahl als die restlichen (wahrscheinlich über 10.000, wenn Sie keine ausgehenden Verbindungen herstellen können).
Klicken Sie hier, um einen der Prozesse mit einer hohen Handleanzahl hervorzuheben.
Im unteren Bereich sind die unten aufgeführten Handles Sockets. (Sockets sind technisch gesehen Dateihandles.
Datei \Device\AFD
Einige sind normal, aber eine große Anzahl von ihnen nicht (Hunderte bis Tausende). Schließen Sie den betreffenden Prozess. Wenn dadurch die ausgehende Konnektivität wiederhergestellt wird, haben Sie weiter nachgewiesen, dass die App die Ursache ist. Wenden Sie sich an den Anbieter dieser App.
Wenn die oben genannten Methoden ihnen nicht dabei helfen, den Prozess zu isolieren, empfiehlt es sich, ein vollständiges Speicherabbild des Computers im Problemzustand zu sammeln. Das Speicherabbild teilt Ihnen mit, welcher Prozess über die maximale Anzahl von Handles verfügt.
Als Problemumgehung wird der Computer durch einen Neustart wieder in den normalen Zustand versetzt, und sie hilft Ihnen, das Problem vorerst zu beheben. Wenn ein Neustart jedoch nicht praktikabel ist, können Sie auch die Anzahl der Ports auf dem Computer mithilfe der folgenden Befehle erhöhen:
netsh int ipv4 set dynamicport tcp start=10000 num=1000
Dieser Befehl legt fest, dass der dynamische Portbereich an Port 10000 beginnt und an Port 10999 (1000 Ports) endet. Der Mindestbereich von Ports, der festgelegt werden kann, ist 255. Der minimale Startport, der festgelegt werden kann, ist 1025. Der maximale Endport (basierend auf dem konfigurierten Bereich) darf 65535 nicht überschreiten.
Hinweis
Beachten Sie, dass das Vergrößern des dynamischen Portbereichs keine dauerhafte Lösung ist, sondern nur temporär. Sie müssen ermitteln, welcher Prozess/welche Prozessoren die maximale Anzahl von Ports verbrauchen, und von diesem Prozess aus eine Problembehandlung durchführen, warum er eine so hohe Anzahl von Ports verbraucht.
Für Windows 7 und Windows Server 2008 R2 können Sie das folgende Skript verwenden, um die netstat-Ausgabe mit definierter Häufigkeit zu erfassen. In den Ausgaben sehen Sie den Trend zur Portnutzung.
@ECHO ON
set v=%1
:loop
set /a v+=1
ECHO %date% %time% >> netstat.txt
netstat -ano >> netstat.txt
PING 1.1.1.1 -n 1 -w 60000 >NUL
goto loop
Weitere Informationen
- Porterschöpfung und Sie! – Dieser Artikel enthält ausführliche Informationen zu netstat-Zuständen und wie Sie die Netstat-Ausgabe verwenden können, um den Port status
- Erkennen einer kurzlebigen Portauslastung: Dieser Artikel enthält ein Skript, das in einer Schleife ausgeführt wird, um den Port status zu melden. (Gilt für Windows 2012 R2, Windows 8, Windows 10 und Windows 11)