Bağlantı noktası tükenme sorunlarını giderme

Şunlar için geçerlidir: Windows 10

TCP ve UDP protokolleri, bağlantı kurmak için kullanılan bağlantı noktası numaralarına göre çalışır. TCP/UDP bağlantısı kurması gereken herhangi bir uygulama veya hizmet, yanında bir bağlantı noktası gerektirir.

İki tür bağlantı noktası vardır:

  • Dinamik bağlantı noktaları olan kısa ömürlü bağlantı noktaları, her makinenin varsayılan olarak giden bağlantı kurması gereken bağlantı noktaları kümesidir.
  • İyi bilinen bağlantı noktaları, belirli bir uygulama veya hizmet için tanımlanan bağlantı noktalarıdır. Örneğin, dosya sunucusu hizmeti 445 numaralı bağlantı noktasında, HTTPS 443'te, HTTP 80'de ve RPC 135'tedir. Özel uygulamaların da kendi tanımlı bağlantı noktası numaraları olacaktır.

Bir uygulama veya hizmetle bağlantı kurulurken, istemci cihazları söz konusu uygulama veya hizmet için tanımlanmış iyi bilinen bir bağlantı noktasına bağlanmak için cihazdan kısa ömürlü bir bağlantı noktası kullanır. İstemci makinesindeki bir tarayıcı, 443 numaralı bağlantı noktasında bağlanmak için https://www.microsoft.com kısa ömürlü bir bağlantı noktası kullanır.

Aynı tarayıcının birden çok web sitesine birçok bağlantı oluşturduğu bir senaryoda, tarayıcının denediği yeni bağlantılar için kısa ömürlü bir bağlantı noktası kullanılır. Bir süre sonra bağlantıların başarısız olmaya başlayacağını ve bu hatanın yüksek bir olasılığının, tarayıcının tüm kullanılabilir bağlantı noktalarını kullanarak dış bağlantılar oluşturduğunu ve bağlantı kurma girişiminin başarısız olacağını fark edeceksiniz çünkü artık kullanılabilir bağlantı noktası yok. Bir makinedeki tüm bağlantı noktaları kullanıldığında, bunu bağlantı noktası tükenmesi olarak niteleriz.

TCP/IP için varsayılan dinamik bağlantı noktası aralığı

Microsoft, İnternet Atanmış Numaralar Yetkilisi (IANA) önerilerine uymak için giden bağlantılar için dinamik istemci bağlantı noktası aralığını artırmıştır. Yeni varsayılan başlangıç bağlantı noktası 49152 ve yeni varsayılan bitiş bağlantı noktası 65535'tir. Bu artış, Windows'un 1025 ile 5000 arasında varsayılan bağlantı noktası aralığını kullanan önceki sürümlerinin yapılandırmasından kaynaklanan bir değişikliktir.

Dinamik bağlantı noktası aralığını bir bilgisayarda aşağıdaki netsh komutları kullanarak görüntüleyebilirsiniz:

  • netsh int ipv4 show dynamicport tcp
    
  • netsh int ipv4 show dynamicport udp
    
  • netsh int ipv6 show dynamicport tcp
    
  • netsh int ipv6 show dynamicport udp
    

Aralık, her aktarım (TCP veya UDP) için ayrı olarak ayarlanır. Bağlantı noktası aralığı artık başlangıç noktası ve bitiş noktası olan bir aralıktır. Windows Server çalıştıran sunucuları dağıtan Microsoft müşterileri, iç ağda güvenlik duvarları kullanılıyorsa sunucular arasındaki RPC iletişimini etkileyen sorunlarla karşılaşabilir. Bu gibi durumlarda, güvenlik duvarlarını 49152 ile 65535 arasındaki dinamik bağlantı noktası aralığındaki sunucular arasında trafiğe izin verecek şekilde yeniden yapılandırmanızı öneririz. Bu aralık, hizmetler ve uygulamalar tarafından kullanılan iyi bilinen bağlantı noktalarına ek olarak sağlanır. Ya da sunucular tarafından kullanılan bağlantı noktası aralığı her sunucuda değiştirilebilir. Aşağıdaki gibi netsh komutunu kullanarak bu aralığı ayarlarsınız. Yukarıdaki komut TCP için dinamik bağlantı noktası aralığını ayarlar.

netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range

Başlangıç bağlantı noktası sayıdır ve toplam bağlantı noktası sayısı aralıktır. Örnek komutlar şunlardır:

  • 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
    

Bu örnek komutlar, dinamik bağlantı noktası aralığını 10000 numaralı bağlantı noktasından başlayacak ve 10999 numaralı bağlantı noktasında (1000 bağlantı noktası) sona erecek şekilde ayarlar. Ayarlanabilecek en düşük bağlantı noktası aralığı 255'tir. Ayarlanabilecek en düşük başlangıç bağlantı noktası 1025'tir. En yüksek uç bağlantı noktası (yapılandırılan aralığa bağlı olarak) 65535'i aşamaz. Windows Server 2003'ün varsayılan davranışını yinelemek için başlangıç bağlantı noktası olarak 1025'i ve ardından hem TCP hem de UDP için aralık olarak 3976 kullanın. Bu kullanım düzeni, 1025 başlangıç bağlantı noktası ve 5000 uç bağlantı noktası ile sonuçlandı.

Özellikle, gelen bağlantılar için gelen bağlantılar için kısa ömürlü bağlantı noktası gerekmez.

Giden bağlantılar başarısız olduğu için aşağıdaki davranışların birçok örneğini görürsünüz:

  • Etki alanı kimlik bilgileriyle makinede oturum açılamıyor, ancak yerel hesapla oturum açma çalışıyor. Etki alanı oturum açma işlemi, kimlik doğrulaması için DC'ye başvurmanızı gerektirir ve bu da yine bir giden bağlantıdır. Kimlik bilgilerini önbelleğe aldıysanız etki alanı oturum açma özelliği çalışmaya devam edebilir.

    Olay Görüntüleyicisi'de NETLOGON hatasının ekran görüntüsü.

  • Güncelleştirme hatalarını grup ilkesi:

    grup ilkesi hatasının olay özelliklerinin ekran görüntüsü.

  • Dosya paylaşımları erişilemez:

    Windows'un erişemediği hata iletisinin ekran görüntüsü.

  • Etkilenen sunucudan RDP başarısız oluyor:

    Uzak Masaüstü bağlanamadığında oluşan hatanın ekran görüntüsü.

  • Makinede çalışan diğer tüm uygulamalar hata vermeye başlar

Sunucunun yeniden başlatılması sorunu geçici olarak çözer, ancak bir süre sonra tüm belirtilerin geri geldiğini görürsünüz.

Makinenin bağlantı noktası tükenmesi durumunda olduğundan şüpheleniyorsanız:

  1. Giden bağlantı kurmayı deneyin. Sunucudan/makineden bir uzak paylaşıma erişin veya başka bir sunucuya rdp veya bağlantı noktası üzerindeki bir sunucuya telnet deneyin. Giden bağlantı bu seçeneklerin tümü için başarısız olursa sonraki adıma geçin.

  2. Olay görüntüleyicisini açın ve sistem günlüklerinin altında, geçerli durumu açıkça gösteren olayları arayın:

    1. Olay Kimliği 4227

      Olay Görüntüleyicisi olay kimliği 4227'nin ekran görüntüsü.

    2. Olay Kimliği 4231

      Olay Görüntüleyicisi olay kimliği 4231'in ekran görüntüsü.

  3. Sunucudan bir netstat -anob çıkış toplayın. Netstat çıkışı, tek bir PID için TIME_WAIT durumu için çok sayıda girdi gösterir.

    netstate komut çıkışının ekran görüntüsü.

    Düzgün bir şekilde kapatıldıktan veya oturumun ani bir şekilde kapatılmasından sonra, 4 dakikalık bir süre (varsayılan) sonra işlem veya uygulama tarafından kullanılan bağlantı noktası kullanılabilir havuza geri serbest bırakılır. Bu 4 dakika boyunca TCP bağlantı durumu TIME_WAIT duruma gelecek. Bağlantı noktasının tükenmesi durumundan şüphelendiğiniz bir durumda, bir uygulama veya işlem tükettiği tüm bağlantı noktalarını serbest bırakamaz ve TIME_WAIT durumunda kalır.

    Aynı çıkışta CLOSE_WAIT durum bağlantıları da görebilirsiniz; ancak CLOSE_WAIT durumu, TCP eşlerinin bir tarafında gönderilecek veri kalmadığında (FIN gönderildi) ancak diğer taraftan veri alabildiği bir durumdur. Bu durum bağlantı noktası tükenmesini belirtmez.

    Not

    TIME_WAIT durumda büyük bağlantıların olması, ilk iki nokta doğrulanmadığı sürece sunucunun şu anda bağlantı noktalarının dışında olduğunu göstermez. Çok fazla TIME_WAIT bağlantısı olması, işlemin çok fazla TCP bağlantısı oluşturduğunu ve sonunda bağlantı noktası tükenmesine yol açabileceğini gösterir.

    Netstat, Windows 10 içinde, BOUND durumunda olduğu gibi zaman aşımına uğradı bağlantı noktalarını göstermek için anahtarın eklenmesiyle -Q güncelleştirildi. Windows 8.1 ve Windows Server 2012 R2 için bu işlevselliği içeren bir güncelleştirme yayımlandı. Windows 10'deki PowerShell cmdlet'i Get-NetTCPConnection de bu BOUND bağlantı noktalarını gösterir.

    10/2016'ya kadar netstat yanlıştı. 2012 R2'ye geri taşımalı netstat, izin verilenNetstat.exe ve Get-NetTcpConnection Windows Server 2012 R2'de TCP veya UDP bağlantı noktası kullanımını doğru şekilde raporlamaya yönelik düzeltmeler. Daha fazla bilgi edinmek için bkz. R2 Windows Server 2012: Kısa ömürlü bağlantı noktaları düzeltmeleri.

  4. Yönetici modunda bir komut istemi açın ve aşağıdaki komutu çalıştırın.

    Netsh trace start scenario=netconnection capture=yes tracefile=c:\Server.etl
    
  5. Server.etl dosyasını Ağ İzleyicisi ile açın ve filtre bölümünde filtreyi Wscore_MicrosoftWindowsWinsockAFD.AFD_EVENT_BIND.Status.LENTStatus.Code == 0x209uygulayın. STATUS_TOO_MANY_ADDRESSES ifadesini içeren girdiler görmeniz gerekir. Herhangi bir girdi bulamazsanız, sunucunun bağlantı noktası hala yetersiz değildir. Bunları bulursanız sunucunun bağlantı noktası tükenmesi altında olduğunu onaylayabilirsiniz.

Bağlantı noktası tükenme sorunlarını giderme

Anahtar, hangi işlemin veya uygulamanın tüm bağlantı noktalarını kullandığını belirlemektir. Tek bir işlemle yalıtmak için kullanabileceğiniz araçlardan bazıları aşağıdadır

Yöntem 1

Netstat çıkışına bakarak başlayın. Windows 10 veya Windows Server 2016 kullanıyorsanız komutunu netstat -anobq çalıştırabilir ve BOUND olarak en fazla girdiye sahip işlem kimliğini de kontrol edebilirsiniz. Alternatif olarak, işlemi tanımlamak için aşağıdaki PowerShell komutunu da çalıştırabilirsiniz:

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 

Bağlantı noktası sızıntılarının çoğu, kullanıcı modu işlemlerinin bir hatayla karşılaşıldığında bağlantı noktalarını doğru kapatmamasından kaynaklanır. Kullanıcı modu düzeyinde bağlantı noktaları (aslında yuvalar) tanıtıcılardır. Hem TaskManager hem de ProcessExplorer tanıtıcı sayılarını görüntüleyebilir ve bu sayede hangi işlemin tüm bağlantı noktalarını tüketmekte olduğunu belirleyebilirsiniz.

Windows 7 ve Windows Server 2008 R2 için PowerShell sürümünüzü yukarıdaki cmdlet'i içerecek şekilde güncelleştirebilirsiniz.

Yöntem 2

Yöntem 1 işlemi tanımlamanıza yardımcı olmazsa (Windows 10 ve Windows Server 2012 R2'ye kadar) Görev Yöneticisi'ne göz atın:

  1. Ayrıntılar/işlemler altına "tanıtıcılar" adlı bir sütun ekleyin.

  2. En fazla tanıtıcı sayısına sahip işlemi tanımlamak için sütun tutamaçlarını sıralayın. Genellikle 3000'den büyük tanıtıcılara sahip işlem, Sistem, lsass.exe,store.exesqlsvr.exegibi işlemler dışında suçlu olabilir.

    Windows Görev Yöneticisi'ndeki tanıtıcılar sütununun ekran görüntüsü.

  3. Bu işlemlerden başka herhangi bir işlem daha yüksek bir sayıya sahipse, bu işlemi durdurun ve ardından etki alanı kimlik bilgilerini kullanarak oturum açmayı deneyin ve başarılı olup olmadığını görün.

Yöntem 3

Görev Yöneticisi işlemi tanımlamanıza yardımcı olmadıysa, sorunu araştırmak için İşlem Gezgini'ni kullanın.

İşlem gezginini kullanma adımları:

  1. İşlem Gezgini'ne indirin ve Yükseltilmiş olarak çalıştırın.

  2. Alt + sütun üst bilgisini seçin, Sütunları Seç'i seçin ve İşlem Performansı sekmesinde Tanıtıcı Sayısı'nı ekleyin.

  3. Görünüm>Alt Bölmeyi Göster'i seçin.

  4. Alt Bölme GörünümTutamaçlarını Görüntüle'yi>> seçin.

  5. Bu değere göre sıralamak için Tanıtıcılar sütununu seçin.

  6. Geri kalanından daha yüksek tanıtıcı sayılarına sahip işlemleri inceleyin (giden bağlantı oluşturamıyorsanız büyük olasılıkla 10.000'den fazla olacaktır).

  7. Yüksek tanıtıcı sayısına sahip işlemlerden birini vurgulamak için tıklayın.

  8. Alt bölmede, aşağıda listelenen tutamaçlar yuvadır. (Yuvalar teknik olarak dosya tanıtıcılarıdır).

    Dosya \Device\AFD

    İşlemlerin tutamaçlara göre sıralandığı İşlem Gezgini'nin ekran görüntüsü.

  9. Bazıları normaldir, ancak bunların büyük sayısı değildir (yüzlerce ile binlerce). Söz konusu işlemi kapatın. Bu, giden bağlantıyı geri yüklerse, bunun nedeninin uygulamanın olduğunu daha da kanıtlamış olursunuz. Bu uygulamanın satıcısına başvurun.

Son olarak, yukarıdaki yöntemler işlemi yalıtmanıza yardımcı olmadıysa, sorunun olduğu durumda makinenin tam bellek dökümünü toplamanızı öneririz. Döküm, hangi işlemin en fazla tanıtıcıya sahip olduğunu size söyler.

Geçici bir çözüm olarak, bilgisayarın yeniden başlatılması normal durumuna geri döner ve şimdilik sorunu çözmenize yardımcı olur. Ancak, yeniden başlatma pratik olmadığında, aşağıdaki komutları kullanarak makinedeki bağlantı noktalarının sayısını artırmayı da düşünebilirsiniz:

netsh int ipv4 set dynamicport tcp start=10000 num=1000

Bu komut, dinamik bağlantı noktası aralığını 10000 numaralı bağlantı noktasından başlayacak ve 10999 numaralı bağlantı noktasında (1000 bağlantı noktası) sona erecek şekilde ayarlar. Ayarlanabilecek en düşük bağlantı noktası aralığı 255'tir. Ayarlanabilecek en düşük başlangıç bağlantı noktası 1025'tir. En yüksek uç bağlantı noktası (yapılandırılan aralığa bağlı olarak) 65535'i aşamaz.

Not

Dinamik bağlantı noktası aralığını artırmanın kalıcı bir çözüm değil, yalnızca geçici bir çözüm olduğunu unutmayın. Hangi işlem/işlemcilerin en fazla sayıda bağlantı noktası tükettiklerini izlemeniz ve bu işlem açısından neden bu kadar yüksek sayıda bağlantı noktası tükettiklerine ilişkin sorunları gidermeniz gerekir.

Windows 7 ve Windows Server 2008 R2 için, netstat çıkışını tanımlı sıklıkta toplamak için aşağıdaki betiği kullanabilirsiniz. Çıkışlardan bağlantı noktası kullanım eğilimini görebilirsiniz.

@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

Daha fazla bilgi