1. 程式人生 > >sock5系列之簡單測試sock5 連通性!(二)

sock5系列之簡單測試sock5 連通性!(二)

先說一個感念性的名詞---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的第一次握手,為什麼會有三次握手?這個樓主也不知道,但是樓主知道先測試連通性,再測試可用性效率會比直接測試可用性高。什麼是可用性?下一篇會有答案偷笑

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;
        }

	}
}
通過sendUrgentData()方法,傳送0xFF就能知道socket伺服器是否能聯通,只是確認是否能聯通哦!!!