1.背景介紹
什么是http協議?
在Web應用中,服務器把網頁傳給瀏覽器,實際上就是把網頁的HTML代碼發送給瀏覽器,讓瀏覽器顯示出來。因此,HTTP是在網絡上傳輸HTML的協議,用於瀏覽器和服務器的通信。
HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網(WWW:World Wide Web )服務器傳輸超文本到本地瀏覽器的傳送協議。
HTTP是一個基於TCP/IP協議棧來傳遞數據(HTML 文件, 圖片文件, 查詢結果等)。
HTTP是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分布式超媒體信息系統。
www簡介
維基:萬維網是一個由許多互相鏈接的超文本組成的系統,通過互聯網訪問。
我們通常所說的web就是指萬維網(world wide web)。一般來講,這是一種通過瀏覽器來訪問資源的技術。我們常說的上網,大部指的是上萬維網(web),但是我們經常將萬維網和因特網(Internet)搞混。
因特網是一種網絡互連的技術,它更多指的是物理層面上的互連,具體來說就是:Internet 中包含了一組特定的硬件設備以及讓這些設備可以相互連接的技術,如路由器,光纖,無線基站,手機,以太網等等。
而萬維網應該算是跑在因特網上的一種服務(常見的因特網服務有:E-mail、WWW、FTP、遠程登錄、電子商務等)。因此WEB就是在 Internet 基礎上,提供的一種信息共享服務。這種服務最直觀的感受就是 訪問網頁資源(超文本、圖片、音頻)。在網頁中點擊一個連接,就可以跳轉到另外的一個網頁或網站。
能夠支持web的技術,首先是底層的網絡,因為web就是建立在Internet之上,web的基本協議是HTTP協議,它跑在TCP上的協議之上,而TCP協議又需要IP協議的支持,IP協議又要由底層鏈路層來支撐,所以我們可以從上到下看到這樣一個協議棧 http->tcp->ip->鏈路層協議。
2.知識剖析
HTTP主要特點
①簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯系的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
②靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
③無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
④無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
⑤支持B/S及C/S模式。B/S即Browser/Server,瀏覽器/服務器,C/S即Client/Server,客戶端/服務器
http協議:URL
我們之前講的網絡上的各種資源,都是通過一個叫做URI的東西進行標記的,當然了我們更常見是URL。URI(統一資源標識符)就相當於我們的身份證,能唯一標識出一個人。URL(同一資源定位符),我們可以做個比喻:
住址協議://地球/中國/浙江省/杭州市/西湖區/某大學/14號宿舍樓/525號寢/張三.人
可以看到這個字符串同樣標識出了唯一的一個人,起到了URI的作用,因此URL是URI的子集。不管是利用身份證號進行唯一標識,還是利用定位的方式來進行唯一標識都是URI的一種體現,而URL就是用定位的方式來實現URI。
介紹普通URL的組成部分
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
(1)協議部分:該URL的協議部分為“http:”,這代表網頁使用的是HTTP協議。在"HTTP"后面的“//”為分隔符。
(2)域名部分:該URL的域名部分為“www.aspxfans.com”。一個URL中,也可以使用IP地址作為域名使用。
(3)端口部分:域名后面的是端口,域名和端口之間使用“:”作為分隔符。端口不是URL必須的部分,如果省略端口部分,將采用默認端口
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
(4)虛擬目錄部分:從域名后的第一個“/”開始到最后一個“/”為止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例中的虛擬目錄是“/news/”
(5)文件名部分:從域名后的最后一個“/”開始到“?”為止,是文件名部分,如果沒有“?”,則是從域名后的最后一個“/”開始到“#”為止,是文件部分;如果沒有“?”和“#”,那么從域名后的最后一個“/”開始到結束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一個URL必須的部分,如果省略該部分,則使用默認的文件名。
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
(6)錨部分(該位置的標識符):從“#”(代表網頁中的一個位置)開始到最后,都是錨部分。本例中的錨部分是“name”。錨部分也不是URL必須的部分。
(7)參數部分:從“?”開始到“#”為止之間的部分為參數部分,又稱搜索部分、查詢部分。本例中的參數部分為“boardID=5&ID=24618&page=1”。參數可以允許有多個參數,參數與參數之間用“&”作為分隔符。
http協議:請求消息Request
客戶端發送一個HTTP請求到服務器的請求消息包括以下格式:
請求行(request line)、請求頭部(header)、空行和請求數據四個部分組成。
第一部分:請求行,用來說明請求類型,要訪問的資源以及所使用的HTTP版本.
第二部分:請求頭部,緊接着請求行(即第一行)之后的部分,用來說明服務器要使用的附加信息,如Host: 主機名, Use-Agent: 瀏覽器基本資料, Accept: 瀏覽器能夠識別的響應類型, Accept-Language: 瀏覽器默認語言, Accept-Encoding: 瀏覽器能夠識別的壓縮方式, Referer: 來路頁面, Connecton:是否保持連接。
第三部分:空行,請求頭部后面的空行是必須的。即使第四部分的請求數據為空,也必須有空行。
第四部分:請求數據也叫主體,可以添加任意的其他數據。可以為空。
http協議:響應消息Response
一般情況下,服務器接收並處理客戶端發過來的請求后會返回一個HTTP的響應消息。
HTTP響應也由四個部分組成,分別是:狀態行、消息報頭、空行和響應正文。
第一部分:狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成。 (HTTP/1.1)表明HTTP版本為1.1版本,狀態碼為200,狀態消息為(ok)
第二部分:消息報頭,用來說明客戶端要使用的一些附加信息。
Date:生成響應的日期和時間;Content-Type:指示響應的內容,指定了MIME類型的HTML(text/html),編碼類型是UTF-8
第三部分:空行,消息報頭后面的空行是必須的
第四部分:響應正文,服務器返回給客戶端的文本信息。 空行后面的html部分為響應正文。
http協議:請求方法
根據HTTP標准,HTTP請求可以使用多種請求方法。
HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
GET 請求指定的頁面信息,並返回實體主體。
HEAD 類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭。
POST 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
PUT 從客戶端向服務器傳送的數據取代指定的文檔的內容。
DELETE 請求服務器刪除指定的頁面。
3.常見問題
(1)get和post的區別?
(2)http狀態碼有哪些?
4.解決方案
(1)get和post的區別?
GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
注意最后一行是空行
POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
1)GET提交,請求的數據會附在URL之后(就是把數據放置在HTTP協議頭中),如果數據是英文字母/數字,原樣發送;如果是空格,轉換為+;如果是中文/其他字符,則直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進制表示的ASCII。
POST提交:把提交的數據放置在是HTTP包的包體中。上文示例中紅色字體標明的就是實際的傳輸數據。
因此,GET提交的數據會在地址欄中顯示出來,而POST提交,地址欄不會改變。
2)傳輸數據的大小:首先聲明:HTTP協議沒有對傳輸的數據大小進行限制,HTTP協議規范也沒有對URL長度進行限制。而在實際開發中存在的限制主要有:
GET:特定瀏覽器和服務器對URL長度有限制.
POST:由於不是通過URL傳值,理論上數據不受 限。但實際各個WEB服務器會規定對post提交數據大小進行限制,Apache、IIS6都有各自的配置。
3)安全性: POST的安全性要比GET的安全性高。比如:通過GET提交數據,用戶名和密碼將明文出現在URL上,因為 (1)登錄頁面有可能被瀏覽器緩存;(2)其他人查看瀏覽器的歷史紀錄,那么別人就可以拿到你的賬號和密碼了,除此之外,使用GET提交數據還可能會造成Cross-site request forgery攻擊。
4)GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值。
然而,這些大多是Google出來的,很大一部分文章對get和post的描述都是如此。但是網上還是有不同的意見。具體內容:GET和POST沒有什么除了語義之外的區別,他們就僅僅是個名字而已,如果服務器支持,完全可以把GET改個名字叫GET2;只有一點根本區別,一個用於獲取數據,一個用於修改數據。
那么,網上流傳甚廣的這些個說法是從何而來的呢?來源:在HTML標准中,有相似的描述。但是這只是HTML標准對HTTP協議的用法的約定。不能當成GET和POST的區別。具體請Google:HTML標准、RFC文檔(請求注解,被譽為網絡知識聖經)
(2)http狀態碼有哪些?
狀態代碼有三位數字組成,第一個數字定義了響應的類別,共分五種類別:
1xx:指示信息--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:服務器端錯誤--服務器未能實現合法的請求
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
403 Forbidden //服務器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
8.更多討論
(1)http請求content-Type有幾種,有什么區別?
網上查詢了一下content-type有多少種:將近200種。
主要的三種:
application/x-www-form-urlencoded:數據被編碼為名稱/值對。這是標准的編碼格式。這種方式用的比較多。
multipart/form-data: 數據被編碼為一條消息,頁上的每個控件對應消息中的一個部分。一般上傳文件才會使用這種方式。
text/plain: 數據以純文本形式(text/json/xml/html)進行編碼,其中不含任何控件或格式字符。一般向服務端發送json數據會使用這種方式。
(2)HTTP與HTTPS有什么區別?
HTTP協議傳輸的數據都是未加密的,也就是明文的,因此使用HTTP協議傳輸隱私信息非常不安全,為了保證這些隱私數據能加密傳輸,於是網景公司設計了SSL(Secure Sockets Layer)協議用於對HTTP協議傳輸的數據進行加密,從而就誕生了HTTPS。
(3)什么是Connection: Keep-Alive模式?
http 1.0中默認是:Connection: close;http 1.1中默認啟用Keep-Alive。
HTTP協議采用“請求-應答”模式,為非KeepAlive模式時,每個請求/應答客戶和服務器都要新建一個連接,完成 之后立即斷開連接(HTTP協議為無連接的協議);當使用Keep-Alive模式(又稱持久連接、連接重用)時,Keep-Alive功能使客戶端到服 務器端的連接持續有效,當出現對服務器的后繼請求時,Keep-Alive功能避免了建立或者重新建立連接。啟用Keep-Alive模式更高效,性能更高。
