文章目錄
- websockt及原理
- ipv4和ipv6的區別
- 線程和進程的區別
- cdn原理
- 緩存所涉及的http狀態碼
- 緩存的時候設置 no-store和no-cache和max-age=0這幾個有什么區別
- token一般存放在哪兒
- 怎么設置強緩存和協商緩存
- 強緩存:
- 1. 使用 Cache-Control 頭字段:
- 協商緩存:
- 1. 使用 Last-Modified 和 ETag 頭字段:
- 2. 在響應中返回 304 Not Modified:
- http每次都要建立一個連接嗎?
- tcp連接的三次握手和四次揮手
- 三次握手(Establishing a Connection):
- 四次揮手(Terminating a Connection):
websockt及原理
WebSocket 是一種單個 TCP 連接
上進行全雙工通信
的協議,它允許在客戶端和服務器之間進行實時數據傳輸
。與傳統的 HTTP 請求-響應模型不同,WebSocket 提供了持久性連接
,允許雙方在任何時候向對方發送數據而無需等待請求。
握手過程
: WebSocket 的連接始于一個握手過程,該過程通過 HTTP 協議完成
。客戶端發送一個 WebSocket 握手請求到服務器,請求中包含了一些特定的頭部信息,如 Upgrade: websocket 和 Connection: Upgrade。如果服務器支持 WebSocket,它將響應一個包含同樣頭部的握手確認,然后連接升級為 WebSocket。
持久連接
: 一旦握手成功,WebSocket 連接就建立起來了,而且是持久性的。這意味著客戶端和服務器之間的連接將一直保持打開狀態,直到其中一方選擇關閉連接
。
數據幀
: WebSocket 數據以數據幀的形式傳輸
。數據幀可以是文本、二進制數據,或者其他自定義數據類型。這些數據幀通過 WebSocket 連接在客戶端和服務器之間傳遞。
全雙工通信
: WebSocket 支持全雙工通信,這意味著客戶端和服務器都可以同時向對方發送數據
,而不需要等待對方的響應。這在實時應用中非常有用,如聊天應用、實時游戲等。
心跳機制
: 為了保持連接的活躍狀態,通常會實現心跳機制。通過定期發送小的數據幀或 ping 消息,可以檢測連接是否仍然可用
。
創建websocket請求
var socket = new WebSocket("ws://example.com/socket");
監聽 WebSocket 的不同事件,以處理連接狀態和接收數據。
// 監聽連接建立事件
socket.addEventListener("open", function (event) {console.log("WebSocket 連接已建立");
});// 監聽接收到消息事件
socket.addEventListener("message", function (event) {console.log("收到消息:" + event.data);
});// 監聽連接關閉事件
socket.addEventListener("close", function (event) {console.log("WebSocket 連接已關閉");
});// 監聽發生錯誤事件
socket.addEventListener("error", function (event) {console.error("WebSocket 錯誤發生:" + event);
});
主動發送數據
// 發送文本消息
socket.send("Hello, WebSocket!");// 發送 JSON 數據
var data = { message: "Hello, WebSocket!", user: "user123" };
socket.send(JSON.stringify(data));
主動關閉socket連接
// 關閉連接
socket.close();
ipv4和ipv6的區別
IPv4(Internet Protocol version 4)和IPv6(Internet Protocol version 6)是互聯網協議的兩個不同版本,用于標識和定位網絡上的設備。
地址長度:
IPv4: 使用32位地址
,通常表示為四個點分十進制數,如 192.168.0.1。每個部分取值范圍是255, IPv4地址空間有限,約為42億個地址
(255255255*255)。
IPv6: 使用128位地址
,通常表示為八組四位十六進制數,如 2001:0db8:85a3:0000:0000:8a2e:0370:7334。IPv6大大擴展了地址空間,提供了3.4 x 10^38個地址
安全性:
IPv6: 在設計時考慮了更多的安全特性
,例如IPsec(Internet Protocol Security)在IPv6中是可選但更常見的部分,而在IPv4中是可選的。
IPv4: 安全性方面相對較弱,對于安全性需求通常需要添加額外的協議和功能。
網絡層協議支持:
IPv4: 支持的網絡層協議有IP、ICMP、IGMP等。
IPv6: 支持更多網絡層協議
除了支持IPv4的協議外,還集成了IPsec,并在鄰居發現中包含了Multicast Listener Discovery(MLD)等新的特性。
線程和進程的區別
進程: 進程是程序的執行實例
,是操作系統分配資源的基本單位
。一個進程可以包含多個線程。
線程: 線程是進程內的執行單元
,是操作系統調度的基本單位
。一個進程內的所有線程共享相同的資源和上下文。
獨立性:
進程: 進程之間相對獨立
,一個進程的崩潰通常不會影響其他進程。
線程: 線程之間共享相同的資源
,一個線程的錯誤可能會影響整個進程,但通過適當的同步和錯誤處理機制可以降低這種風險。
通信方式
進程: 進程間通信需要采用額外的機制(IPC),如消息傳遞、管道、共享內存等。
線程: 線程之間可以直接共享數據,通信更為簡便。
cdn原理
CDN(Content Delivery Network)是一種網絡架構,旨在通過在全球范圍內的多個服務器上分發內容,提高用戶對網站資源的訪問速度和性能。
輻射式部署
: CDN 提供商在全球范圍內部署了多個輻射點(Point of Presence,PoP)
。每個 PoP 都包含有緩存服務器,這些服務器存儲了網站的靜態內容,如圖像、樣式表、腳本等。
DNS 解析
: 用戶在瀏覽器中輸入網址并請求特定資源時,首先進行 DNS 解析。如果網站啟用了 CDN,DNS 解析會返回距離用戶最近的 CDN 輻射點的 IP 地址
。
請求重定向
: 用戶的請求經過本地 CDN 輻射點后,CDN 輻射點會檢查請求的資源是否已經緩存在本地。如果有,CDN 直接返回緩存的資源;如果沒有,CDN 會根據一系列的負載均衡和緩存算法,將請求轉發到全球其他的 CDN 輻射點或源服務器上
。
內容緩存
: CDN 輻射點會在其服務器上緩存靜態內容
,通常是經過壓縮和優化的版本。這樣,當其他用戶請求相同的資源時,CDN 輻射點可以直接返回緩存的內容,而無需再次訪問源服務器。
負載均衡: CDN 提供商會使用負載均衡技術,確保用戶請求被分發到最合適的 CDN 輻射點。這可以基于地理位置、服務器負載、網絡拓撲等因素來進行動態調整。
動態內容加速: 除了靜態內容,一些高級 CDN 提供商還提供動態內容加速。這通過緩存和優化動態生成的內容,減輕源服務器的負擔。
安全性
: CDN 也可以提供一些安全性措施,如 DDoS 攻擊防護
、SSL 加密等
,以確保用戶和網站的數據安全。
緩存所涉及的http狀態碼
200 OK: 表示請求成功。當服務器返回 200 狀態碼時,可能會包含有關資源是否已被修改的信息,以確定是否使用緩存。
304 Not Modified: 表示資源未被修改,客戶端可以使用緩存。當客戶端發起條件請求(通常是帶有 If-Modified-Since 或 If-None-Match 頭部的 GET 請求),而服務器判斷資源未被修改時,返回 304 狀態碼,告訴客戶端可以使用緩存的版本。
410 Gone: 表示請求的資源不再可用。410 明確表示資源已被永久刪除。如果客戶端先前緩存了該資源,可能需要清除緩存。
緩存的時候設置 no-store和no-cache和max-age=0這幾個有什么區別
這三個HTTP頭字段涉及到瀏覽器緩存和服務器的緩存控制,它們有一些區別:
-
no-store
:no-store
是一個緩存控制指令,表示不應該緩存任何與請求/響應有關的內容。- 它指示客戶端不應該將請求/響應的任何部分存儲在緩存中,包括不存儲請求的副本和不存儲響應的副本。
-
no-cache
:no-cache
是一個緩存控制指令,表示緩存需要重新驗證。- 它指示客戶端在使用緩存之前必須先驗證緩存的有效性,即發送請求到服務器進行檢查,但不一定需要下載整個響應。
-
max-age=0
:max-age
是一個緩存控制指令,表示資源在緩存中的最大存儲時間,單位是秒。max-age=0
表示資源已經過期,客戶端必須將請求發送到服務器進行驗證,以確保緩存的內容仍然有效。實際上,這等效于no-cache
指令。
總結區別:
no-store
表示完全禁止緩存,不存儲任何內容。no-cache
表示需要重新驗證緩存,客戶端需要發送請求到服務器進行檢查。max-age=0
也表示需要重新驗證緩存,相當于no-cache
,因為max-age=0
意味著資源已經過期。
token一般存放在哪兒
token可以存在在cookie或者local storage,但一般存在local storage
為什么不存儲在 Cookie 中的一些考慮:
CSRF 攻擊: Cookies 在每個請求中都會被自動發送到服務器,因此如果 Token 存儲在 Cookie 中,那么攻擊者可能通過構造惡意網站來利用用戶的身份進行惡意請求,即 CSRF 攻擊。
安全性和隱私: Cookies 通常會被瀏覽器自動管理,而 Local Storage 則由 JavaScript 控制。從安全性和隱私的角度來看,開發人員可能更喜歡使用 Local Storage,以便更精確地控制 Token 的存儲和獲取。
強緩存和協商緩存分別是什么,請求的過程是怎樣的
當客戶端首次請求資源時
,服務器會在響應頭中添加 Last-Modified 字段
,表示資源的最后修改時間。當客戶端再次請求資源時
,可以在請求頭中包含 If-Modified-Since 字段
,其值為上次收到的 Last-Modified 的值
。
服務器發現請求中的 If-Modified-Since 的值與服務器上資源的最后修改時間相同,說明客戶端的資源仍然是最新的,服務器會返回 304 Not Modified
,并告訴客戶端可以使用緩存。
當服務器返回資源時,也可以在響應頭中添加 ETag 字段,表示資源的唯一標識符。客戶端再次請求資源時,可以在請求頭中包含 If-None-Match 字段,其值為上次收到的 ETag 的值。
如果服務器發現請求中的 If-None-Match 的值與服務器上資源的 ETag 相同,說明客戶端的資源仍然是最新的,服務器會返回 304 Not Modified,并告訴客戶端可以使用緩存。
怎么設置強緩存和協商緩存
在服務器端設置強緩存或協商緩存可以通過在 HTTP 響應頭中添加相應的字段來實現。以下是設置強緩存和協商緩存的常用響應頭字段:
強緩存:
1. 使用 Cache-Control 頭字段:
-
max-age: 設置資源的最大緩存時間,單位是秒。
Cache-Control: max-age=3600
-
s-maxage: 用于代理服務器,設置共享緩存的最大時間。
Cache-Control: s-maxage=3600
-
public: 表示資源可以被任何緩存(包括代理服務器)緩存。
Cache-Control: public, max-age=3600
-
private: 表示資源僅可被瀏覽器緩存。
Cache-Control: private, max-age=3600
-
no-cache: 表示瀏覽器每次請求都要向服務器驗證資源是否過期。
Cache-Control: no-cache
協商緩存:
1. 使用 Last-Modified 和 ETag 頭字段:
-
Last-Modified: 表示資源的最后修改時間。
Last-Modified: Tue, 23 Nov 2023 12:00:00 GMT
-
ETag: 表示資源的唯一標識符。
ETag: "686897696a7c876b7e"
2. 在響應中返回 304 Not Modified:
當客戶端發起請求時,服務器通過比較請求頭中的 If-Modified-Since
或 If-None-Match
字段與資源的修改時間或標識來判斷是否需要返回新的資源。如果沒有變化,服務器可以直接返回 304 Not Modified,告訴客戶端可以使用緩存。
HTTP/1.1 304 Not Modified
Date: Tue, 23 Nov 2023 12:00:00 GMT
通過這些設置,服務器可以控制瀏覽器緩存行為,實現強緩存和協商緩存。請注意,在實際應用中,可以根據具體的業務需求選擇適當的緩存策略。
http每次都要建立一個連接嗎?
HTTP/1.1 中,默認情況下是可以復用連接的,即通過持久連接(Persistent Connection)的方式。這意味著在單個 TCP 連接上,可以傳輸多個 HTTP 請求和響應,而不必為每個請求都重新建立一個連接。
tcp連接的三次握手和四次揮手
TCP(Transmission Control Protocol)是一種面向連接的協議,它使用三次握手和四次揮手來建立和終止連接。
TCP(Transmission Control Protocol)是一種面向連接的協議,它使用三次握手和四次揮手來建立和終止連接。
三次握手(Establishing a Connection):
-
客戶端發送 SYN(同步)報文:
- 客戶端向服務器發送一個 TCP 報文,標志位 SYN 置為 1,表示請求建立連接,并選擇一個初始的序列號(ISN)。
-
服務器發送 SYN + ACK 報文:
- 服務器收到客戶端的 SYN 請求后,如果同意建立連接,會向客戶端發送一個 TCP 報文,其中 SYN 置為 1,同時 ACK(確認)標志也置為 1,表示確認收到客戶端的請求,并選擇自己的初始序列號。
-
客戶端發送 ACK 報文:
- 客戶端收到服務器的 SYN + ACK 報文后,會向服務器發送一個 ACK 報文,確認服務器的建立連接請求。
此時,連接建立完成,可以開始進行數據傳輸。
四次揮手(Terminating a Connection):
-
客戶端發送 FIN 報文:
- 客戶端希望關閉連接時,會向服務器發送一個 FIN(結束)報文,表示不再發送數據。
-
服務器發送 ACK 報文:
- 服務器收到客戶端的 FIN 報文后,發送一個 ACK 報文,確認收到客戶端的關閉請求。此時服務器進入 CLOSE-WAIT 狀態,表示可以關閉連接,但還需要等待可能未發送完的數據。
-
服務器發送 FIN 報文:
- 服務器確認可以關閉連接后,發送一個 FIN 報文給客戶端,表示服務器也不再發送數據了。
-
客戶端發送 ACK 報文:
- 客戶端收到服務器的 FIN 報文后,發送一個 ACK 報文,確認收到服務器的關閉請求。
此時,連接終止。客戶端和服務器都進入 CLOSED 狀態。
需要注意的是,四次揮手中的 ACK 報文通常和 FIN 報文合并在一個報文中發送,因此可能看起來只有三次數據包交換。