java網絡通信:HTTP協議


  熟悉java的同學,都知道javaEE當中很大一部分的內容,是WEB開發,那么在進行WEB開發的學習過程當中,除了需要學習SpringMVC/STRUTS2等框架以外,我們還需要對在WEB開發當中常用到的協議有所了解,那就是HTTP協議,今天就簡單的記錄一下自己學習HTTP協議的一些內容吧。文中參考了許多前人寫的博客以及自己的一些理解,在文中末尾會進行參考標注。

  首先我們先大體了解一下什么是HTTP協議,所謂的HTTP協議,全稱:超文本傳輸協議,是用於從WEB服務器傳輸超文本(各類前端代碼,如html等)到本地瀏覽器的傳送協議。它是一個傳輸層基於TCP的應用層協議,它工作於客戶端-服務端架構為上,瀏覽器(HTTP客戶端)通過URL向HTTP服務端(WEB服務器)發送所有請求。Web服務器根據接收到的請求后,向客戶端發送響應信息。它主要有以下特點:

1.簡單快捷:客戶端向服務端請求服務的時候,只需要傳輸請求方法(put、get、post、delete等)和URL即可(有的時候請求當中還需要攜帶body,這是后話)。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。

2.靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記(如有興趣知道它可以傳輸什么類型的內容,可以查詢以下Content-Type的類型表格)。

3.無連接:所謂的無連接,就是說HTTP是一個請求-響應的形式協議,即客戶端發起一次請求,服務器相應該請求之后即斷開連接。采用這種方式可以節省傳輸時間。

4.無狀態:指協議對於事務處理沒有記憶能力。優點是:在服務器不需要先前信息時它的應答就較快。但其缺點也很明顯:在缺少狀態意味着如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。

在大體了解了HTTP協議的內容和特點,我們再從細節介紹一下HTTP協議常涉及的一些重點,在特點1當中我們提到,HTTP只需要傳輸請求方法和URL即可,那么什么是URL呢?

 

HTTP之URL

  URL全稱:統一資源定位符,是互聯網上用來標識某一處資源的地址。所謂標識某一處資源地址的意思就是,通過這個URL,我們可以在互聯網上找到這個資源,再形象點比如,這個就相當於快遞要寄到家里時,需要查看的寄件地址。那么我們通過一個例子來看看URL是由哪幾個部分組成的。

http://www.mycomputer.com:8080/wellhold/test/index.jsp?name=wellhold

通過這個地址我們來分析一下一個完整的url是由哪幾部分組成的:

協議部分:http

域名部分:www.mycomputer.com,有時候可以是唯一的IP地址表示(實際上域名最后還是會被DNS映射到IP地址的)

端口號部分:8080

虛擬地址部分:/wellhold/test/,表示可以在上述域名的服務器的這個地址找到該HTTP請求想要的資源

請求文件名:index.jsp,想要的資源名稱

參數部分:name=wellhold,請求當中需要攜帶的參數(參數部分不是必須的)

通過這個例子,就可以看出一個完整的URL主要分為了以上幾個部分。

那么了解了URL之后,我們發現在介紹URL的時候,總是提到一個HTTP請求,那么HTTP請求當中究竟有什么東西了?接下來我們介紹一下HTTP請求。

 

HTTP Request(請求)

一個完整的HTTP Request主要包含了以下部分:請求行(request line)、請求頭部(header)、空行、請求數據。二話不說,先上一張圖:

再通過一個例子來說明:

POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley

第一部分:請求行,第一行明了是post請求,以及http1.1版本。
第二部分:請求頭部,第二行至第六行。HOST將指出請求的目的地.User-Agent,服務器端和客戶端腳本都能訪問它,它是瀏覽器類型檢測邏輯的重要基礎.該信息由你的瀏覽器來定義,並且在每個請求中自動發送等等
第三部分:空行,第七行的空行。
第四部分:請求數據,第八行。

其實也是很簡單明了的東西,這里就不再進行贅述了,接下來我們再了解了解HTTP當中的response

 

HTTP RESPONSE(響應)

http的相應也主要是由四個部分組成:狀態行、消息報頭、空行和正文。

第一行為狀態行,(HTTP/1.1)表明HTTP版本為1.1版本,狀態碼為200,狀態消息為(ok)

第二行和第三行為消息報頭,Date:生成響應的日期和時間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8

之后接着一行空行

最后接着就是正文。

 

附:關於http當中的狀態碼含義

1xx:指示信息--表示請求已接收,繼續處理

2xx:成功--表示請求已被成功接收、理解、接受

3xx:重定向--要完成請求必須進行更進一步的操作

4xx:客戶端錯誤--請求有語法錯誤或請求無法實現,400:請求有語法錯誤、404:資源不存在、401:請求未授權、403:服務器拒絕服務

5xx:服務器端錯誤--服務器未能實現合法的請求,500:服務器發生錯誤、503:服務器當前不能提供服務,一段時間后可恢復。

 

 在了解完了HTTP協議的各大要素之后,我們來看看HTTP協議的具體工作的原理,或者說是流程是怎么樣的呢?

 

HTTP工作原理(流程)

  HTTP采用的是請求/響應的模式,客戶端向服務器發送一個請求報文(HTTP Request),在這個報文包含了請求行(請求方法、URL、版本號)、請求頭部(host、user-agent、content-type、connection)、請求數據(可以沒有,在post當中有,在get當中將請求數據寫入了url當中)。服務器接受到請求以后,以一個HTTP Response進行響應,響應包括了狀態行(版本號、狀態碼)、響應報頭(date、content-type、)以及響應正文(請求的具體資源)。以下是具體的工作步驟:

1.客戶端向服務器發起請求:HTTP客戶端(通常是瀏覽器)與WEB服務器的HTTP端口(默認80)建立一個TCP套接字的連接。

2.發送HTTP請求:客戶端通過tcp套接字向服務器發送一個HTTP Request

3.服務器響應請求:WEB服務器解析請求后,在服務器當中尋找到相應的要請求的資源,將資源裝入HTTP Response,復寫到TCP的套接字,由客戶端讀取。

4.釋放TCP連接:若在HTTP Request當中的connection為close,則服務器主動關閉連接;若connection為keepalive,則連接保持一段時間,在該時間內可以繼續接受請求。

5.客戶端解析響應內容獲取資源。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM