一、http初識
(一)HTTP協(xié)議簡介
超文本傳輸協(xié)議(英文:Hyper Text Transfer Protocol驾荣,縮寫:HTTP)是互聯(lián)網上應用最為廣泛的一種網絡協(xié)議外构。設計HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁面的方法。通過HTTP協(xié)議請求的資源由統(tǒng)一資源標識符(Uniform Resource Identifiers播掷,URI)來標識审编。
(二)HTTP協(xié)議的主要特點可概括如下:
簡單:客戶向服務器請求服務時,只需傳送請求方法和路徑歧匈。請求方法常用的有GET垒酬、POST、PUT。每種方法規(guī)定了客戶與服務器聯(lián)系的不同類型伤溉。由于HTTP協(xié)議簡單般码,使得HTTP服務器的程序規(guī)模小,因而通信速度很快乱顾。
靈活:HTTP允許傳輸任意類型的數據對象板祝。正在傳輸的類型由Content-Type加以標記。
請求-響應模式:客戶端每次向服務器發(fā)起一個請求時都建立一個連接走净, 服務器處理完客戶端的請求即斷開連接券时。
(三)HTTP工作流程
HTTP,是符合C/S模型的伏伯,總是Client端來發(fā)起請求橘洞。
1、客戶機(瀏覽器)主動向服務器(web server)發(fā)出連接請求说搅。
2炸枣、服務器接受連接請求并建立起連接。 (1,2步即TCP三次握手)
3弄唧、客戶機通過此連接向服務器發(fā)出GET等http命令适肠,(“HTTP請求報文”)。
4候引、服務器接到命令并根據命令向客戶機傳送相應的數據侯养,(“HTTP響應報文”)。
5澄干、客戶機接收從服務器送過來的數據逛揩。
6、服務器發(fā)送完數據后麸俘,主動關閉此次連接辩稽。 (”TCP四次分手“)。
概況起來就是 客戶/服務器傳輸過程可分為四個基本步驟:
- 瀏覽器與服務器建立連接疾掰; (TCP三次握手)
- 瀏覽器向服務器請求文檔搂誉;
- 服務器響應瀏覽器請求徐紧;
- 斷開連接静檬。(”TCP四次分手“)
(四)HTTP協(xié)議的URL,URI介紹
HTTP協(xié)議中的URL(URL是一種特殊類型的URI(Uniform Resource Identifier),包含了用于查找某個資源的足夠的信息)
主要是用于定位服務器端資源的位置并级。我們來看下它的語法定義:
http://host[:port][path]
http://localhost:8080/LoginAndRegister/login
其中:
http:// 表示我們要使用HTTP協(xié)議拂檩;
host 表示一個可用的域名或IP地址踱侣;
port 為可選槽奕,表示要請求的端口號,缺省情況下為80
path 為可選覆致,表示要請求的資源所在的路徑(也叫URI),缺省情況下為/ ,如果URL中沒有給出path望抽,那么當它作為請求URI時加矛,必須以“/”的形式給出,比如瀏覽器中輸入: www.abc.edu.cn 則瀏覽器自動換成 www.abc.edu.cn/ 煤篙。
二斟览、HTTP協(xié)議結構
(一)HTTP協(xié)議格式比較簡單,格式如下:
由上圖也可以看出來 HTTP 有兩類報文:
請求報文——從客戶向服務器發(fā)送請求報文辑奈。
響應報文——從服務器到客戶的回答苛茂。
(二)HTTP 請求方法概述:
方法(操作) 意義
GET: 請求讀取由URL所標識的信息 參數是放在URL里面的
POST: 給服務器發(fā)送數據 參數是放在請求體里面
HEAD: 請求讀取由URL所有標識的信息的首部
PUT: 在指明的URL下存儲一個文檔
OPTION: 請求一些選項的信息
DELETE: 刪除指明的URL所標識的資源
TRACE: 用來進行環(huán)回測試的請求報文
CONNECT: 用于代理服務器
(三)HTTP狀態(tài)碼
狀態(tài)碼都是三位數字,第一位表示狀態(tài)類別鸠窗,共分五種妓羊,如下:
1xx表示通知消息的,如請求收到了或正在進行處理
2xx表示成功稍计,如接受或知道了
3xx表示重定向躁绸,表示要完成請求還必須采取進一步的行動
4xx表示客戶端的差錯,如請求中有錯誤的語法或不能完成
5xx表示服務器的差錯臣嚣,如服務器失效無法完成請求
其實常用的狀態(tài)碼并不多涨颜,我們把常見的列舉在此: 200 OK:客戶端請求成功了,客戶端要的東西就在響應報文里了茧球;
301 Moved Permanently:客戶端啊庭瑰,你要請求的資源已經永久的搬家了,我把他的新地址放到了Location頭部域中了抢埋;
302 Moved Temporarily:客戶端啊弹灭,你要請求的資源臨時有事去別的地方了,我把他的位置放到了Location頭部域中了揪垄,你可以先去那里找他穷吮,不過他應該是會回到他自己的家的;
304 Not Modified:客戶端啊饥努,你要請求的資源自從上次你請求之后捡鱼,就再也沒有改動過,我想你是應該早就有這個資源了酷愧,所以在響應報文的數據部分我也沒有再放這個資源驾诈。
400 Bad Request:客戶端發(fā)來的請求報文里有語法錯誤,服務器端實在看不懂了溶浴;
401 Unauthorized:客戶端發(fā)來的請求不是合法來源的請求乍迄,也就是這個客戶端是沒有被授權的;
403 Forbidden:服務器端順利收到了客戶端的請求士败,但是因為某些理由闯两,服務器端拒絕為他提供服務
404 Not Found:客戶端要請求的資源不存在,八成是資源地址寫錯了;
500 Internal Server Error:很遺憾漾狼,服務器不能給你提供服務了重慢,服務器內部出現(xiàn)了不可預知的問題了;
502 Bad Gateway:客戶端你好逊躁,我是請求報文的代理服務器伤锚,持有資源的那個服務器在給我發(fā)送資源時出問題了;
503 Server Unavailable:服務器現(xiàn)在是太忙了志衣,暫時不能給你這個客戶端提供服務了屯援,或許稍后會恢復。
三念脯、關于HTTP請求GET和POST的區(qū)別
1.GET提交:請求的數據會附在URL之后(就是把數據放置在HTTP協(xié)議頭<request-line>中)狞洋,以?分割URL和傳輸數據,多個參數用&連接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD绿店。如果數據是英文字母/數字吉懊,原樣發(fā)送,如果是其他類型的則需要編碼后發(fā)送
POST提交:把提交的數據放置在HTTP包的包體<request-body>中假勿。上文示例中紅色字體標明的就是實際的傳輸數據
因此借嗽,GET提交的數據會在地址欄中顯示出來,而POST提交转培,地址欄不會顯示出數據
2.傳輸數據的大卸竦肌:
首先聲明,HTTP協(xié)議沒有對傳輸的數據大小進行限制,HTTP協(xié)議規(guī)范也沒有對URL長度進行限制浸须。 而在實際開發(fā)中存在的限制主要有:
GET:特定服務器對URL長度有限制惨寿,例如IE對URL長度的限制是2048字節(jié)。對于其他瀏覽器删窒,如Netscape裂垦、FireFox等,理論上沒有長度限制肌索,其限制取決于操作系統(tǒng)以及服務器的支持蕉拢。
因此對于GET提交時,傳輸數據就會受到URL長度的限制诚亚。
POST:由于不是通過URL傳值晕换,理論上數據不受限。但實際各個WEB服務器會規(guī)定對post提交數據大小進行限制亡电,Apache届巩、IIS6都有各自的配置硅瞧。
3.安全性:
POST的安全性要比GET的安全性高份乒。通過GET提交數據,用戶名和密碼將明文出現(xiàn)在URL上,
因為:(1)登錄頁面有可能被瀏覽器緩存或辖,(2)其他人查看瀏覽器的歷史紀錄瘾英,那么別人就可以拿到你的賬號和密碼了。
四颂暇、報文講解
(一)請求報文
請求報文 報文格式如下:
空白行用CR LF對表示缺谴。CRLF對是回車(Carriage Return,CR)和換行(Line Feed耳鸯,LF)字符的ASCII碼湿蛔,它表示報頭組件的結束。
為了深入理解HTTP 協(xié)議請求報文县爬,下面直接來一個例子:
GET img.t.sinajs.cn/t5/style/css/module/base/home_frame.css?version=cc73de6cd25d6dbf HTTP/1.1
/* 第一行叫做請求行(request)阳啥,其他的各行都叫做頭部行(header)請求行包括三個字段:
方法字段、URI字段财喳、HTTP版本字段 這個例子的請求行察迟,是要做這樣一件事:用HTTP協(xié)議
1.1版本,使用GET方法耳高,向服務端申請/t5/style/css/module/base/home_frame.css?version=cc73de6cd25d6dbf資源 /
/ 下面都屬于頭部行 /
Host: img.t.sinajs.cn
/ Host用來指定要請求的服務器端主機為img.t.sinajs.cn
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0
/* User-agent域則是用來指定當前這個請求報文是由誰產生的扎瓶,通常來說,一般這里設置的是用戶所使用的瀏覽器類型泌枪。/
Accept: text/css,/;q=0.1
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
/ Accept-language域概荷,客戶端所能識別的語言 如果沒有 則 采取默認語言 /
Accept-Encoding: gzip, deflate
/客戶端所能識別的編碼壓縮格式 gzip*/
Referer: http://weibo.com/840450770/home=5&page=2&pre_page=1&end_id=3664048949921640&end_msign=-1
Connection: keep-alive
- /* 這里有一個空行,而且是必須有這個空行碌燕。這是HTTP協(xié)議的硬性規(guī)定乍赫。 */
請求報文段就是下面這樣,細細琢磨吧陆蟆。
GET /t5/style/css/module/base/home_frame.css?version=cc73de6cd25d6dbf HTTP/1.1Host: img.t.sinajs.cnUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0Accept: text/css,/;q=0.1Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateReferer: http://weibo.com/840450770/home?wvr=5&page=2&pre_page=1&end_id=3664048949921640&end_msign=-1Connection: keep-alive
(二)響應報文
響應報文格式如下:
一般情況下雷厂,服務器接收并處理客戶端發(fā)過來的請求后會返回一個HTTP的響應消息。HTTP的響應消息也是由三個部分組成叠殷,
分別是:響應行/狀態(tài)行改鲫、響應頭、空行林束、響應數據像棘。
舉例:
/* 第一行是狀態(tài)行,包括三個字段:版本字段壶冒、狀態(tài)碼字段缕题、原因短語字段 /
HTTP/1.1 200 OK
/ 本例中,HTTP協(xié)議的響應報文想表達的意思是服務器使用的是HTTP協(xié)議1.1版本胖腾,
而且找到了客戶端所要的資源烟零,且會將響應報文發(fā)給客戶端瘪松,整個過程都很正常 /
Expires: Wed, 22 Jan 2014 02:51:09 GMT
/給出響應過期的日期和時間。為了讓代理服務器或瀏覽器在一段時間以后更新緩存中的內容
(再次訪問曾訪問過的頁面時锨阿,直接從緩存中加載宵睦,縮短響應時間和降低服務器負載)
我們可以使用Expires指定頁面過期的時間)/
Date: Tue, 07 Jan 2014 02:51:09 GMT
/ 這里記錄了這個響應報文被發(fā)送出去的時間點 /
Server: nginx/1.4.2 Apache 阿帕奇
/ Server域表明這個響應報文是nginx服務器發(fā)出的,且nginx的版本是1.4.2 /
Content-Type: text/css
/ 指出所包含的數據是txt/css文本內容 /
Last-Modified: Mon, 06 Jan 2014 07:50:31 GMT
/ 用于記錄本響應報文中所存的數據的最后修改時間 /
Transfer-Encoding: chunked
/服務端向客戶端傳輸數據所采用的傳輸模式(僅在HTTP1.1中出現(xiàn))/
Cache-Control: max-age=1296000
/服務端要求中間代理及客戶端如何緩存自己響應的數據/
Content-Encoding: gzip
/用于記錄文檔的壓縮方法 gzip/
Age: 1
X-Via: 1.1 whjyw137:3 (Cdn Cache Server V2.0)
Connection: keep-alive
/ 服務器端會保持住這個連接*/
/* 看這里墅诡,還得看這里壳嚎,和請求報文類似,這里也有一個空行 */
(實際數據 …………)
響應報文末早,原報文如下:
HTTP/1.1 200 OK Expires: Wed, 22 Jan 2014 02:51:09 GMTDate: Tue, 07 Jan 2014 02:51:09 GMTServer: nginx/1.4.2Content-Type: text/cssLast-Modified: Mon, 06 Jan 2014 07:50:31 GMTTransfer-Encoding: chunkedCache-Control: max-age=1296000Content-Encoding: gzipAge: 1X-Via: 1.1 whjyw137:3 (Cdn Cache Server V2.0)Connection: keep-alive
五烟馅、telnet命令
使用telnet命令 可以使本機與遠程服務器構建一個連接
使用telnet命令模擬http請求報文 然后服務器返回響應報文
telnet www.baidu.com 80
GET /index.html HTTP/1.1
Host:www.baidu.com
Connection:close
回車空行
回車空行