前言
三月份就快要結束了,這個月定的目標是對http的基礎知識點作一個落地。直入主題咱們順着下面的思路去對http基礎知識作一個總結:javascript
- 概念
- 五層網絡協議
- HTTP Method
- HTTP Status
- HTTP Header
- Cookie/Session
- HTTPs
- Websocket
- HTTP2
概念
什麼是http?Hypertext Transfer Protocol, 超文本傳輸(轉移)協議,是客戶端和服務端傳輸文本制定的協議。提及http協議,還得說說WWW,http是構建WWW的三項技術之一,具體的三項技術以下:java
WWW: world wide web, 萬維網web
- HTML: Hypertext Markup Language, 超文本標記語言
- HTTP: Hypertext Transfer Protocol, 超文本傳輸(轉移)協議
- URL: Uniform Resource Locator, 統一資源定位符號
URI: Uniform Resource Identitier, 統一資源標示符號,URL是URI的子集
五層網絡協議
應用層(http/https/websocket/ftp...) => 定義:文本傳輸協議
|
傳輸層(tcp/udp) => 定義:端口
|
網絡層(ip) => 定義:IP
|
鏈路層(mac&數據包) => 定義:數據包,MAC地址
|
實體層(光纜/電纜/交換機/路由/終端...) => 定義:物理
TCP/IP:緩存
提及網絡協議天然不能不提TCP/IP協議了,它有兩種解釋以下,websocket
- 解釋一:分別表明tcp協議和ip協議
- 解釋二:若是按照網絡五層架構,TCP/IP表明除了應用層其餘層全部協議簇的統稱
TCP/IP connect: TCP/IP的三次握手:cookie
標有syn的數據包
------------->
標有syn/ack的數據包
client <------------- server
標有ack的數據包
-------------->
TCP/IP finish: TCP/IP的四次握手:網絡
fin
<-------------
ack
client(或server) -------------> server(或client)
fin
------------->
ack
<-------------
Keep-Alive: session
HTTP協議初期每次鏈接結束後都會斷開TCP鏈接,以後HEADER的connection字段定義Keep-Alive(HTTP 1.1 默認 持久鏈接),表明若是鏈接雙方若是沒有一方主動斷開都不會斷開TCP鏈接,減小了每次創建HTTP鏈接時進行TCP鏈接的消耗。架構
HTTP Method
- get: 獲取資源,url傳參,大小2KB
- post: 傳輸資源,http body, 大小默認8M,1000個input variable
- put: 傳輸資源,http body,資源更新
- delete: 刪除資源
- patch: 傳輸資源,http body,存在的資源局部更新
- head: 獲取http header
- options: 獲取支持的method
- trace: 追蹤,返回請求迴環信息
- connect: 創建隧道通訊
HTTP Status
- 200: ok
- 301: 永久重定向
- 302: 臨時重定向
- 303: 臨時重定向,要求用get請求資源
- 304: not modified, 返回緩存,和重定向無關
- 307: 臨時重定向,嚴格不從post到get
- 400: 參數錯誤
- 401: 未經過http認證
- 403: forbidden,未受權
- 404: not found,不存在資源
- 500: internet server error,代碼錯誤
- 502: bad gateway,fastcgi返回的內容web server不明白
- 503: service unavailable,服務不可用
- 504: gateway timeout,fastcgi響應超時
接口選取http status做爲響應code是個不錯的選擇
HTTP Header Fields
常見通用頭部dom
-
Cache-Control:
- no-cache: 不緩存過時的緩存
- no-store: 不緩存
- Pragma: no-cache, 不使用緩存,http1.1前的歷史字段
-
Connection:
- 控制不在轉發給代理首部不字段
- Keep-Alive/Close: 持久鏈接
- Date: 建立http報文的日期
常見請求頭
- Accept: 能夠處理的媒體類型和優先級
- Host: 目標主機域名
- Referer: 請求從哪發起的原始資源URI
- User-Agent: 建立請求的用戶代理名稱
- Cookie: cookie信息
常見響應頭
- Location: 重定向地址
- Server: 被請求的服務web server的信息
-
Set-Cookie: 要設置的cookie信息
- NAME: 要設置的鍵值對
- expires: cookie過時時間
- path: 指定發送cookie的目錄
- domain: 指定發送cookie的域名
- Secure: 指定以後只有https下才發送cookie
- HostOnly: 指定以後javascript沒法讀取cookie
Cookie/Session
- Cookie: 工做機制是用戶識別和狀態管理,服務端爲了管理用戶的狀態會經過客戶端,把一些臨時的數據寫入到設備中Set-Cookie,當用戶訪問服務的時候,服務能夠經過通訊的方式取回以前存放的cookie。
- Session: 因爲http是無狀態的,請求之間沒法維繫上下文,因此就出現了session做爲會話控制,服務端存放用戶的會話信息。
HTTPs
概念:在http協議上增長了ssl(secure socket layer)層。
SSL層
|
應用層
|
傳輸層
|
網絡層
|
鏈路層
|
實體層
HTTPS 認證流程
發起請求
---------------------------> server
下發證書
<--------------------------- server
證書數字簽名(用證書機構公鑰加密)
---------------------------> 證書機構
證書數字簽名驗證經過
client(內置證書機構證書) <--------------------------- 證書機構
公鑰加密隨機密碼串(將來的共享祕鑰)
---------------------------> server私鑰解密(非對稱加密)
SSL協議結束 HTTP協議開始
<--------------------------- server(對稱加密)
共享祕鑰加密 HTTP
---------------------------> server(對稱加密)
- 覈對證書證書: 證書機構的公開祕鑰驗證證書的數字簽名
- 公開密鑰加密創建鏈接:非對稱加密
- 共享密鑰加密
Websocket
- 基於http協議創建鏈接,header的upgrade字段轉化協議爲websocket
- 全雙工通訊,客戶端創建鏈接
HTTP2
- 多路複用:多個請求共享一個tcp鏈接
- 全雙工通訊
- 必須https://
- 頭部壓縮
- 二進制傳輸
附錄
詳細五層協議
- 歸納:從上到下,越上越接近用戶,越下越接近硬件
-
應用層:
- 規定應用程序的數據格式
- [HEAD(以太網標頭) [HEAD(IP標頭) [HEAD(TCP標頭) DATA(應用層數據包)]]]
-
傳輸層(端口到端口的通訊):
-
端口:
- 0到65535(2^16)的整數
- 進程使用網卡的編號
- 經過IP+mac肯定主機,只要肯定主機+端口(套接字socket),就能進行程序間的通訊
-
UDP協議:
- 數據包中加入端口依賴的新協議
- 數據包[HEAD(發送、接收mac) [HEAD(發送、接收ip) [HEAD(發送、接收端口) DATA]]]
- 簡單,可靠性差,不知道對方是否接受包
-
TCP協議:
- 帶有確認機制的UDP協議
- 過程複雜,實現困難,消耗資源
-
網絡層(主機到主機的通訊):
-
IP協議
-
ipv4:
- 32個二進制位表示,由網絡部分和主機部分構成,
- 子網掩碼: 網絡部分都爲1,主機部分都爲0,目的判斷ip的網絡部分,如255.255.255.0(11111111.11111111.11111111.00000000)
- IP數據包:標頭Head+數據Data,放進以太網數據包的Data部分[HEAD [HEAD DATA]]
-
IP數據包的傳遞:
-
連接層:
-
定義數據包(幀Frame)
- 標頭(Head):數據包的一些說明項, 如發送者、接收者、數據類型
- 數據(Data):數據包的具體內容
- 數據包:[HEAD DATA]
-
定義網卡和網卡惟一的mac地址
- 以太網規定接入網絡的全部終端都應該具備網卡接口,數據包必須是從一個網卡的mac地址到另外一網卡接口的mac地址
- mac全球惟一,16位16位進制組成,前6廠商編號,後6網卡流水號
-
廣播發送數據
- 向本網絡內的全部設備發送數據包,對比接收者mac地址,不是丟包,是接受
-
實體層:
- 終端(pc,phone,pad...)的物理鏈接(光纜,電纜,路由...),負責傳遞0和1信號