细说Http协议
什么Http協(xié)議
HTTP是HyperText Transfer Protocol(超文本傳輸協(xié)議)的簡(jiǎn)寫(xiě),它是TCP/IP協(xié)議的一個(gè)應(yīng)用層協(xié)議,用于定義WEB瀏覽器與WEB服務(wù)器之間交換數(shù)據(jù)的過(guò)程及數(shù)據(jù)本身的格式。
? 版本:1.1(目前使用的)和1.0
和1.1可以在一次TCP/IP鏈接上,發(fā)出多次請(qǐng)求和得到多次響應(yīng)
1.0每次都必須建立新的TCP/IP鏈接,比較浪費(fèi)資源。
基于HTTP協(xié)議的客戶/服務(wù)器模式的信息交換過(guò)程,如圖所示,它分四個(gè)過(guò)程,建立連接、發(fā)送請(qǐng)求信息、發(fā)送響應(yīng)信息、關(guān)閉連接。
三次握手
請(qǐng)求部分
請(qǐng)求消息頭:客戶端給服務(wù)器端發(fā)送的一些附加信息。
請(qǐng)求部分詳解:
1、請(qǐng)求行:位于請(qǐng)求內(nèi)容的第一行。
請(qǐng)求方式 請(qǐng)求的資源的URI地址 使用的協(xié)議及版本號(hào)
GET /app1/1.html HTTP/1.1
a、請(qǐng)求方式:
請(qǐng)求方式有:GET(默認(rèn)的)、POST、HEAD、DELETE等
GET方式:/app1/1.html?username=abc&password=123。把表單的數(shù)據(jù)緊跟在URI地址后面,用?進(jìn)行分割。問(wèn)號(hào)后面的內(nèi)容,專(zhuān)業(yè)叫法:查詢字符串。請(qǐng)求行的長(zhǎng)度不能超過(guò)1KB。不適合傳遞太多的數(shù)據(jù)。
POST方式:把表單的數(shù)據(jù)放在了請(qǐng)求的正文部分。沒(méi)有長(zhǎng)度限制。
b、請(qǐng)求的URI:
URI:統(tǒng)一資源標(biāo)識(shí)符。http://localhost:8080/app1/1.html(URL),去掉協(xié)議、主機(jī)、端口剩余的叫做URI。
c、客戶端使用的協(xié)議及版本。
2、請(qǐng)求消息頭:
界限:從第2行開(kāi)始,到第一個(gè)空行結(jié)束。
? Accept:瀏覽器可接受的MIME類(lèi)型 。
Accept:text/html.
MIME類(lèi)型是區(qū)分網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)類(lèi)型的。MIME:大類(lèi)型/具體類(lèi)型。MIME類(lèi)型和文件的擴(kuò)展名有對(duì)應(yīng)關(guān)系(Tomcat\conf\web.xml)
? Accept-Charset: 瀏覽器通過(guò)這個(gè)頭告訴服務(wù)器,它支持哪種字符集
? Accept-Encoding:瀏覽器能夠進(jìn)行解碼的數(shù)據(jù)編碼方式,比如gzip
Accept-Language:瀏覽器所希望的語(yǔ)言種類(lèi),當(dāng)服務(wù)器能夠提供一種以上的語(yǔ)言版本時(shí)要用到。 可以在瀏覽器中進(jìn)行設(shè)置。
Host:初始URL中的主機(jī)和端口
? Referer:取值是一個(gè)URL,該URL表示用戶是由哪個(gè)頁(yè)面過(guò)來(lái)的。
? Content-Type:內(nèi)容類(lèi)型:告知服務(wù)器,請(qǐng)求正文的MIME數(shù)據(jù)類(lèi)型,默認(rèn)值:application/x-www-form-urlencoded
? if-Modified-Since: Wed, 02 Feb 2011 12:04:56 GMT利用這個(gè)頭與服務(wù)器的文件進(jìn)行比對(duì),如果一致,則從緩存中直接讀取文件。
? User-Agent:瀏覽器類(lèi)型.
? Content-Length:表示請(qǐng)求消息正文的長(zhǎng)度
? Connection:表示是否需要持久連接。如果服務(wù)器看到這里的值為“Keep -Alive”,或者看到請(qǐng)求使用的是HTTP 1.1(HTTP 1.1默認(rèn)進(jìn)行持久連接
? Cookie:這是最重要的請(qǐng)求頭信息之一 (會(huì)話管理時(shí)再講)
? Date:Date: Mon, 22 Aug 2011 01:55:39 GMT請(qǐng)求時(shí)間GMT
3、請(qǐng)求正文:只有表單的請(qǐng)求方式是POST方式時(shí)才會(huì)出現(xiàn)。
username=abc&password=123 參數(shù)都是:key=value的形式,多個(gè)參數(shù)之間用&進(jìn)行分割。
響應(yīng)部分
響應(yīng)消息頭:服務(wù)器端給客戶端發(fā)送的一些附加信息。
3.1響應(yīng)消息行:位于第一行
服務(wù)器端使用的協(xié)議及版本 響應(yīng)碼 響應(yīng)碼描述
HTTP/1.1 200 OK
a、響應(yīng)碼:
1XX~5XX:目前用到了40個(gè)左右。
記住常用的幾個(gè)狀態(tài)碼:
200:一切正常
302/307:請(qǐng)求重定向
304:服務(wù)器的資源沒(méi)有修改。
404:客戶端訪問(wèn)的地址不存在
500:服務(wù)器端程序遇到異常
3.2響應(yīng)消息頭:(重點(diǎn))
? Location: http://www.it315.org/index.jsp指示新的資源的位置
一般和302、307響應(yīng)碼一起使用,完成請(qǐng)求重定向。
? Server:apache tomcat指示服務(wù)器的類(lèi)型
? Content-Encoding: gzip告知客戶端服務(wù)器發(fā)送的請(qǐng)求正文內(nèi)容的壓縮編碼
? Content-Length: 80 告訴瀏覽器正文的長(zhǎng)度
? Content-Language: zh-cn服務(wù)發(fā)送的文本的語(yǔ)言
? Content-Type: text/html; charset=GB2312服務(wù)器發(fā)送的內(nèi)容的MIME類(lèi)型
? Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT文件的最后修改時(shí)間
? Refresh: 1;url=http://www.it315.org指示客戶端刷新頻率。單位是秒
? Content-Disposition: attachment; filename=aaa.zip指示客戶端下載文件
? Set-Cookie:SS=Q0=5Lb_nQ; path=/search服務(wù)器端發(fā)送的Cookie(會(huì)話管理)
? Expires: -1
? Cache-Control: no-cache (1.1)
? Pragma: no-cache (1.0) 三個(gè)頭一般一起使用,告訴客戶端不要緩存內(nèi)容
? Connection: close/Keep-Alive
? Date: Tue, 11 Jul 2000 18:23:51 GMT
3.3響應(yīng)正文:
和在頁(yè)面上點(diǎn)擊右鍵“查看源碼”看到的是一樣的。
三種禁止瀏覽器緩存的頭字段
// 不要 緩存的 三個(gè) 頭 ://Cache-Control : no-cache // Pragma: no-cache // Expires: Thu, 01 Dec 1994 16:00:00 GMT (時(shí)間值 )// 都是 用于 控制 瀏覽器 緩存的 , 當(dāng)前 是要不緩存, 其 值 是 no-cache, no-cache,Thu, 01 Dec 1994 16:00:00 GMT 時(shí)間值 // 為什么 有三個(gè) 頭 啊 ? // 如果 要 通知 瀏覽器 不緩存, 最好 的方式 這個(gè)三個(gè) 都設(shè)置response.setHeader("Cache-Control", "no-cache");response.setHeader("Pragma", "no-cache");// 設(shè)置 expires 的時(shí)候 需要 調(diào)用 這個(gè) 方法 : setDateHeader(java.lang.String name, long date)response.setDateHeader("Expires", -1);狀態(tài)碼所表示的意義
狀態(tài)行
格式: HTTP版本號(hào) 狀態(tài)碼 原因敘述
舉例:HTTP/1.1 200 OK
狀態(tài)碼用于表示服務(wù)器對(duì)請(qǐng)求的各種不同處理結(jié)果和狀態(tài),它是一個(gè)三位的十進(jìn)制數(shù)。響應(yīng)狀態(tài)碼分為5類(lèi),使用最高位為1到5來(lái)進(jìn)行分類(lèi)如下所示:
一、200狀態(tài)碼:
成功2××: 成功處理了請(qǐng)求的狀態(tài)碼。
1、200 :服務(wù)器已成功處理了請(qǐng)求并提供了請(qǐng)求的網(wǎng)頁(yè)。
2、204: 服務(wù)器成功處理了請(qǐng)求,但沒(méi)有返回任何內(nèi)容。
二、300狀態(tài)碼:
重定向3×× :每次請(qǐng)求中使用重定向不要超過(guò) 5 次。
1、301: 請(qǐng)求的網(wǎng)頁(yè)已永久移動(dòng)到新位置。當(dāng)URLs發(fā)生變化時(shí),使用301代碼。搜索引擎索引中保存新的URL。
2、302: 請(qǐng)求的網(wǎng)頁(yè)臨時(shí)移動(dòng)到新位置。搜索引擎索引中保存原來(lái)的URL。
3、304: 如果網(wǎng)頁(yè)自請(qǐng)求者上次請(qǐng)求后沒(méi)有更新,則用304代碼告訴搜索引擎機(jī)器人,可節(jié)省帶寬和開(kāi)銷(xiāo)。
三、400狀態(tài)碼:
客戶端錯(cuò)誤4×× :表示請(qǐng)求可能出錯(cuò),妨礙了服務(wù)器的處理。
1、400: 服務(wù)器不理解請(qǐng)求的語(yǔ)法。
2、403: 服務(wù)器拒絕請(qǐng)求。
3、404: 服務(wù)器找不到請(qǐng)求的網(wǎng)頁(yè)。服務(wù)器上不存在的網(wǎng)頁(yè)經(jīng)常會(huì)返回此代碼。
4、410 :請(qǐng)求的資源永久刪除后,服務(wù)器返回此響應(yīng)。該代碼與 404(未找到)代碼相似,但在資源以前存在而現(xiàn)在不存在的情況下,有時(shí)用來(lái)替代404 頁(yè)面代碼。如果資源已永久刪除,應(yīng)當(dāng)使用 301 指定資源的新位置。
四、500狀態(tài)碼:
服務(wù)器錯(cuò)誤5×× :表示服務(wù)器在處理請(qǐng)求時(shí)發(fā)生內(nèi)部錯(cuò)誤。這些錯(cuò)誤可能是服務(wù)器本身的錯(cuò)誤,而不是請(qǐng)求出錯(cuò)。
1、500 :服務(wù)器遇到錯(cuò)誤,無(wú)法完成請(qǐng)求。
2、503: 服務(wù)器目前無(wú)法使用(由于超載或停機(jī)維護(hù))。
轉(zhuǎn)載于:https://www.cnblogs.com/xiaowangba/p/6314863.html
總結(jié)
- 上一篇: Java Servlet(三):Serv
- 下一篇: 苹果推送消息服务(转)