Proxy timeout, bir isteğin belirli bir süre içinde tamamlanamaması nedeniyle istemcinin beklemeyi bırakmasıdır. Sürenin dolduğu yere göre anlamı çok değişir: proxy'ye hiç ulaşılamamış olabilir, proxy yanıt vermiyor olabilir ya da proxy hedefi beklerken siz sabrınızı yitirmiş olabilirsiniz. Üç durumda da mesaj benzerdir: "timed out".
Dört ayrı zaman aşımı
| Tür | Neyi bekler? | Dolarsa ne düşünülmeli? |
|---|---|---|
| Bağlantı (connect) | Proxy'ye TCP bağlantısının kurulması | Proxy kapalı, IP/port yanlış, paketler düşüyor |
| El sıkışma (handshake) | Protokol ve kimlik doğrulama aşaması, TLS dahil | Yanlış protokol, yavaş kimlik doğrulama, TLS sorunu |
| Okuma (read) | Veri akışında iki parça arasındaki bekleme | Hedef yavaş, proxy kuyruğu doluyor, ağ kesintisi |
| Toplam (total) | Tüm isteğin başından sonuna kadar süre | Büyük yanıt, yavaş hat ya da yukarıdakilerden biri |
Örnek oranlar
Konsept animasyonu- Bağlantı
- El sıkışma
- İlk bayt
cURL'de süreleri ayarlama
cURL'de --connect-timeout yalnızca bağlantı aşamasını (proxy kullanırken proxy'ye bağlanmayı), -m (--max-time) ise tüm işlemi sınırlar. İkisini birlikte kullanmak, takılan bağlantıları hızlı ayıklamanın en basit yoludur.
curl -sS --connect-timeout 5 -m 20 -x http://proxy.example.com:8080 --proxy-user KULLANICI:PAROLA -w 'kod=%{http_code} baglanti=%{time_connect} ilk_bayt=%{time_starttransfer} toplam=%{time_total}\n' -o /dev/null https://example.com/Süre dolarsa cURL curl: (28) ile çıkar; mesajda "Connection timed out" yazıyorsa bağlantı aşamasında, "Operation timed out" yazıyorsa toplam sürede takıldığınız anlaşılır. Komut tamamlanabiliyorsa -w çıktısında time_connect küçük, time_total büyükse bekleme proxy'ye bağlandıktan sonraki aşamalardadır.
Python'da süreleri ayırmak
requests içinde timeout=(bağlantı, okuma) biçimindeki ikili değer iki süreyi ayrı belirler. Tek bir sayı vermek ikisine de aynı değeri uygular. Önemli bir uyarı: requests toplam süreyi sınırlamaz; yanıt bayt bayt gelmeye devam ediyorsa okuma süresi hiç dolmayabilir. Toplam süre garantisi gerekiyorsa ayrı bir mekanizma (örneğin iş parçacığı zaman aşımı ya da httpx kütüphanesinin Timeout nesnesi) kullanın.
import requests
PROXY = "http://KULLANICI:[email protected]:8080"
proxies = {"http": PROXY, "https": PROXY}
try:
r = requests.get("https://example.com/", proxies=proxies, timeout=(5, 20))
print(r.status_code)
except requests.exceptions.ConnectTimeout:
print("proxy'ye 5 sn icinde baglanilamadi")
except requests.exceptions.ReadTimeout:
print("baglanti kuruldu ama 20 sn icinde veri gelmedi")Doğru süre kaç saniyedir?
Herkes için geçerli tek bir değer yoktur; ama karar vermenize yardım eden bir mantık vardır. Bağlantı süresini kısa tutun, çünkü kurulamayan bir bağlantı beklemekle düzelmez. Okuma süresini hedefe göre belirleyin, çünkü yavaş bir hedef için kısa süre sahte hata üretir.
- Bağlantı: birkaç saniye. Sağlıklı bir proxy'ye bağlantı genellikle bu süreden çok kısa sürer; uzayan bağlantı çoğu zaman sorunun işaretidir.
- Okuma/toplam: hedefinize göre on-otuz saniye aralığı makul bir başlangıçtır. Büyük dosya indiriyorsanız toplam süreyi değil, okuma süresini esas alın.
- Rotasyonlu proxy: her istekte IP değişiyorsa ilk bağlantı biraz daha uzun sürebilir; süreyi sabit tutup başarısız olanı yeniden deneyin.
- Mobil ve uzak hatlar: ağ dalgalanması daha fazla olabilir; toplam süreyi biraz geniş tutun.
Yeniden deneme stratejisi
Geçici zaman aşımları için kısa bir bekleme ile birkaç yeniden deneme yeterlidir. Her denemede bekleme süresini artırın (örneğin 1, 2, 4 saniye); aksi halde sorunu yaşayan bir proxy'ye daha da yük bindirirsiniz. Üç denemeden sonra da başarısızlık sürüyorsa proxy'yi "sağlıksız" işaretleyip başkasına geçin.
import time
import requests
PROXY = "http://KULLANICI:[email protected]:8080"
proxies = {"http": PROXY, "https": PROXY}
def al(url, deneme=3):
bekleme = 1
for n in range(deneme):
try:
return requests.get(url, proxies=proxies, timeout=(5, 20))
except (requests.exceptions.ConnectTimeout, requests.exceptions.ReadTimeout):
if n == deneme - 1:
raise
time.sleep(bekleme)
bekleme *= 2
print(al("https://example.com/").status_code)Zaman aşımının sık nedenleri
- 1Port ya da IP yanlış; paketler hiçbir yere gitmiyor.
- 2Yerel veya kurumsal güvenlik duvarı giden bağlantıyı sessizce düşürüyor.
- 3Proxy çevrimdışı veya aşırı yüklü.
- 4Yanlış protokol: istemci beklerken proxy çıktı vermiyor.
- 5Hedef site yavaş ya da proxy'nin IP'sine yanıtı geciktiriyor.
- 6DNS çözümlemesi uzuyor; özellikle istemci tarafında ad çözdüren
socks5://kullanımında.
Denetleyici zaman aşımlarını nasıl gösterir?
Proxy denetleyicisi bağlantı ve el sıkışma aşamalarını ayrı zaman sınırlarıyla dener; hangi aşamada süre dolarsa sonuç bu aşamayla etiketlenir. Zaman aşımı ile "bağlantı reddedildi" farklı durumlar olarak raporlanır. Denetleyicinin süreleri sabittir; kendi uygulamanızın sürelerini kendi ihtiyacınıza göre ayarlamanız gerekir.
Proxy'nizin hangi aşamada zaman aşımına uğradığını görün.
Proxy Kontrol Et