1. 程式人生 > >JavaEE基礎(03):Http請求詳解,握手揮手流程簡介

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

本文原始碼:GitHub·點這裡 || GitEE·點這裡

一、Http協議簡介

1、概念說明

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

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工作原理

(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、三次握手

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

甲:你好,我是甲,你是乙嗎;
乙:你好甲:我是乙;
甲:正好找你有點事情,身份確認:

  • 第一次握手

客戶端主動向伺服器發起請求連線,請求報文中傳送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、四次揮手

  • 第一次揮手

客戶端傳送一個結束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