以圖鎮壓 (引用極客時間)
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四層
-
分層協議
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();
}
}
}