學習Java web的第一步, 肯定要先了解的是當今網絡的運行情況; 以及弄懂當今最流行的Http協議究竟是什么?
網絡分層
首先說下網絡分層, 如果現在讓你去從頭開發(fā)一個web通信工具, 你需要考慮什么? 首先你需要考慮把數據怎么分成一個個數據包, 然后要考慮這些數據包要怎么傳輸, 怎么到達你想要它去的那個地方, 然后還要考慮接收端如何接收這些數據, 解碼出來要的數據, 最后還原成想要的最終效果。
這些會讓你覺得很繁瑣, 你不外乎可能只是想要發(fā)送一句話過去其他客戶端, 就要一下子考慮怎么多事情, 還有就是網絡的傳輸什么都非常復雜, 萬一哪里有了變動, 就全部程序都要重寫, 因此, 出現了分層參考模型, 就像面向對象一樣, 把每一層都封裝好, 然后對每一層開發(fā)接口就可以了, 這樣每一層只要負責好自己的事情就可以了, 不用每次都全部考慮。
基于此, ISO指定了一個OSI參考模型(七層) , 這可以說是一個理想化的模型,里面把每個層次都分了出來,雖清晰, 但太多層會導致復雜化,也不便于管理,因此后面又由技術人員開發(fā)了TCP/IP參考模型(四層),大大簡化了層次,這也使得TCP/IP協議得到廣泛的應用。
-
對于OSI參考模型:(用維基百科的圖片說明)
osi參考模型
-
而TCP/IP就大大簡化了層次, 對比關系如下:(我們平時用的最多的Http是在應用層)
TCP/IP參考模型
從上面我們就可以看出整個網絡模型分層后, 我們只要按照各自的協議考慮各自當前層的問題就可以愉快的編程了;
比如一開始的發(fā)送例子, 我們只是想編寫在應用層的程序,所以根本無需考慮下面其他分層傳輸數據包等的事情,只要遵循好協議發(fā)送數據即可,其他都交給其他層的程序考慮,而在應用層我們所用的協議最多的就是Http協議了, 至于http協議怎么和傳輸層進行協助, 我們可以不用關心, 有興趣的可以去讀<<TCP/IP詳解(卷一)>>;
如果要通俗的去講就是我們首先發(fā)送的是HTTP協議報文, 然后會轉換成TCP/IP協議的數據包, 然后根據IP地址進行傳輸, 到客戶端又重新變成TCP/IP協議的數據包, 再變成HTTP協議報文, 返回到客戶端。如下, 每過一層會加一層首部,接收時再逐個去掉。

HTTP協議
因為Java web的編程很少接觸到底層的協議實現,所以我們把關注點放在掌握應用層協議會更好,而當今基本上我們接觸到的應用層協議最多的就是HTTP協議, 你打開一個網站,基本都是HTTP開頭的;
那掌握HTTP協議(Hyper Text Transfer Protocol 超文本傳輸協議)對于我們編寫web程序非常關鍵。
本質: 基于TCP/IP通信協議來傳遞數據的協議;
特點:
- 簡單快捷: 客戶端向服務端請求服務時, 只要傳送請求方法和路徑。
- 靈活: 允許傳輸任意類型的數據對象。(用Content-Type加以標記)
- 無連接:無連接的含義是限制每次連接只處理一個請求。
- 無狀態(tài):HTTP協議為無狀態(tài)協議。
消息格式:(具體的可以自己打開瀏覽器,按F12進行查看)
-
發(fā)送一個HTTP請求時(Request), 需要包含下面的格式(請求行,請求頭部,空號,和請求數據)(get,post用得最多)
HTTP request頭部 -
接收一個HTTP請求時(Response),需要包含下面格式(狀態(tài)行,消息報頭,空號,響應正文)
HTTP response頭部
HTTP工作原理
HTTP協議定義Web客戶端如何從Web服務器請求Web頁面,以及服務器如何把Web頁面?zhèn)鬏斀o客戶端。HTTP協議采用了請求/響應模型??蛻舳讼蚍掌靼l(fā)送了一個請求報文,請求報文包含了請求的方法,URL,協議版本,請求頭部和請求數據。服務器以一個狀態(tài)行作為響應,響應的內容包括協議的版本,成功和錯誤代碼,服務器信息,響應頭部和響應數據。
過程如下:
- 客戶端連接Web服務器:
一個HTTP客戶端,通常是瀏覽器,與Web服務器的HTTP端口(默認為80)建立一個TCP套接字連接。 - 發(fā)送HTTP請求:
通過TCP套接字,客戶端向Web服務器發(fā)送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求數據4部分組成。 - 服務器接受請求并返回HTTP響應:
Web服務器解析請求,定位請求資源。服務器將資源復本寫到TCP套接字,由客戶端讀取。一個響應由狀態(tài)行、響應頭部、空行和響應數據4部分組成。 - 釋放連接TCP連接;
若connection 模式為close,則服務器主動關閉TCP連接,客戶端被動關閉連接,釋放TCP連接;若connection 模式為keepalive,則該連接會保持一段時間,在該時間內可以繼續(xù)接收請求; - 客戶端瀏覽器解析HTML內容
客戶端瀏覽器首先解析狀態(tài)行,查看表明請求是否成功的狀態(tài)代碼。然后解析每一個響應頭,響應頭告知以下為若干字節(jié)的HTML文檔和文檔的字符集??蛻舳藶g覽器讀取響應數據HTML,根據HTML的語法對其進行格式化,并在瀏覽器窗口中顯示。
總結:
網絡的分層使得網絡編程變得十分的便捷,Java Web的編程可以說是作用與應用層的,所以我們必須要了解掌握應用層應用最廣的HTTP協議,所有的網絡請求基本都是基于HTTP請求。
參考文章:



