您好,登錄后才能下訂單哦!
本文源碼:GitHub·點這里 || GitEE·點這里
HTTP超文本傳輸協議,是用于從萬維網服務器傳輸超文本到本地瀏覽器的傳送協議,基于TCP/IP通信協議來傳遞數據:HTML文件、圖片、查詢數據等。HTTP協議基于客戶端-服務端架構模式。瀏覽器作為HTTP客戶端通過URL向服務端即WEB服務器發送請求。Web服務器根據接收到的請求后,處理完請求后向客戶端發送響應信息。
請求服務器時,只需傳送請求方法和路徑。請求類型常用GET、POST。由于HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
HTTP協議是無狀態協議。無狀態是指協議對于事務處理沒有記憶能力。缺少狀態則后續處理需要前面的信息,沒有則需要重新請求,這樣可能導致每次連接傳送的數據量增大。
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
從瀏覽器角度看這個兩種請求的區別:GET方式讀取資源,比如Get到靜態頁面,即使多次讀取不會對訪問數據產生影響,也被稱為"冪等"操作。POST方式在頁面中定義表單,提交表單會把數據提交到服務器,而且多數情況下會產生數據,比如常用的保存數據接口,并非"冪等"操作,不冪等也就意味著不能隨意多次執行。
這里指用Ajax程序請求服務接口,提交的請求類型。或者其他Http請求工具類,還有情況是微服務中各種Feign接口間的請求。這種情況接口發送請求時,限制相對較少,比如REST風格接口常用GET、POST、PUT、DELETE,幾種方式分別獲取、創建、更新、刪除 資源,
HTTPS:是以安全為準則的HTTP通道,是HTTP的安全版,在HTTP請求上加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。簡單來說,HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全。
HTTPS協議的主要作用可以分為兩種:一種是建立一個信息安全通道,來保證數據傳輸的安全;另一種就是確認網站的真實性。
(1)客戶基于Https方式訪問服務端,與服務器建立SSL連接 ;
(2)服務端收到請求后,會將包含公鑰的證書傳送給客戶端 ;
(3)客戶端與服務端進行協調SSL連接的安全等級,也就是指加密的等級 ;
(4)客戶端根據雙方同意的安全等級,建立會話密鑰,使用公鑰將會話密鑰加密,并傳送給服務端 ;
(5)服務端使用私鑰解密出會話中傳遞的內容,使用會話密鑰加密與客戶端之間的通信 ;
Https協議需要到CA申請證書,一般免費證書較少,因而需要一定費用。
Http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協議。
Http和Https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
TCP傳輸控制協議是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。TCP用意在于適應并支持多網絡應用的分層協議層次結構。
這一場景在生活中可以描述為通話:
甲:你好,我是甲,你是乙嗎;
乙:你好甲:我是乙;
甲:正好找你有點事情,身份確認:
客戶端主動向服務器發起請求連接,請求報文中發送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已建立連接狀態。完成三次握手,客戶端與服務器開始傳送數據。
客戶端發送一個結束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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。