網絡協議基礎之TCL協議(傳輸層協議)

TCL協議特點:

  • 面向連接,通過三次握手建立連接,通訊完成時要拆除連接,由於面向對象連接,TCP多用於端到端的連接的通訊
  • 基於字節流
  • 高可靠,TCP採用應答機制,TCP發送的每個報文段都必須得到接受方的應答才 認爲TCP報文段傳輸成功超時重傳,發送端在發出一個報文段之後就啓動一個報文段之後的一個啓動定時器,如果定時時間內沒有收到應答就重新發送這個文段

TCP協議組成【暫不深入】

  • 協議頭

三次握手:【syn標識位,seq number系列號,ACK是一種確認應答,暫未深入瞭解

  • TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,採用三次握手,確認建立一個連接
  • 第一次握手:主機A發送位碼爲syn=1,隨機產生seq number = 200的數據包到服務器,主機B由syn=1知道,A要求建立聯機
  • 第二次握手:主機B收到請求後確認連接信息,向A發送ack number = (主機A的seq+1),sqn=1,ack=1,隨機產生seq number=500的包
  • 第三次握手:主機A收到後檢查ack number是否正確,即使第一次發送的seq number +1,以及ack是否是1,若正確,主機A會再次發送ack number=(主機B的seq+1),ack=1,主機B接受到後確認seq值與ack=1則建立成功

四次揮手:

  • 第一次揮手:客服端A發送一個fin,用來關閉客服端的A到服務器B的數據傳送
  • 第二次揮手:服務器B收到這個fin,它發回一個ack,確認系列號爲爲收到的系列號加1和syn一樣,一個fin暫用一個系類號
  • 第三次揮手:服務器B關閉與客服端A的連接,發送一個FIN給客服端A
  • 第四次揮手:客服端A發回ack報文確認,並確定系類號設置爲收到系列號加1

Socket基礎TCL協議通信Demo【Socket中流是阻塞的關閉與開啓需要同步】:

客端端:

package cn.woniux.scoket;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 1、創建客服端,必須指定服務器端和端口 2、接受和發送信息給服務端
 * 
 * @author Administrator
 */
public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		/*創建客服端,及客服端接受信息的地址及端口*/
		Socket client = new Socket("localhost", 8888);
		/*將相應資源發送到服務器,客服端輸出流,TCL協議許發送字節流,將字節流轉換爲字符流*/
		BufferedWriter bo = new BufferedWriter(
				new OutputStreamWriter(client.getOutputStream()));
		String str = "客服端第一次請求";
		/*接受服務器信息,客戶端輸入流*/
		BufferedReader br = new BufferedReader(
				new InputStreamReader(client.getInputStream()));
		/*獲取輸入流內容*/
		bo.write(str);
		/*使用readLine()讀取需要使用newLine()換行*/
		bo.newLine();
		bo.flush();
		String msg = br.readLine();
		System.out.println("客服端輸出\n" + msg);

	}
}

服務端:

package cn.woniux.scoket;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 1、創建服務器,指定端口 ServerScoket(port)
 * 2、接受客服端的信息
 * 3、發送數據和接受數據 接受多個客服端
 * 4、基於字節流傳輸
 * 
 * @author Administrator
 */
public class Server {
	public static void main(String[] args) throws IOException {
		/* 創建服務器端,指定端口號 */
		ServerSocket server = new ServerSocket(8888);
		/* 與客服端建立聯繫 */
		Socket socket = server.accept();
		/* 接受客服端的信息,服務器輸入流,字節流 */
		BufferedReader br = new BufferedReader(
				new InputStreamReader(socket.getInputStream()));
		/* 將信息發送給客服端,服務器輸出流 */
		BufferedWriter bw = new BufferedWriter(
				new OutputStreamWriter(socket.getOutputStream()));
		String msg = br.readLine();
		System.out.println("服務器讀取的信息\n" + msg);
		bw.write(msg);
		/* 使用readLine()讀取需要使用newLine()換行 */
		bw.newLine();
		/*刷出輸出流*/
		bw.flush();
		}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章