學(xué)習(xí)Java Web首先要知道Web應(yīng)用程序的請求過程,客戶端與服務(wù)器之間是如何通信的,這樣我們可以更加靈活的處理請求和響應(yīng)的消息。
什么是HTTP協(xié)議?
HTTP是超文本傳輸協(xié)議(Hypertext Transfer Protocol),它是TCP/IP協(xié)議的一個應(yīng)用層協(xié)議,用于定義WEB瀏覽器與WEB服務(wù)器之間的交換數(shù)據(jù)的過程。(HTTP所用的端口號80,HTTPS所用端口號是443)
主要特點
- 簡單快速:客戶端向服務(wù)器請求服務(wù)時,只需傳送請求方法和路徑。
- 無連接:無連接的含義是限制每次只處理一個請求。服務(wù)器處理完客戶的請求,并受到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時間
- 無狀態(tài):HTTP是一個無狀態(tài)的協(xié)議,無狀態(tài)是指WEB瀏覽器和服務(wù)器之間不需要建立持久的聯(lián)系。
HTTP工作原理
HTTP的工作流程:
1.客戶端連接到web服務(wù)器
當(dāng)我們在瀏覽器輸入網(wǎng)址或者當(dāng)我們點擊鏈接時,HTTP開始工作。
2.發(fā)送HTTP請求
建立連接后,客戶機發(fā)送一個請求給服務(wù)器,如當(dāng)我們在瀏覽器地址欄輸入Michaeljian.top 后回車,瀏覽器將我們的請求封裝成HTTP報文。請求報文的格式:
- 請求行
- 請求頭部
- 空行
- 請求數(shù)據(jù)
3.服務(wù)器接受請求并返回HTTP響應(yīng)
Web服務(wù)器解析請求,定義請求資源。服務(wù)器將資源復(fù)本 寫到TCP套接字中,有客戶端讀取。響應(yīng)報文的格式:
- 狀態(tài)行
- 響應(yīng)頭部
- 空行
- 響應(yīng)數(shù)據(jù)
4.釋放TCP連接
若connection 模式為close,則服務(wù)器主動關(guān)閉TCP連接,客戶端被動關(guān)閉連接,釋放TCP連接;若connection 模式為keepalive,則該連接會保持一段時間,在該時間內(nèi)可以繼續(xù)接收請求。
5.客戶端瀏覽器解析HTML內(nèi)容
客戶端瀏覽器首先會解析狀態(tài)行,查看請求是否成功的狀態(tài)代碼。然后解析每一個響應(yīng)頭,響應(yīng)頭告知以下為若干字節(jié)的HTML文檔和文檔的字符集??蛻舳藶g覽器讀取響應(yīng)數(shù)據(jù)HTML,根據(jù)HTML的語法對其進行格式化,并在瀏覽器窗口中顯示。
DNS域名解析
在瀏覽器地址欄輸入URL,按下回車之后會經(jīng)歷以下流程:
瀏覽器向DNS服務(wù)器請求解析該URL中的域名對應(yīng)的IP地址;
解析出IP地址后,根據(jù)該IP地址和默認(rèn)端口80,和服務(wù)器建立TCP連接;
瀏覽器發(fā)出讀取文件(URL中域名后面部分對應(yīng)的文件)的HTTP請求,該請求報文作為TCP三次握手的第三個報文的數(shù)據(jù)發(fā)送給服務(wù)器;
服務(wù)器對瀏覽器請求做出響應(yīng),并把對應(yīng)的HTML文本發(fā)送給瀏覽器;
釋放TCP連接;
-
瀏覽器將該HTML文本并顯示內(nèi)容;
image.png
HTTP協(xié)議版本以及區(qū)別
HTTP協(xié)議的版本:HTTP/1.0、HTTP/1.1、HTTP/2.0
- 在HTTP1.0協(xié)議中,客戶端與web服務(wù)器建立連接后,只能獲得一個web資源。
- 在HTTP1.1協(xié)議,允許客戶端與web服務(wù)器建立連接后,在一個連接上獲取多個web資源。
- 在HTTP2.0協(xié)議中,
- 新的二進制格式:HTTP1.x的解析是基于文本協(xié)議的格式 解析存在天然的缺陷,文本的表現(xiàn)形式有多樣性,要做到健壯性考慮的場景必然很多,二級制在不同,只有0和1的組合?;谶@種考慮HTTP2.0的協(xié)議解析決定采用二進制的格式,實現(xiàn)方便且健壯。
- 多路復(fù)用:即連接共享,每個request都是用作連接共享機制的。
- header壓縮,如上文中所言,對前面提到過HTTP1.x的header帶有大量信息,而且每次都要重復(fù)發(fā)送,HTTP2.0使用encoder來減少需要傳輸?shù)膆eader大小,通訊雙方各自cache一份header fields表,既避免了重復(fù)header的傳輸,又減小了需要傳輸?shù)拇笮 ?/li>
- 服務(wù)端推送(server push),同SPDY一樣,HTTP2.0也具有server push功能。
URI和URL的區(qū)別
URL是統(tǒng)一資源地位符(Uniform Resource Locator)。URL是URI的一種,不僅標(biāo)識了Web 資源,還指定了操作或者獲取方式,同時指出了主要訪問機制和網(wǎng)絡(luò)位置。
http://michaeljian.top/
URI是統(tǒng)一資源標(biāo)識符(Uniform Resource Identifier)。URI是個純粹的語法結(jié)構(gòu),用于指定標(biāo)識Web資源的字符串的各個部分。
例子:ftp://ftp.is.co.za/rfc/rfc1808.txt (also a URL because of the protocol)
URN是統(tǒng)一資源名稱(Uniform Resource Name)URN是URI的一種,用特定命名空間的名字標(biāo)識資源。使用URN可以在不知道其網(wǎng)絡(luò)位置及訪問方式的情況下討論資源。

HTTP之請求消息Request
客戶端發(fā)送一個HTTP請求到服務(wù)器的請求消息包括以下格式:
請求行(request line)、請求頭部(header)、空行和請求數(shù)據(jù)四個部分組成。

請求行
請求行中個請求方式最常用的是GET和POST,用戶如果沒有設(shè)置,默認(rèn)情況下瀏覽器向服務(wù)器發(fā)送的都是get請求,例如在瀏覽器直接輸?shù)刂吩L問,點超鏈接訪問等都是get,用戶如想把請求方式改為post,可通過更改表單的提交方式實現(xiàn)。
兩種方式的主要區(qū)別:
如果請求方式為GET方式,則可以在請求的URL地址后以?的形式帶上交給服務(wù)器的數(shù)據(jù),多個數(shù)據(jù)之間以&進行分隔,例如:
GET /mail/1.html?name=abc&password=xyz HTTP/1.1。在URL地址后附帶的參數(shù)是有限制的-
如果請求方式為POST方式,則可以在請求的實體內(nèi)容中向服務(wù)器發(fā)送數(shù)據(jù),Post方式的特點:傳送的數(shù)據(jù)量無限制。
HTTP之響應(yīng)消息Response
一個HTTP響應(yīng)代表服務(wù)器向客戶端回送的數(shù)據(jù),它包括: 一個狀態(tài)行、若干消息頭、以及實體內(nèi)容 。

HTTP之狀態(tài)碼

HTTP與HTTPS的區(qū)別
HTTP是HTTP協(xié)議運行在TCP之上。所有傳輸?shù)膬?nèi)容都是明文,客戶端和服務(wù)器端都無法驗證對方的身份。
HTTPS是HTTP運行在SSL/TLS之上,SSL/TLS運行在TCP之上。所有傳輸?shù)膬?nèi)容都經(jīng)過加密,加密采用對稱加密,但對稱加密的密鑰用服務(wù)器方的證書進行了非對稱加密。此外客戶端可以驗證服務(wù)器端的身份,如果配置了客戶端驗證,服務(wù)器方也可以驗證客戶端的身份。

