目錄
1. Scoket 鏈接和 HTTP 鏈接的區別
- HTTP 協議是基於 TCP 鏈接的,是應用層協議,主要解決如何包裝數據。Socket 是對 TCP/IP 協議的封裝,Socket 自己並非協議,而是一個調用接口(API),經過 Socket,咱們才能使用 TCP/IP 協議
- HTTP:短鏈接,客戶端向服務器發送一次請求,服務器響應後鏈接斷開,節省資源。服務器不能主動給客戶端響應(除非採用 HTTP 長鏈接技術),iOS 目前主要使用類 NSURLSession
- Socket:長鏈接,客戶端跟服務器端直接使用 Socket 進行鏈接,沒有規定鏈接後斷開,所以客戶端和服務器段保持鏈接通道,雙方能夠主動發送數據,通常多用於遊戲。Socket 默認鏈接超時時間是30秒,默認大小是8K(能夠理解爲一個數據包大小)
2. 關於 HTTP 的請求 GET 和 POST 的區別
傳輸數據的大小:瀏覽器
- GET 提交時,傳輸數據就會受到 URL 長度限制
- POST 因爲不是經過 URL 傳值,理論上不受限,但通常服務器對於請求數據量大小有限制
安全性:緩存
- POST 的安全性要比 GET 的安全性高
- 經過 GET 提交數據,用戶名和密碼將明文出如今 URL 上,好比登錄界面有可能被瀏覽器緩存
- HTTPS:安全超文本傳輸協議(Secure Hypertext Transfer Protocol),它是一個安全通訊通道,基於 HTTP 開發,用於客戶計算機和服務器之間交換信息,使用安全套結字層(SSI)進行信息交換,即 HTTP 的安全版
3. HTTPS 加密過程與原理
- 服務器端用非對稱加密(RSA)生成公鑰和私鑰
- 而後把公鑰發給客戶端, 服務器則保存私鑰
- 客戶端拿到公鑰後, 會生成一個密鑰, 這個密鑰就是未來客戶端和服務器用來通訊的鑰匙
- 而後客戶端用公鑰對密鑰進行加密, 再發給服務器
- 服務器拿到客戶端發來的加密後的密鑰後, 再使用私鑰解密密鑰, 到此雙方都得到通訊的鑰匙
4. Socket 原理
-
Socket 概念: 套接字安全
-
套接字是通訊的基石,是支持 TCP/IP 協議的網絡通訊的基本操做單元。它是網絡通訊過程當中端點的抽象表示,包含進行網絡通訊必須的五種信息:鏈接使用的協議,本地主機的IP地址,本地進程的協議端口,遠地主機的IP地址,遠地進程的協議端口服務器
-
應用層經過傳輸層進行數據通訊時,TCP 會遇到同時爲多個應用程序進程提供併發服務的問題。多個 TCP 鏈接或多個應用程序進程可能須要經過同一個 TCP 協議端口傳輸數據。爲了區別不一樣的應用程序進程和鏈接,許多計算機操做系統爲應用程序與 TCP/IP 協議交互提供了套接字接口。應用層能夠和傳輸層經過 Socket 接口,區分來自不一樣應用程序進程或網絡鏈接的通訊,實現數據傳輸的併發服務網絡
-
Socket 創建鏈接:併發
- 創建 Socket 鏈接至少須要一對套接字,其中一個運行於客戶端,稱爲 ClientSocket,另外一個運行於服務器端,稱爲 ServerSocket
- 套接字之間的鏈接過程分爲三個步驟:服務器監聽,客戶端請求,鏈接確認
- 服務器監聽:服務器端套接字並不定位具體的客戶端套接字,而是處於等待鏈接的狀態,實時監控網絡狀態,等待客戶端的鏈接請求
- 客戶端請求:指客戶端的套接字提出鏈接請求,要鏈接的目標是服務器端的套接字。爲此,客戶端的套接字必須首先描述它要鏈接的服務器的套接字,指出服務器端套接字的地址和端口號,而後就向服務器端套接字提出鏈接請求
- 鏈接確認:當服務器端套接字監聽到或者說接收到客戶端套接字的鏈接請求時,就響應客戶端套接字的請求,創建一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式創建鏈接。而服務器端套接字繼續處於監聽狀態,繼續接收其餘客戶端套接字的鏈接請求
-
Socket 鏈接與 TCP 鏈接app
- 建立 Socket 鏈接時,能夠指定使用的傳輸層協議,Socket 能夠支持不一樣的傳輸層協議(TCP或UDP),當使用 TCP 協議進行鏈接時,該 Socket 鏈接就是一個 TCP 鏈接
-
Socket 鏈接與 HTTP 鏈接加密
- 因爲一般狀況下 Socket 鏈接就是 TCP 鏈接,所以 Socket 鏈接一旦創建,通訊雙方便可開始相互發送數據內容,直到雙方鏈接斷開。但在實際網絡應用中,客戶端到服務器之間的通訊每每須要穿越多箇中間節點,例如路由器、網關、防火牆等,大部分防火牆默認會關閉長時間處於非活躍狀態的鏈接而致使 Socket 鏈接斷連,所以須要經過輪詢告訴網絡,該鏈接處於活躍狀態
- 而 HTT P鏈接使用的是
「請求—響應」
的方式,不只在請求時須要先創建鏈接,並且須要客戶端向服務器發出請求後,服務器端才能回覆數據
- 不少狀況下,須要服務器端主動向客戶端推送數據,保持客戶端與服務器數據的實時與同步。此時若雙方創建的是 Socket 鏈接,服務器就能夠直接將數據傳送給 客戶端;若雙方創建的是 HTTP 鏈接,則服務器須要等到客戶端發送一次請求後才能將數據傳回給客戶端,所以,客戶端定時向服務器端發送鏈接請求,不只能夠保持在線,同時也是在
「詢問」
服務器是否有新的數據,若是有就將數據傳給客戶端
5. 關於 TCP 的慢啓動特性
- TCP 在鏈接過程的三次握手完成後,開始傳數據,並非一開始向網絡通道中發送大量的數據包,這樣很容易致使網絡中路由器緩存空間耗盡,從而發生擁塞
- TCP 使用了一個叫慢啓動閾值(
ssthresh
)的變量,一旦cwnd>=ssthresh
(大多數 TCP 的實現,一般大小都是65536)慢啓動過程結束,擁塞避免階段開始
- 擁塞避免:
cwnd
的值再也不指數級往上升,開始加法增長。此時當窗口中全部的報文段都被確認時,cwnd
的大小加1,cwnd
的值就隨着 RTT 開始線性增長,這樣就能夠避免增加過快致使網絡擁塞,慢慢的增長調整到網絡的最佳值
聯繫方式
郵箱: adrenine@163.com
郵箱: holaux@gmail.com
郵箱: ledahapple@icloud.com