PHPer也來聊聊HTTP

前言

三月份就快要結束了,這個月定的目標是對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數據包的傳遞:

          • 非同一網絡:沒法得到mac地址,發送數據到網關,網關處理

            • ARP(Address Resolation Protocol): 解析地址協議,經過ip解析mac地址
          • 同一網絡:mac地址填寫FF:FF:FF:FF:FF:FF:FF,廣播數據,對比ip,不符合丟包
  • 連接層:

    • 定義數據包(幀Frame)

      • 標頭(Head):數據包的一些說明項, 如發送者、接收者、數據類型
      • 數據(Data):數據包的具體內容
      • 數據包:[HEAD DATA]
    • 定義網卡和網卡惟一的mac地址

      • 以太網規定接入網絡的全部終端都應該具備網卡接口,數據包必須是從一個網卡的mac地址到另外一網卡接口的mac地址
      • mac全球惟一,16位16位進制組成,前6廠商編號,後6網卡流水號
    • 廣播發送數據

      • 向本網絡內的全部設備發送數據包,對比接收者mac地址,不是丟包,是接受
  • 實體層:

    • 終端(pc,phone,pad...)的物理鏈接(光纜,電纜,路由...),負責傳遞0和1信號

圖片描述

相關文章
相關標籤/搜索