sock5系列之簡單測試sock5 連通性!(二)
阿新 • • 發佈:2019-01-04
先說一個感念性的名詞---TPC半連結(TPC的三次握手)
在TCP/IP協議中,TCP協議提供可靠的連線服務,採用三次握手建立一個連線。
第一次握手:建立連線時,客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
完成三次握手,客戶端與伺服器開始傳送資料,在上述過程中,還有一些重要的概念:
未連線佇列:在三次握手協議中,伺服器維護一個未連線佇列,該佇列為每個客戶端的SYN包(syn=j)開設一個條目,該條目表明伺服器已收到SYN包,並向客戶發出確認,正在等待客戶的確認包。這些條目所標識的連線在伺服器處於Syn_RECV狀態,當伺服器收到客戶的確認包時,刪除該條目,伺服器進入ESTABLISHED狀態。 Backlog引數:表示未連線佇列的最大容納數目。
SYN-ACK 重傳次數 伺服器傳送完SYN-ACK包,如果未收到客戶確認包,伺服器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數超過系統規定的最大重傳次數,系統將該連線資訊從半連線佇列中刪除。注意,每次重傳等待的時間不一定相同。
半連線存活時間:是指半連線佇列的條目存活的最長時間,也即服務從收到SYN包到確認這個報文無效的最長時間,該時間值是所有重傳請求包的最長等待時間總和。有時我們也稱半連線存活時間為Timeout時間、SYN_RECV存活時間。
下面是測試聯通性的程式碼,也就是TPC的第一次握手,為什麼會有三次握手?這個樓主也不知道,但是樓主知道先測試連通性,再測試可用性效率會比直接測試可用性高。什麼是可用性?下一篇會有答案
通過sendUrgentData()方法,傳送0xFF就能知道socket伺服器是否能聯通,只是確認是否能聯通哦!!!package socket.check.ip; import java.net.Socket; public class TestClient { public static void main(String[] args){ System.out.println(isConnected()); } @SuppressWarnings("resource") public static boolean isConnected(){ Socket socket; try{ socket=new Socket("172.16.2.2", 1080); socket.sendUrgentData(0xFF); return true; }catch(Exception e){ return false; } } }