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