Socket淺析通信原理和java編程(二)

內容從Socket淺析通信原理和java編程(一)(4)開始

4 socket源碼淺析客戶端和服務器端的連接過程。

(1)socket服務器端和客戶端的創建和連接過程
下面三句代碼:服務器端創建服務器Socket,然後服務器端調用accpet()方法,服務器端就可以接收用戶的請求了。客戶端指定要訪問的IP和端口號,就可以向指定的服務器進行通信了。

//創建一個服務器端Socket,即ServerSocket,指定綁定的端口,並監聽此端口
ServerSocket serverSocket = new ServerSocket(10086);
// 調用accept()方法開始監聽,等待客戶端的連接
Socket socket = serverSocket.accept();
//創建客戶端Socket,指定服務器地址和端口
Socket socket = new Socket("localhost", 10086);

(2)socket服務端創建到準備接收請求的過程:服務器或者應用進程通過協議+端口號去確認一個服務器或者應用進程,通過IP地址確定一個主機。

1)首先創建socket服務器,指定服務器端口號port。

//創建socket服務器的三種方式。
 public ServerSocket(int port);//主要說這個創建方式
 public ServerSocket(int port, int backlog)//backlog連接數量
 //端口號-連接數量-IP地址
 public ServerSocket(int port, int backlog, InetAddress bindAddr);

2)調用bind()方法,將服務器的IP地址和端口號綁定,同時設定可以接收客戶端的連接數量(backlog)。

protected abstract void bind(InetAddress host, int port) throws IOException;

3)調用listen()方法,將new出來的socket主動型設置爲被動形式,count爲監聽的最大連接數量。

  protected synchronized void listen(int count) throws IOException {
        socketListen(count);
    }

4)調用accept()方法,服務器端就可以開始接收用的請求了。

(3)客戶端連接服務器端的過程:
1)創建socket,連接指定的端口和IP地址。

private Socket(SocketAddress address, SocketAddress localAddr,
                   boolean stream)

2)調用bind()方法,雖然客戶端沒有指定端口號和IP地址,但是系統會將本地的IP地址和隨機產生的端口號綁定,以便於接收服務器端的應答,如果客戶端不自我綁定,客戶端就收不到服務器的應答,包括三次握手和四次揮手的過程。

protected abstract void bind(InetAddress host, int port) throws IOException;

3)調用connect()方法,連接指定的IP地址和端口號。相當於客戶端主要向服務器發送連接請求。

public void connect(SocketAddress endpoint, int timeout)

(4)套接字數據結構:
每臺主機可能有多個應用進程,所以可能出現多個套接字(端口號範圍爲0-65535,其中0-1023位爲系統保留,我認爲保留的套接字就是爲了應用進程發出socket系統調用時使用),需要一個存放套接字描述符的表(操作系統將應用進程所需要的資源的總和稱爲套接字描述符返回給應用進程),每一個套接字描述符有一個指向存放操作地址的地址。
PF_INET:表示使用internet的TCP/IP協議族。
SOCK_STREAM:表示流式服務,也就是TCP服務。
這裏寫圖片描述
指定了本地地址和端口號、遠程地址和端口號,這樣客戶端和服務器端的通信便暢通無阻!!!

5 socket在TCP三次握手中的建立連接過程。

我們知道tcp建立連接要進行“三次握手”,即交換三個分組。大致流程如下:

客戶端向服務器發送一個SYN J
服務器向客戶端響應一個SYN K,並對SYN J進行確認ACK J+1
客戶端再想服務器發一個確認ACK K+1。
這裏寫圖片描述
從圖中可以看出,當客戶端調用connect時,觸發了連接請求,向服務器發送了SYN J包,這時connect進入阻塞狀態;服務器監聽到連接請求,即收到SYN J包,調用accept函數接收請求向客戶端發送SYN K ,ACK J+1,這時accept進入阻塞狀態;客戶端收到服務器的SYN K ,ACK J+1之後,這時connect返回,並對SYN K進行確認;服務器收到ACK K+1時,accept返回,至此三次握手完畢,連接建立。

總結:客戶端的connect在三次握手的第二個次返回,而服務器端的accept在三次握手的第三次返回。

6 socket在TCP四次揮手中的釋放過程。

上面介紹了socket中TCP的三次握手建立過程。現在我們介紹socket中的四次握手釋放連接的過程,請看下圖:
這裏寫圖片描述
某個應用進程首先調用close主動關閉連接,這時TCP發送一個FIN M;
另一端接收到FIN M之後,執行被動關閉,對這個FIN進行確認。它的接收也作爲文件結束符傳遞給應用進程,因爲FIN的接收意味着應用進程在相應的連接上再也接收不到額外數據;
一段時間之後,接收到文件結束符的應用進程調用close關閉它的socket。這導致它的TCP也發送一個FIN N;
接收到這個FIN的源發送端TCP對它進行確認。
這樣每個方向上都有一個FIN和ACK。

參考博客地址:
http://blog.csdn.net/jiajia4336/article/details/8798421
http://www.cnblogs.com/rocomp/p/4790340.html
參考書籍:計算機網絡-謝希仁第五版

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章