天天看點

JavaEE基礎(03):Http請求詳解,握手揮手流程簡介

本文源碼:GitHub·點這裡 || GitEE·點這裡

一、Http協定簡介

1、概念說明

HTTP超文本傳輸協定,是用于從網際網路伺服器傳輸超文本到本地浏覽器的傳送協定,基于TCP/IP通信協定來傳遞資料:HTML檔案、圖檔、查詢資料等。HTTP協定基于用戶端-服務端架構模式。浏覽器作為HTTP用戶端通過URL向服務端即WEB伺服器發送請求。Web伺服器根據接收到的請求後,處理完請求後向用戶端發送響應資訊。

JavaEE基礎(03):Http請求詳解,握手揮手流程簡介

2、協定特點

  • 簡單快速

請求伺服器時,隻需傳送請求方法和路徑。請求類型常用GET、POST。由于HTTP協定簡單,使得HTTP伺服器的程式規模小,因而通信速度很快。

  • 靈活:

HTTP允許傳輸任意類型的資料對象。正在傳輸的類型由Content-Type加以标記。

  • 無連接配接

無連接配接的含義是限制每次連接配接隻處理一個請求。伺服器處理完客戶的請求,并收到客戶的應答後,即斷開連接配接。采用這種方式可以節省傳輸時間。

  • 無狀态

HTTP協定是無狀态協定。無狀态是指協定對于事務處理沒有記憶能力。缺少狀态則後續處理需要前面的資訊,沒有則需要重新請求,這樣可能導緻每次連接配接傳送的資料量增大。

  • 支援客戶/伺服器模式

二、Http請求詳解

1、請求接口

public class ServletOneImpl extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("doGet...");
        response.setContentType("text/html;charset=utf-8");
        String userName = request.getParameter("userName") ;
        response.getWriter().print("Hello:"+userName);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("doPost...");
        response.setContentType("text/html;charset=utf-8");
        String userName = request.getParameter("userName") ;
        response.getWriter().print("Hello:"+userName);
    }
}
           

2、請求内容

  • Get請求

位址:

http://localhost:6003/servletOneImpl?userName=cicada

GET /servletOneImpl?userName=cicada HTTP/1.1
Host: localhost:6003
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
DNT: 1
Referer: http://localhost:6003/request.jsp
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=183C0F91B49A025C795FBC3067B37BC8
           
  • Post請求

http://localhost:6003/servletOneImpl

POST /servletOneImpl HTTP/1.1
Host: localhost:6003
Connection: keep-alive
Content-Length: 15
Cache-Control: max-age=0
Origin: http://localhost:6003
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
DNT: 1
Referer: http://localhost:6003/request.jsp
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=183C0F91B49A025C795FBC3067B37BC8
           

3、參數說明

  • Method:常見GET 和 POST,另外還有DELETE、PUT 等 ;
  • URI:/servletOneImpl,和Host組成請求的URL ;
  • HTTP/1.1:傳輸協定Http,版本1.1 ;
  • Host:請求資源所在的主機和端口 ;
  • Connection:TCP連接配接預設不關閉,可以被多個請求複用 ;
  • Upgrade-Insecure-Requests:浏覽器不再顯示 https 頁面中的 http 請求警報 ;
  • Content-Length:訓示實體主體大小,以位元組為機關十進制數,發送到接收方。
  • Cache-Control:max-age=0使用緩存,但是會立即過期 ;
  • User-Agent:用戶端浏覽器類型、版本、作業系統等資訊 ;
  • Content-Type: 請求或響應中,傳輸資源類型資訊 ;
  • Origin:目前請求出自的站點 ;
  • Accept:用戶端聲明自己可以接收的資源格式 ;
  • DNT: 請求禁用使用者追蹤 ;
  • Referer:告訴伺服器該網頁是從哪個頁面連結過來 ;
  • Accept-Encoding: 聲明浏覽器支援的編碼類型 ;
  • Accept-Language: 聲明浏覽器支援的語言類型 ;
  • Cookie: 辨識存儲在用戶端的緩存資料,通常會加密 ;

4、GET和POST差別

  • 浏覽器端

從浏覽器角度看這個兩種請求的差別:GET方式讀取資源,比如Get到靜态頁面,即使多次讀取不會對通路資料産生影響,也被稱為"幂等"操作。POST方式在頁面中定義表單,送出表單會把資料送出到伺服器,而且多數情況下會産生資料,比如常用的儲存資料接口,并非"幂等"操作,不幂等也就意味着不能随意多次執行。

  • 服務接口

這裡指用Ajax程式請求服務接口,送出的請求類型。或者其他Http請求工具類,還有情況是微服務中各種Feign接口間的請求。這種情況接口發送請求時,限制相對較少,比如REST風格接口常用GET、POST、PUT、DELETE,幾種方式分别擷取、建立、更新、删除 資源,

三、Https請求協定

1、Https簡介

  • 基礎概念

HTTPS:是以安全為準則的HTTP通道,是HTTP的安全版,在HTTP請求上加入SSL層,HTTPS的安全基礎是SSL,是以加密的詳細内容就需要SSL。簡單來說,HTTPS協定是由SSL+HTTP協定建構的可進行加密傳輸、身份認證的網絡協定,要比http協定安全。

  • 安全模式

HTTPS協定的主要作用可以分為兩種:一種是建立一個資訊安全通道,來保證資料傳輸的安全;另一種就是确認網站的真實性。

2、Https工作原理

JavaEE基礎(03):Http請求詳解,握手揮手流程簡介

(1)客戶基于Https方式通路服務端,與伺服器建立SSL連接配接 ;

(2)服務端收到請求後,會将包含公鑰的證書傳送給用戶端 ;

(3)用戶端與服務端進行協調SSL連接配接的安全等級,也就是指加密的等級 ;

(4)用戶端根據雙方同意的安全等級,建立會話密鑰,使用公鑰将會話密鑰加密,并傳送給服務端 ;

(5)服務端使用私鑰解密出會話中傳遞的内容,使用會話密鑰加密與用戶端之間的通信 ;

3、Https和Http差別

  • 安全證書

Https協定需要到CA申請證書,一般免費證書較少,因而需要一定費用。

  • 資料傳輸

Http是超文本傳輸協定,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協定。

  • 連接配接方式

Http和Https使用的是完全不同的連接配接方式,用的端口也不一樣,前者是80,後者是443。

四、TCP傳輸協定

1、TCP協定簡介

TCP傳輸控制協定是一種面向連接配接的、可靠的、基于位元組流的傳輸層通信協定。TCP用意在于适應并支援多網絡應用的分層協定層次結構。

2、三次握手

這一場景在生活中可以描述為通話:

甲:你好,我是甲,你是乙嗎;
乙:你好甲:我是乙;
甲:正好找你有點事情,身份确認:
           
JavaEE基礎(03):Http請求詳解,握手揮手流程簡介
  • 第一次握手

用戶端主動向伺服器發起請求連接配接,請求封包中發送SYN=1,此時随機生成初始序列号seq=x,此時,用戶端程序進入SYN-SENT同步已發送狀态。

  • 第二次握手

服務端收到請求封包後,确認客戶的SYN,如果請求沒有拒絕,則發出确認封包。封包中應該ACK=1,SYN=1,确認号是ack=x+1,同時自己也發送一個SYN包seq=y,此時,伺服器程序進入SYN-RCVD同步收到狀态。

  • 第三次握手

用戶端收到确認後,需要向伺服器确認封包的ACK=1,ack=y+1,此時,TCP連接配接建立,用戶端進入ESTABLISHED已建立連接配接狀态。完成三次握手,用戶端與伺服器開始傳送資料。

3、四次揮手

JavaEE基礎(03):Http請求詳解,握手揮手流程簡介
  • 第一次揮手

用戶端發送一個結束FIN,用來主動關閉和服務端的資料傳輸,釋放連接配接且停止發送資料,封包首部:FIN=1,序列号seq=u;随後用戶端進入終止等待1狀态FIN-WAIT-1。

  • 第二次揮手

服務端收到這個FIN,發出确認封包ACK=1,确認收到序号是收到的序号+1,即ack=u+1,且帶上自己的序列号seq=v,和SYN一樣,一個FIN将占用一個序号。如此,伺服器通知應用程序,用戶端已經沒有資料要發送,如果伺服器發送資料,用戶端依然要接收,該狀态會持續一段時間,服務端進入關閉等待狀态CLOSE-WAIT。用戶端收到伺服器的确認請求後,進入終止等待2狀态FIN-WAIT-2,等待伺服器發送連接配接釋放封包。

  • 第三次揮手

伺服器向用戶端發送釋放連接配接封包FIN=1,ack=u+1,此時服務端還處于半關閉狀态,伺服器可能還會發送一些資料,此時序列号為seq=w,如此,伺服器進入最後确認狀态LAST-ACK,等待用戶端的确認。

  • 第四次揮手

用戶端收到伺服器的連接配接釋放封包後,回發确認,ACK=1,ack=w+1,序列号是seq=u+1,如此,用戶端進入時間等待狀态TIME-WAIT。此時TCP連接配接還沒有釋放,必須經過最長封包段壽命的時間後,才進入CLOSED狀态。MSL:最長封包段壽命,一般2分鐘,TCP連接配接釋放時,主動方必須經過2MSL後才進入CLOSED狀态,是以主動方關閉時間比較晚。

五、源代碼位址

GitHub·位址
https://github.com/cicadasmile/java-base-parent
GitEE·位址
https://gitee.com/cicadasmile/java-base-parent
           
JavaEE基礎(03):Http請求詳解,握手揮手流程簡介