熟悉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.客戶端解析響應內容獲取資源。