Telnet
為什麼不存在埠上的telnet 不直接拒絕,而是超時?
telnet 8.8.8.8 8888
顯示
試…
我期待,這直接被拒絕。
背景:當我們有一個 NGINX 反向代理伺服器時,它會直接檢測到後端不存在時,它會很棒。
TCP 堆棧根據一組規則(可能在防火牆級別)決定如何響應連接。您可以 REJECT 連接包 (SYN),但也可以 DROP 它。例如,由於埠掃描,放棄它是有意義的。
這取決於遠端端發回的內容。
對於沒有程序正在偵聽的埠,遠端發送一個設置了重置 (RST) 位的數據包,這會導致客戶端出現“連接被拒絕”錯誤。另一種可能性是 ICMP“埠不可達”消息,例如 Linux
iptables -j REJECT
預設發送的消息。這也會導致“連接被拒絕”。另一方面,如果遠端沒有發回任何東西,那麼客戶端就無法知道問題是什麼,並且可能會重試和/或等待相當長的時間。
iptables
Linux 上的範例:# iptables -I INPUT -p tcp --dport 3001 -j REJECT # iptables -I INPUT -p tcp --dport 3002 -j DROP $ nc -v 127.0.0.1 3000 nc:連接到 127.0.0.1 埠 3000 (tcp) 失敗:連接被拒絕 $ nc -v 127.0.0.1 3001 nc:連接到 127.0.0.1 埠 3001 (tcp) 失敗:連接被拒絕 $ nc -v 127.0.0.1 3002 *(等等……)*
因此,要找出後端不存在,您需要確保其中有人將錯誤發回。如果整個主機出現故障,那當然可能很難做到,因此您可能只需要安排更短的超時時間。