溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JavaEE基礎(chǔ)(03):Http請(qǐng)求詳解,握手揮手流程簡(jiǎn)介

發(fā)布時(shí)間:2020-07-15 09:33:14 來源:網(wǎng)絡(luò) 閱讀:192 作者:知了一笑 欄目:編程語(yǔ)言

本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里

一、Http協(xié)議簡(jiǎn)介

1、概念說明

HTTP超文本傳輸協(xié)議,是用于從萬(wàn)維網(wǎng)服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議,基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù):HTML文件、圖片、查詢數(shù)據(jù)等。HTTP協(xié)議基于客戶端-服務(wù)端架構(gòu)模式。瀏覽器作為HTTP客戶端通過URL向服務(wù)端即WEB服務(wù)器發(fā)送請(qǐng)求。Web服務(wù)器根據(jù)接收到的請(qǐng)求后,處理完請(qǐng)求后向客戶端發(fā)送響應(yīng)信息。

JavaEE基礎(chǔ)(03):Http請(qǐng)求詳解,握手揮手流程簡(jiǎn)介

2、協(xié)議特點(diǎn)

  • 簡(jiǎn)單快速

請(qǐng)求服務(wù)器時(shí),只需傳送請(qǐng)求方法和路徑。請(qǐng)求類型常用GET、POST。由于HTTP協(xié)議簡(jiǎn)單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。

  • 靈活:

HTTP允許傳輸任意類型的數(shù)據(jù)對(duì)象。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。

  • 無(wú)連接

無(wú)連接的含義是限制每次連接只處理一個(gè)請(qǐng)求。服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間。

  • 無(wú)狀態(tài)

HTTP協(xié)議是無(wú)狀態(tài)協(xié)議。無(wú)狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒有記憶能力。缺少狀態(tài)則后續(xù)處理需要前面的信息,沒有則需要重新請(qǐng)求,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。

  • 支持客戶/服務(wù)器模式

二、Http請(qǐng)求詳解

1、請(qǐng)求接口

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、請(qǐng)求內(nèi)容

  • Get請(qǐng)求

地址: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請(qǐng)求

地址: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、參數(shù)說明

  • Method:常見GET 和 POST,另外還有DELETE、PUT 等 ;
  • URI:/servletOneImpl,和Host組成請(qǐng)求的URL ;
  • HTTP/1.1:傳輸協(xié)議Http,版本1.1 ;
  • Host:請(qǐng)求資源所在的主機(jī)和端口 ;
  • Connection:TCP連接默認(rèn)不關(guān)閉,可以被多個(gè)請(qǐng)求復(fù)用 ;
  • Upgrade-Insecure-Requests:瀏覽器不再顯示 https 頁(yè)面中的 http 請(qǐng)求警報(bào) ;
  • Content-Length:指示實(shí)體主體大小,以字節(jié)為單位十進(jìn)制數(shù),發(fā)送到接收方。
  • Cache-Control:max-age=0使用緩存,但是會(huì)立即過期 ;
  • User-Agent:客戶端瀏覽器類型、版本、操作系統(tǒng)等信息 ;
  • Content-Type: 請(qǐng)求或響應(yīng)中,傳輸資源類型信息 ;
  • Origin:當(dāng)前請(qǐng)求出自的站點(diǎn) ;
  • Accept:客戶端聲明自己可以接收的資源格式 ;
  • DNT: 請(qǐng)求禁用用戶追蹤 ;
  • Referer:告訴服務(wù)器該網(wǎng)頁(yè)是從哪個(gè)頁(yè)面鏈接過來 ;
  • Accept-Encoding: 聲明瀏覽器支持的編碼類型 ;
  • Accept-Language: 聲明瀏覽器支持的語(yǔ)言類型 ;
  • Cookie: 辨識(shí)存儲(chǔ)在客戶端的緩存數(shù)據(jù),通常會(huì)加密 ;

4、GET和POST區(qū)別

  • 瀏覽器端

從瀏覽器角度看這個(gè)兩種請(qǐng)求的區(qū)別:GET方式讀取資源,比如Get到靜態(tài)頁(yè)面,即使多次讀取不會(huì)對(duì)訪問數(shù)據(jù)產(chǎn)生影響,也被稱為"冪等"操作。POST方式在頁(yè)面中定義表單,提交表單會(huì)把數(shù)據(jù)提交到服務(wù)器,而且多數(shù)情況下會(huì)產(chǎn)生數(shù)據(jù),比如常用的保存數(shù)據(jù)接口,并非"冪等"操作,不冪等也就意味著不能隨意多次執(zhí)行。

  • 服務(wù)接口

這里指用Ajax程序請(qǐng)求服務(wù)接口,提交的請(qǐng)求類型?;蛘咂渌鸋ttp請(qǐng)求工具類,還有情況是微服務(wù)中各種Feign接口間的請(qǐng)求。這種情況接口發(fā)送請(qǐng)求時(shí),限制相對(duì)較少,比如REST風(fēng)格接口常用GET、POST、PUT、DELETE,幾種方式分別獲取、創(chuàng)建、更新、刪除 資源,

三、Https請(qǐng)求協(xié)議

1、Https簡(jiǎn)介

  • 基礎(chǔ)概念

HTTPS:是以安全為準(zhǔn)則的HTTP通道,是HTTP的安全版,在HTTP請(qǐng)求上加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL。簡(jiǎn)單來說,HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,要比http協(xié)議安全。

  • 安全模式

HTTPS協(xié)議的主要作用可以分為兩種:一種是建立一個(gè)信息安全通道,來保證數(shù)據(jù)傳輸?shù)陌踩?;另一種就是確認(rèn)網(wǎng)站的真實(shí)性。

2、Https工作原理

JavaEE基礎(chǔ)(03):Http請(qǐng)求詳解,握手揮手流程簡(jiǎn)介

(1)客戶基于Https方式訪問服務(wù)端,與服務(wù)器建立SSL連接 ;
(2)服務(wù)端收到請(qǐng)求后,會(huì)將包含公鑰的證書傳送給客戶端 ;
(3)客戶端與服務(wù)端進(jìn)行協(xié)調(diào)SSL連接的安全等級(jí),也就是指加密的等級(jí) ;
(4)客戶端根據(jù)雙方同意的安全等級(jí),建立會(huì)話密鑰,使用公鑰將會(huì)話密鑰加密,并傳送給服務(wù)端 ;
(5)服務(wù)端使用私鑰解密出會(huì)話中傳遞的內(nèi)容,使用會(huì)話密鑰加密與客戶端之間的通信 ;

3、Https和Http區(qū)別

  • 安全證書

Https協(xié)議需要到CA申請(qǐng)證書,一般免費(fèi)證書較少,因而需要一定費(fèi)用。

  • 數(shù)據(jù)傳輸

Http是超文本傳輸協(xié)議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協(xié)議。

  • 連接方式

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

四、TCP傳輸協(xié)議

1、TCP協(xié)議簡(jiǎn)介

TCP傳輸控制協(xié)議是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。TCP用意在于適應(yīng)并支持多網(wǎng)絡(luò)應(yīng)用的分層協(xié)議層次結(jié)構(gòu)。

2、三次握手

這一場(chǎng)景在生活中可以描述為通話:

甲:你好,我是甲,你是乙嗎;
乙:你好甲:我是乙;
甲:正好找你有點(diǎn)事情,身份確認(rèn):

JavaEE基礎(chǔ)(03):Http請(qǐng)求詳解,握手揮手流程簡(jiǎn)介

  • 第一次握手

客戶端主動(dòng)向服務(wù)器發(fā)起請(qǐng)求連接,請(qǐng)求報(bào)文中發(fā)送SYN=1,此時(shí)隨機(jī)生成初始序列號(hào)seq=x,此時(shí),客戶端進(jìn)程進(jìn)入SYN-SENT同步已發(fā)送狀態(tài)。

  • 第二次握手

服務(wù)端收到請(qǐng)求報(bào)文后,確認(rèn)客戶的SYN,如果請(qǐng)求沒有拒絕,則發(fā)出確認(rèn)報(bào)文。報(bào)文中應(yīng)該ACK=1,SYN=1,確認(rèn)號(hào)是ack=x+1,同時(shí)自己也發(fā)送一個(gè)SYN包seq=y,此時(shí),服務(wù)器進(jìn)程進(jìn)入SYN-RCVD同步收到狀態(tài)。

  • 第三次握手

客戶端收到確認(rèn)后,需要向服務(wù)器確認(rèn)報(bào)文的ACK=1,ack=y+1,此時(shí),TCP連接建立,客戶端進(jìn)入ESTABLISHED已建立連接狀態(tài)。完成三次握手,客戶端與服務(wù)器開始傳送數(shù)據(jù)。

3、四次揮手

JavaEE基礎(chǔ)(03):Http請(qǐng)求詳解,握手揮手流程簡(jiǎn)介

  • 第一次揮手

客戶端發(fā)送一個(gè)結(jié)束FIN,用來主動(dòng)關(guān)閉和服務(wù)端的數(shù)據(jù)傳輸,釋放連接且停止發(fā)送數(shù)據(jù),報(bào)文首部:FIN=1,序列號(hào)seq=u;隨后客戶端進(jìn)入終止等待1狀態(tài)FIN-WAIT-1。

  • 第二次揮手

服務(wù)端收到這個(gè)FIN,發(fā)出確認(rèn)報(bào)文ACK=1,確認(rèn)收到序號(hào)是收到的序號(hào)+1,即ack=u+1,且?guī)献约旱男蛄刑?hào)seq=v,和SYN一樣,一個(gè)FIN將占用一個(gè)序號(hào)。如此,服務(wù)器通知應(yīng)用進(jìn)程,客戶端已經(jīng)沒有數(shù)據(jù)要發(fā)送,如果服務(wù)器發(fā)送數(shù)據(jù),客戶端依然要接收,該狀態(tài)會(huì)持續(xù)一段時(shí)間,服務(wù)端進(jìn)入關(guān)閉等待狀態(tài)CLOSE-WAIT??蛻舳耸盏椒?wù)器的確認(rèn)請(qǐng)求后,進(jìn)入終止等待2狀態(tài)FIN-WAIT-2,等待服務(wù)器發(fā)送連接釋放報(bào)文。

  • 第三次揮手

服務(wù)器向客戶端發(fā)送釋放連接報(bào)文FIN=1,ack=u+1,此時(shí)服務(wù)端還處于半關(guān)閉狀態(tài),服務(wù)器可能還會(huì)發(fā)送一些數(shù)據(jù),此時(shí)序列號(hào)為seq=w,如此,服務(wù)器進(jìn)入最后確認(rèn)狀態(tài)LAST-ACK,等待客戶端的確認(rèn)。

  • 第四次揮手

客戶端收到服務(wù)器的連接釋放報(bào)文后,回發(fā)確認(rèn),ACK=1,ack=w+1,序列號(hào)是seq=u+1,如此,客戶端進(jìn)入時(shí)間等待狀態(tài)TIME-WAIT。此時(shí)TCP連接還沒有釋放,必須經(jīng)過最長(zhǎng)報(bào)文段壽命的時(shí)間后,才進(jìn)入CLOSED狀態(tài)。MSL:最長(zhǎng)報(bào)文段壽命,一般2分鐘,TCP連接釋放時(shí),主動(dòng)方必須經(jīng)過2MSL后才進(jìn)入CLOSED狀態(tài),因此主動(dòng)方關(guān)閉時(shí)間比較晚。

五、源代碼地址

GitHub·地址
https://github.com/cicadasmile/java-base-parent
GitEE·地址
https://gitee.com/cicadasmile/java-base-parent

JavaEE基礎(chǔ)(03):Http請(qǐng)求詳解,握手揮手流程簡(jiǎn)介

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI