一.HTTP協議
1.HTTP定義
HTTP使用統一資源標識符(Uniform Resource Identifiers, URI)來傳輸數據和建立連接。
2.什么是URL?
全稱是UniformResourceLocator, 中文叫統一資源定位符,是互聯網上用來標識某一處資源的地址。以下面這個URL為例,介紹下普通URL的各部分組
成:http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
2.1協議
該URL的協議部分為“http:”,這代表網頁使用的是HTTP協議。在Internet中可以使用多種協議,如HTTP,FTP等等本例中使用的是HTTP協議。在"HTTP"后面的“//”為分隔符
2.2域名
該URL的域名部分為“www.aspxfans.com”。一個URL中,也可以使用IP地址作為域名使用
2.3端口
跟在域名后面的是端口,域名和端口之間使用“:”作為分隔符。端口不是一個URL必須的部分,如果省略端口部分,將采用默認端口
2.4虛擬目錄
從域名后的第一個“/”開始到最后一個“/”為止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例中的虛擬目錄是“/news/”
2.5文件名
從域名后的最后一個“/”開始到“?”為止,是文件名部分,如果沒有“?”,則是從域名后的最后一個“/”開始到“#”為止,是文件部分,如果沒有“?”和“#”,那么從域名后的最后一個“/”開始到結束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一個URL必須的部分,如果省略該部分,則使用默認的文件
2.6錨
從“#”開始到最后,都是錨部分。本例中的錨部分是“name”。錨部分也不是一個URL必須的部分
2.7參數
從“?”開始到“#”為止之間的部分為參數部分,又稱搜索部分、查詢部分。本例中的參數部分為“boardID=5&ID=24618&page=1”。參數可以允許有多個參數,參數與參數之間用“&”作為分隔符。
二.URI和URL區別
2.1什么是URI?
URI是uniform resource identifier,統一資源標識符,用來唯一的標識一個資源。Web上可用的每種資源如HTML文檔、圖像、視頻片段、程序等都是一個來URI來定位的
2.2URI的組成
一般由三部組成:
①訪問資源的命名機制
②存放資源的主機名
③資源自身的名稱,由路徑表示,着重強調於資源。
2.3什么是URL?
URL是uniform resource locator,統一資源定位器,它是一種具體的URI,即URL可以用來標識一個資源,而且還指明了如何locate這個資源。URL是Internet上用來描述信息資源的字符串,主要用在各種WWW客戶程序和服務器程序上,特別是著名的Mosaic。
采用URL可以用一種統一的格式來描述各種信息資源,包括文件、服務器的地址和目錄等。
2.4URL的組成
一般由三部組成:
①協議(或稱為服務方式)
②存有該資源的主機IP地址(有時也包括端口號)
③主機資源的具體地址。如目錄和文件名等
三.HTTP狀態碼
Response 消息中的第一行叫做狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成。狀態碼用來告訴HTTP客戶端,HTTP服務器是否產生了預期的Response.HTTP/1.1中定義了5類狀態碼, 狀態碼由三位數字組成,第一個數字定義了響應的類別
1XX 提示信息 - 表示請求已被成功接收,繼續處理
2XX 成功 - 表示請求已被成功接收,理解,接受
3XX 重定向 - 要完成請求必須進行更進一步的處理
4XX 客戶端錯誤 - 請求有語法錯誤或請求無法實現
5XX 服務器端錯誤 - 服務器未能實現合法的請求
200:表示請求成功
201 正常;緊接 POST 命令。
202 正常;已接受用於處理,但處理尚未完成。
203 正常;部分信息 — 返回的信息只是一部分。
204 正常;無響應 — 已接收請求,但不存在要回送的信息。
3xx 重定向
301 已移動 — 請求的數據具有新的位置且更改是永久的。
302 已找到 — 請求的數據臨時具有不同 URI。
303 請參閱其它 — 可在另一 URI 下找到對請求的響應,且應使用 GET 方法檢索此響應。
304 未修改 — 未按預期修改文檔。
305 使用代理 — 必須通過位置字段中提供的代理來訪問請求的資源。
306 未使用 — 不再使用;保留此代碼以便將來使用。
4xx 客戶機中出現的錯誤
400 錯誤請求 — 請求中有語法問題,或不能滿足請求。
401 未授權 — 未授權客戶機訪問數據。
402 需要付款 — 表示計費系統已有效。
403 禁止 — 即使有授權也不需要訪問。
404 找不到 — 服務器找不到給定的資源;文檔不存在。
407 代理認證請求 — 客戶機首先必須使用代理認證自身。
415 介質類型不受支持 — 服務器拒絕服務請求,因為不支持請求實體的格式。
HTTP 400 - 請求無效
HTTP 401.1 - 未授權:登錄失敗
HTTP 401.2 - 未授權:服務器配置問題導致登錄失敗
HTTP 401.3 - ACL 禁止訪問資源
HTTP 401.4 - 未授權:授權被篩選器拒絕
HTTP 401.5 - 未授權:ISAPI 或 CGI 授權失敗
HTTP 403 - 禁止訪問
HTTP 403 - 對 Internet 服務管理器 (HTML) 的訪問僅限於 Localhost
HTTP 403.1 禁止訪問:禁止可執行訪問
HTTP 403.2 - 禁止訪問:禁止讀訪問
HTTP 403.3 - 禁止訪問:禁止寫訪問
HTTP 403.4 - 禁止訪問:要求 SSL
HTTP 403.5 - 禁止訪問:要求 SSL 128
HTTP 403.6 - 禁止訪問:IP 地址被拒絕
HTTP 403.7 - 禁止訪問:要求客戶證書
HTTP 403.8 - 禁止訪問:禁止站點訪問
HTTP 403.9 - 禁止訪問:連接的用戶過多
HTTP 403.10 - 禁止訪問:配置無效
HTTP 403.11 - 禁止訪問:密碼更改
HTTP 403.12 - 禁止訪問:映射器拒絕訪問
HTTP 403.13 - 禁止訪問:客戶證書已被吊銷
HTTP 403.15 - 禁止訪問:客戶訪問許可過多
HTTP 403.16 - 禁止訪問:客戶證書不可信或者無效
HTTP 403.17 - 禁止訪問:客戶證書已經到期或者尚未生效
HTTP 404.1 - 無法找到 Web 站點
HTTP 404 - 無法找到文件
HTTP 405 - 資源被禁止
HTTP 406 - 無法接受
HTTP 407 - 要求代理身份驗證
HTTP 410 - 永遠不可用
HTTP 412 - 先決條件失敗
HTTP 414 - 請求 - URI 太長
5xx 服務器中出現的錯誤
500 內部錯誤 — 因為意外情況,服務器不能完成請求。
501 未執行 — 服務器不支持請求的工具。
502 錯誤網關 — 服務器接收到來自上游服務器的無效響應。
503 無法獲得服務 — 由於臨時過載或維護,服務器無法處理請求。
HTTP 500 - 內部服務器錯誤
HTTP 500.100 - 內部服務器錯誤 - ASP 錯誤
HTTP 500-11 服務器關閉
HTTP 500-12 應用程序重新啟動
HTTP 500-13 - 服務器太忙
HTTP 500-14 - 應用程序無效
HTTP 500-15 - 不允許請求 global.asa
Error 501 - 未實現
HTTP 502 - 網關錯誤
常見狀態碼:
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden //服務器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
四.使用Fiddler分析GET和POST請求
客戶端發送一個HTTP請求到服務器的請求消息包括以下格式:
4.1Get請求組成
請求行(request line)、請求頭部(header)、空行和請求體(數據)四個部分組成。
請求行解析:
method 表示請求方式
path-to-resource-http 表示請求的資源地址
version-number 表示http的協議版本號
(注意:當使用get方式提交時,請求體body是空的!!!)
看一個get請求的實例,我們訪問博客園首頁http://www.cnblogs.com/fighter007 使用fiddler抓包分析
在看一個post請求實例,我們登陸博客園界面:https://passport.cnblogs.com/user/signin 使用fiddler抓包分析
發送post請求時,請求體是有數據的這一點和get請求區分開!
五、使用Fiddler分析Response消息結構
Response消息的結構和request結構基本一致。同樣也分為三個部分,第一部分叫Response line, 第二部分叫Response header,第三部分是空行,第四部分是body。header和body之間也有個空行, 結構如下圖:
發送一個get請求的實例,查看該請求返回的響應信息。我們訪問博客園首頁http://www.cnblogs.com/fighter007 使用fiddler抓包分析
六、HTTP Request Header(請求頭解析)
6.1 Cache 頭域If-Modified-Since作用: 把瀏覽器端緩存頁面的最后修改時間發送到服務器去,服務器會把這個時間與服務器上實際文件的最后修改時間進行對比。如果時間一致,那么返回304,客戶端就直接使用本地緩存文件。如果時間不一致,就會返回200和新的文件內容。客戶端接到之后,會丟棄舊文件,把新文件緩存起來,並顯示在瀏覽器中.
例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT
If-None-Match
作用: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 當用戶再次請求該資源時,將在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服務器驗證資源的ETag沒有改變(該資源沒有更新),將返回一個304狀態告訴客戶端使用本地緩存文件。否則將返回200狀態和新的資源和Etag. 使用這樣的機制將提高網站的性能
例如: If-None-Match: "03f2b33c0bfcc1:0"
實例如下圖
Cache-Control
作用: 這個是非常重要的規則。 這個用來指定Response-Request遵循的緩存機制。
Client頭域
Accept
作用:瀏覽器端可以接受的媒體類型,
例如:Accept: text/html 代表瀏覽器可以接受服務器回發的類型為 text/html 也就是我們常說的html文檔,如果服務器無法返回text/html類型的數據,服務器應該返回一個406錯誤(non acceptable)通配符 * 代表任意類型。例如 Accept: */* 代表瀏覽器可以處理所有類型,(一般瀏覽器發給服務器都是發這個)
Accept-Encoding:
作用: 瀏覽器申明自己接收的編碼方法,通常指定壓縮方法,是否支持壓縮,支持什么壓縮方法(gzip,deflate),(注意:這不是字符編碼);
例如: Accept-Encoding: gzip, deflate
Accept-Language
作用: 瀏覽器申明自己接收的語言。 語言跟字符集的區別:中文是語言,中文有多種字符集,比如big5,gb2312,gbk等等;
例如: Accept-Language: en-us
User-Agent
作用:告訴HTTP服務器,客戶端使用的操作系統和瀏覽器的名稱和版本.
我們上網登陸論壇的時候,往往會看到一些歡迎信息,其中列出了你的操作系統的名稱和版本,你所使用的瀏覽器的名稱和版本,這往往讓很多人感到很神奇,實際上,服務器應用程序就是從User-Agent這個請求報頭域中獲取到這些信息User-Agent請求報頭域允許客戶端將它的操作系統、瀏覽器和其它屬性告訴服務器。
例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)
Cookie/Login 頭域
Cookie:作用最重要的header, 將cookie的值發送給HTTP 服務器
x-requested-with XMLHttpRequest //表明是AJax異步
什么是異步請求?
當瀏覽器向服務器發送同步請求時,服務處理同步請求的過程中,瀏覽器會處於等待的狀態,服務器處理完請求把數據響應給瀏覽器並覆蓋瀏覽器內存中原有的數據,瀏覽器重新加載頁面並展示服務器響應的數據。那么,有沒有一種技術,可以讓瀏覽器發送請求給服務器,服務器處理請求的過程中,瀏覽器不處於等待的狀態,並且瀏覽器接收響應數據的同時不再重新加載整個頁面,既請求發送之前的數據不丟失,又能實現頁面的局部刷新呢?那就要用到ajax請求——異步請求模型。更多訪問:什么是異步請求ajax?
七、HTTP Response Header(響應頭解析)
Cache頭域
Date
作用: 生成消息的具體時間和日期
例如: Date: Sat, 11 Feb 2012 11:35:14 GMT
Cache-Control:Public 可以被任何緩存所緩存
Cache-Control:Private 內容只緩存到私有緩存中
Cache-Control:no-cache 所有內容都不會被緩存
私有緩存和公共緩存
"public" 指令表示該響應可以被任何中間人(譯者注:比如中間代理、CDN等)緩存。若指定了"public",則一些通常不被中間人緩存的頁面(譯者注:因為默認是private)(比如 帶有HTTP驗證信息(帳號密碼)的頁面 或 某些特定影響狀態碼的頁面),將會被其緩存。而 "private" 則表示該響應是專用於某單個用戶的,中間人不能緩存此響應,該響應只能應用於瀏覽器私有緩存中。
Expires
作用: 瀏覽器會在指定過期時間內使用本地緩存
例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT
Vary
作用:
例如: Vary: Accept-Encoding Accept-Encoding: //默認是identity
Set-Cookie
作用:非常重要的header, 用於把cookie 發送到客戶端瀏覽器, 每一個寫入cookie都會生成一個Set-Cookie.
HTTP Cookie(也叫Web Cookie或瀏覽器Cookie)是服務器發送到用戶瀏覽器並保存在本地的一小塊數據,它會在瀏覽器下次向同一服務器再發起請求時被攜帶並發送到服務器上。通常,它用於告知服務端兩個請求是否來自同一瀏覽器,如保持用戶的登錄狀態
Set-Cookie響應頭部
和Cookie請求頭部
服務器使用Set-Cookie
響應頭部向用戶代理(一般是瀏覽器)發送Cookie信息。一個簡單的Cookie可能像這樣:
Set-Cookie: <cookie名>=<cookie值>
服務器通過該頭部告知客戶端保存Cookie信息。
Entity(實體)頭域
Content-Length
作用:發送給HTTP服務器數據的長度。
例如:Content-Length: 46295
Content-Type(內容類型)
作用:Content-Type
作用:WEB服務器告訴瀏覽器自己響應的對象的類型和字符集
Content-Type
實體頭部用於指示資源的MIME類型 media type 。
在響應中,Content-Type標頭告訴客戶端實際返回的內容的內容類型。瀏覽器會在某些情況下進行MIME嗅探,並不一定遵循此標題的值; 為了防止這種行為,可以將標題 X-Content-Type-Options
設置為 nosniff。
Content-Encoding
Content-Encoding
是一個實體消息首部,用於對特定媒體類型的數據進行壓縮。當這個首部出現的時候,它的值表示消息主體進行了何種方式的內容編碼轉換。這個消息首部用來告知客戶端應該怎樣解碼才能獲取在 Content-Type
中標示的媒體類型內容。
例如:
Content-Type: text/html; charset=utf-8
Content-Type:text/html;charset=GB2312
Content-Type: image/jpeg
Content-Language
Content-Language
是一個 entity header (實體消息首部),用來說明訪問者希望采用的語言或語言組合,這樣的話用戶就可以根據自己偏好的語言來定制不同的內容。是一個 entity header (實體消息首部),用來說明訪問者希望采用的語言或語言組合,這樣的話用戶就可以根據自己偏好的語言來定制不同的內容。
Miscellaneous 頭域
Referer
作用: 提供了Request的上下文信息的服務器,告訴服務器我是從哪個鏈接過來的,比如從我主頁上鏈接到一個朋友那里,他的服務器就能夠從HTTP Referer中統計出每天有多少用戶點擊我主頁上的鏈接訪問他的網站。
Referrer是header的一部分,當瀏覽器向web服務器發出請求的時候,一般會帶上Referer,告訴服務器用戶從那個頁面連接過來的,服務器藉此可以獲得一些信息用於處理。
例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT
X-AspNet-Version、X-Powered-By、Server:
作用:指明HTTP服務器的軟件信息
例如:x-aspnetmvc=version:5.2
X-AspNet-Version:
作用:如果網站是用ASP.NET開發的,這個header用來表示ASP.NET的版本
例如: X-AspNet-Version: 4.0.30319
X-Powered-By:
作用:表示網站是用什么技術開發的
例如: X-Powered-By: ASP.NET
Transport 頭域
Connection
Connection 頭(header) 決定當前的事務完成后,是否會關閉網絡連接。如果該值是“keep-alive”,網絡連接就是持久的,不會關閉,使得對同一個服務器的請求可以繼續在該連接上完成。
close
表明客戶端或服務器想要關閉該網絡連接
八.Get請求和Post請求區別
1.GET請求
GET
,,/books/?sex=man&name=Profing essional阿三 HTTinP/
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
注意最后一行是空行
2.POST請求
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
3.GET和POST提交數據特點
3.1提交方式
GET提交:請求的數據會附在URL之后(就是把數據放置在HTTP協議頭中),以?分割URL和傳輸數據,多個參數用&連接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果數據是英文字母/數字,原樣發送,如果是空格,轉換為+,如果是中文/其他字符,則直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進制表示的ASCII。
POST提交:把提交的數據放置在是HTTP包的包體中。上文示例中紅色字體標明的就是實際的傳輸數據
因此,GET提交的數據會在地址欄中顯示出來,而POST提交,地址欄不會改變。
3.2傳輸數據的大小
首先聲明:HTTP協議沒有對傳輸的數據大小進行限制,HTTP協議規范也沒有對URL長度進行限制。而在實際開發中存在的限制主要有:
GET:特定瀏覽器和服務器對URL長度有限制,例如 IE對URL長度的限制是2083字節(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操作系 統的支持。因此對於GET提交時,傳輸數據就會受到URL長度的 限制。
POST:由於不是通過URL傳值,理論上數據不受 限。但實際各個WEB服務器會規定對post提交數據大小進行限制,Apache、IIS6都有各自的配置。
3.3傳輸的安全性
POST的安全性要比GET的安全性高。比如:通過GET提交數據,用戶名和密碼將明文出現在URL上,因為(1)登錄頁面有可能被瀏覽器緩存;(2)其他人查看瀏覽器的歷史紀錄,那么別人就可以拿到你的賬號和密碼了,除此之外,使用GET提交數據還可能會造成Cross-site request forgery攻擊。
3.4Http get,post,soap協議都是在http上運行的
(1)get:請求參數是作為一個key/value對的序列(查詢字符串)附加到URL上的
查詢字符串的長度受到web瀏覽器和web服務器的限制(如IE最多支持2048個字符),不適合傳輸大型數據集同時,它很不安全
(2)post:請求參數是在http標題的一個不同部分(名為entity body)傳輸的,這一部分用來傳輸表單信息,因此必須將Content-type設置為:application/x-www-form- urlencoded。post設計用來支持web窗體上的用戶字段,其參數也是作為key/value對傳輸。
但是:它不支持復雜數據類型,因為post沒有定義傳輸數據結構的語義和規則。
(3)soap:是http post的一個專用版本,遵循一種特殊的xml消息格式
Content-type設置為: text/xml 任何數據都可以xml化。
Http協議定義了很多與服務器交互的方法,最基本的有4種,分別是 GET,POST,PUT,DELETE. 一個URL地址用於描述一個網絡上的資源,而HTTP中的GET, POST, PUT, DELETE就對應着對這個資源的查,改,增,刪4個操作。 我們最常見的就是GET和POST了。GET一般用於獲取/查詢資源信息,而POST一般用於更新資源信息.
4.GET和POST的區別
1.GET提交的數據會放在URL之后,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的數據放在HTTP包的Body中.
2.GET提交的數據大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.
3..GET方式提交數據,會帶來安全問題,比如一個登錄頁面,通過GET方式提交數據時,用戶名和密碼將出現在URL上,如果頁面可以被緩存或者其他人可以訪問這台機器,就可以從歷史記錄獲得該用戶的賬號和密碼.