遠程通訊協議概念

​ 以圖鎮壓 (引用極客時間)

img

1、DNS域名解析

  • CDN
    • Context Delivery Network 表示內容分發網絡 ,很多大型望着那,都會引入CDN來加速靜態內容的訪問。
    • CDN就是一種網絡緩存技術,能夠把一些相對"穩定"的資源放到距離最終用戶較近的地方,一般會把一些靜態文件(圖片、腳本、靜態頁面)放入到CDN中。
    • 優點:解決廣域網的帶寬的消耗;提升用戶的訪問速度

2、HTTP協議通訊

應用層的協議,除了HTTP還有FTP/DNS/SMTP/Telnet等

  • HTTP頭

在這裏插入圖片描述

  • HTTP正文

    常見的

  • 狀態碼說明

    狀態碼 類型 原因短語
    1XX Informational(信息性狀態碼) 接受的請求正在處理
    2XX Success(成功狀態碼) 請求正常處理完畢
    3XX Redirection(重定向狀態碼) 需要進行附加操作以完成求情
    4XX Client Error(可以短錯誤狀態碼) 服務器無法處理請求
    5XX Server Error(服務器錯誤狀態碼) 服務器處理請求出錯

3、TCP/UDP

  • 三次握手

在這裏插入圖片描述

  • 第 一 次 握 手 (SYN=1, seq=x) 客戶端發送一個 TCP 的 SYN 標誌 位置1的包,指明客 戶端打算連接的服 務器的端口,以及 初始序號 X , 保存 在包頭的序列號 (Sequence Number) 字段裏 。 發送完畢後,客戶 端 進 入 SYN_SEND 狀態。

  • 第 二 次 握 手
    (SYN=1, ACK=1, seq=y, ACKnum=x+1): 服務器發回確認包 (ACK) 應 答 。 即 SYN 標誌位和
    ACK 標誌位均爲 1。服務器端選擇自 己 ISN 序列號,放 到Seq 域裏,同時 將 確 認 序 號 (Acknowledgeme nt Number)設置爲 客戶的 ISN 加 1, 即X+1。 發送完畢後,服務 器 端 進 入 SYN_RCVD 狀態。

  • 第 三 次 握 手 (ACK=1 , ACKnum=y+1) 客戶端再次發送確 認包(ACK),SYN標 志位爲 0,ACK 標 志位爲1,並且把服 務器發來 ACK 的 序號字段+1,放在 確定字段中發送給 對方,並且在數據 段放寫 ISN 發完畢 後,客戶端進入 ESTABLISHED 狀 態,當服務器端接
    收到這個包時,也 進入
    ESTABLISHED 狀 態,TCP握手結束。

  • 四次揮手

在這裏插入圖片描述

  • 第一次揮手(FIN=1,seq=x) 假設客戶端想要關閉連接,客戶端發送一個 FIN 標誌位置爲1的包,表示自己已經沒有數據 可以發送了,但是仍然可以接受數據。發送完畢後,客戶端進入 FIN_WAIT_1 狀態。
  • 第二次揮手(ACK=1,ACKnum=x+1) 服務器端確認客戶端的 FIN包,發送一個確認包,表明自己接受到了客戶端關閉連接的請求, 但還沒有準備好關閉連接。發送完畢後,服務器端進入 CLOSE_WAIT 狀態,客戶端接收到這 個確認包之後,進入 FIN_WAIT_2 狀態,等待服務器端關閉連接。
  • 第三次揮手(FIN=1,seq=w) 服務器端準備好關閉連接時,向客戶端發送結束連接請求,FIN置爲1。發送完畢後,服務器 端進入 LAST_ACK 狀態,等待來自客戶端的最後一個ACK。
  • 第四次揮手(ACK=1,ACKnum=w+1) 客戶端接收到來自服務器端的關閉請求,發送一個確認包,並進入 TIME_WAIT 狀態,等待 可能出現的要求重傳的 ACK包。
    • 服務器端接收到這個確認包之後,關閉連接,進入 CLOSED 狀態。
    • 客戶端等待了某個固定時間(兩個最大段生命週期,2MSL,2 Maximum Segment Lifetime) 之後,沒有收到服務器端的 ACK,認爲服務器端已經正常關閉連接,於是自己也關閉連接, 進入 CLOSED狀態。(2MSL具體的時間不固定。這個有了解的夥伴可以說說)

4、分層模型

  • 三種:OSI七層、TCP五層、TCP/IP四層

    img

  • 分層協議

这里写图片描述

5、分層負載

負載都是對服務端的負載,從外到內,也就是物理層到應用層

  • 二層負載

    通過一個虛擬MAC地址接收請求,然後再分配到真實的MAC地址

    針對MAC,負載均衡服務器對外依然提供一個VIP(虛IP),集羣中不同的機器採用相同的IP地址,但是機器的MAC地址不一樣。當負載均衡服務器接收到請求之後,通過改寫報文的目標MAC地址的方式轉發到目標機器實現負載均衡

  • 三層負載

    通過一個虛擬IP地址接收請求,然後再分配到真實的IP地址

    針對IP,和二層負載類似,負載均衡服務器對外依然提供一個VIP(虛ip),但是集羣中不同的機器採用的不同的IP地址。當負載均衡服務器接收到請求之後,根據不同的負載均衡算法,通過IP講請求轉發至不同的真實服務器

  • 四層負載

    通過虛擬IP + 端口 接收請求,然後再分配到真實的服務器

    工作在OSI模型的傳輸層,由於在傳輸層,只有TCP/UDP協議,這兩種協議中除了包含源目標IP、目標IP以外,還包含源端口號及目標端口號。四層負載均衡服務器在接收到客戶端請求以後,通過修改數據包的地址信息(ip+端口)講流量轉發到應用服務器

  • 七層負載

    通過虛擬的URL或主機名接收請求,然後再分配到真實的服務器

    工作中OSI模型的應用層,應用層協議較多,常用的http、radius、dns等。七層負載就是基於這些協議來負載,這些應用層協議中會包含很多有意義的內容。比如同一個WEB服務器的負載均衡,除了根據IP加端口進行負載外,還可以根據七層的URL、瀏覽器類別來決定是否進行負載均衡。

6、Socket 通信過原理

Socket接口是TCP/IP網絡的API(Application Programming Interface,應用程序編程接口),Socket接口定義了許多函數或例程,程序員可以用它們來開發 TCP/IP網絡上的應用程序

手動使用JavaApi實現Socket聊天通訊

  • 服務端
public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(8080);
            Socket socket = serverSocket.accept();

            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
            BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));

            //初次被動等待客戶端請求
            System.out.println("client:" + in.readLine());
            String buf = sin.readLine();

            while (!"bye".equals(buf)) {
                out.println(buf);

                System.out.println("client:" + in.readLine());
                buf = sin.readLine();
            }
            sin.close();
            in.close();
            out.close();
            socket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 客戶端
public class Client {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 8080);

            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
            BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));

            String buf = sin.readLine();

            while (!"bye".equals(buf)) {
                out.println(buf);

                System.out.println("server:" + in.readLine());
                buf = sin.readLine();
            }

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