您好,登錄后才能下訂單哦!
本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里
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)信息。
請(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ú)連接的含義是限制每次連接只處理一個(gè)請(qǐng)求。服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間。
HTTP協(xié)議是無(wú)狀態(tài)協(xié)議。無(wú)狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒有記憶能力。缺少狀態(tài)則后續(xù)處理需要前面的信息,沒有則需要重新請(qǐng)求,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。
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);
}
}
地址: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
地址: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
從瀏覽器角度看這個(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í)行。
這里指用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:是以安全為準(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í)性。
(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ì)話密鑰加密與客戶端之間的通信 ;
Https協(xié)議需要到CA申請(qǐng)證書,一般免費(fèi)證書較少,因而需要一定費(fèi)用。
Http是超文本傳輸協(xié)議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協(xié)議。
Http和Https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
TCP傳輸控制協(xié)議是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。TCP用意在于適應(yīng)并支持多網(wǎng)絡(luò)應(yīng)用的分層協(xié)議層次結(jié)構(gòu)。
這一場(chǎng)景在生活中可以描述為通話:
甲:你好,我是甲,你是乙嗎;
乙:你好甲:我是乙;
甲:正好找你有點(diǎn)事情,身份確認(rè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ù)。
客戶端發(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
免責(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)容。