簡(jiǎn)介
HTTP是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫膳算。它是一個(gè)應(yīng)用層且無(wú)狀態(tài)的協(xié)議,由請(qǐng)求和響應(yīng)構(gòu)成皮胡,是標(biāo)準(zhǔn)的客戶端服務(wù)器(C/S)模型童太。
http位置圖
http協(xié)議基于tcp協(xié)議之上亩冬,有時(shí)也在tls或ssl協(xié)議層之上,變成https:
默認(rèn)端口:
http -> 80
https -> 443
https的實(shí)現(xiàn)原理
有兩種基本的加解密算法類型:
- 對(duì)稱加密:密鑰只有一個(gè)公条,加密解密為同一個(gè)密碼拇囊,且加解密速度快,典型的對(duì)稱加密算法有DES靶橱、AES等寥袭;
-
非對(duì)稱加密:密鑰成對(duì)出現(xiàn)(且根據(jù)公鑰無(wú)法推知私鑰,根據(jù)私鑰也無(wú)法推知公鑰)关霸,加密解密使用不同密鑰(公鑰加密需要私鑰解密传黄,私鑰加密需要公鑰解密),相對(duì)對(duì)稱加密速度較慢队寇,典型的非對(duì)稱加密算法有RSA膘掰、DSA等。
下面看一下https的通信過(guò)程:
https通信的優(yōu)點(diǎn):
- 客戶端產(chǎn)生的密鑰只有客戶端和服務(wù)器端能得到佳遣;
- 加密的數(shù)據(jù)只有客戶端和服務(wù)器端才能得到明文识埋;
- 客戶端到服務(wù)端的通信是安全的凡伊。
請(qǐng)求-響應(yīng)模型
http協(xié)議永遠(yuǎn)都是客戶端發(fā)起請(qǐng)求,服務(wù)端回送響應(yīng):
工作流程
一次http操作窒舟,其工作原理可分為四步:
- 客戶端與服務(wù)端建立tcp連接系忙,這個(gè)過(guò)程會(huì)經(jīng)歷tcp的三次握手,簡(jiǎn)單敘述就是:
一:SYN<seq(x=0)>惠豺,
二:SYN<seq(y=0)>笨觅,ACK<x+1>,
三:SYN<seq(x+1)>耕腾,ACK<y+1>见剩。 - 客戶端發(fā)送一個(gè)標(biāo)準(zhǔn)格式的http請(qǐng)求。
- 服務(wù)端給予相應(yīng)的http響應(yīng)信息扫俺。
- 斷開(kāi)連接苍苞。
請(qǐng)求/響應(yīng)頭域
頭域 = 域名 + 冒號(hào) + 域值 (三部分組成),其中狼纬,域名無(wú)大小寫之分羹呵,頭域可以有多個(gè)。除了常用標(biāo)準(zhǔn)的頭域疗琉,也可以自定義自己的頭域冈欢。
比如,請(qǐng)求頭格式:
Host: www.baidu.com\r\n
Cookie: k=v\r\n
響應(yīng)頭格式也一樣:
Content-Type: image/gif\r\n
Set-Cookie: k=v\r\n
http請(qǐng)求格式
http方法 [空格] 請(qǐng)求url [空格] http版本號(hào) [回車換行]
頭域
[回車換行]
實(shí)體內(nèi)容
舉例:
GET /hello.htm HTTP/1.1
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
hello world
http響應(yīng)格式
http版本號(hào) [空格] 狀態(tài)碼 [空格] 原因 [回車換行]
頭域
[回車換行]
實(shí)體內(nèi)容
舉例:
HTTP/1.1 400 bad request
Server: Apache-Coyote/1.1
hello world
http狀態(tài)碼
狀態(tài)代碼有三位數(shù)字組成盈简,第一個(gè)數(shù)字定義了響應(yīng)的類別凑耻,且有五種可能取值:
1xx:指示信息--表示請(qǐng)求已接收,繼續(xù)處理
100——客戶必須繼續(xù)發(fā)出請(qǐng)求
101——客戶要求服務(wù)器根據(jù)請(qǐng)求轉(zhuǎn)換HTTP協(xié)議版本2xx:成功--表示請(qǐng)求已被成功接收柠贤、理解香浩、接受
200——交易成功
201——提示知道新文件的URL
202——接受和處理、但處理未完成
203——返回信息不確定或不完整
204——請(qǐng)求收到臼勉,但返回信息為空
205——服務(wù)器完成了請(qǐng)求邻吭,用戶代理必須復(fù)位當(dāng)前已經(jīng)瀏覽過(guò)的文件
206——服務(wù)器已經(jīng)完成了部分用戶的GET請(qǐng)求3xx:重定向--要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作
300——請(qǐng)求的資源可在多處得到
301——?jiǎng)h除請(qǐng)求數(shù)據(jù)
302——在其他地址發(fā)現(xiàn)了請(qǐng)求數(shù)據(jù)
303——建議客戶訪問(wèn)其他URL或訪問(wèn)方式
304——客戶端已經(jīng)執(zhí)行了GET,但文件未變化
305——請(qǐng)求的資源必須從服務(wù)器指定的地址得到
306——前一版本HTTP中使用的代碼宴霸,現(xiàn)行版本中不再使用
307——申明請(qǐng)求的資源臨時(shí)性刪除4xx:客戶端錯(cuò)誤--請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)
400——錯(cuò)誤請(qǐng)求囱晴,如語(yǔ)法錯(cuò)誤
401——未授權(quán)
HTTP 401.1 - 未授權(quán):登錄失敗
HTTP 401.2 - 未授權(quán):服務(wù)器配置問(wèn)題導(dǎo)致登錄失敗
HTTP 401.3 - ACL 禁止訪問(wèn)資源
HTTP 401.4 - 未授權(quán):授權(quán)被篩選器拒絕
HTTP 401.5 - 未授權(quán):ISAPI 或 CGI 授權(quán)失敗
402——保留有效ChargeTo頭響應(yīng)
403——禁止訪問(wèn)
HTTP 403.1 禁止訪問(wèn):禁止可執(zhí)行訪問(wèn)
HTTP 403.2 - 禁止訪問(wèn):禁止讀訪問(wèn)
HTTP 403.3 - 禁止訪問(wèn):禁止寫訪問(wèn)
HTTP 403.4 - 禁止訪問(wèn):要求 SSL
HTTP 403.5 - 禁止訪問(wèn):要求 SSL 128
HTTP 403.6 - 禁止訪問(wèn):IP 地址被拒絕
HTTP 403.7 - 禁止訪問(wèn):要求客戶證書
HTTP 403.8 - 禁止訪問(wèn):禁止站點(diǎn)訪問(wèn)
HTTP 403.9 - 禁止訪問(wèn):連接的用戶過(guò)多
HTTP 403.10 - 禁止訪問(wèn):配置無(wú)效
HTTP 403.11 - 禁止訪問(wèn):密碼更改
HTTP 403.12 - 禁止訪問(wèn):映射器拒絕訪問(wèn)
HTTP 403.13 - 禁止訪問(wèn):客戶證書已被吊銷
HTTP 403.15 - 禁止訪問(wèn):客戶訪問(wèn)許可過(guò)多
HTTP 403.16 - 禁止訪問(wèn):客戶證書不可信或者無(wú)效
HTTP 403.17 - 禁止訪問(wèn):客戶證書已經(jīng)到期或者尚未生效
404——沒(méi)有發(fā)現(xiàn)文件、查詢或URl
405——用戶在Request-Line字段定義的方法不允許
406——根據(jù)用戶發(fā)送的Accept拖瓢谢,請(qǐng)求資源不可訪問(wèn)
407——類似401畸写,用戶必須首先在代理服務(wù)器上得到授權(quán)
408——客戶端沒(méi)有在用戶指定的時(shí)間內(nèi)完成請(qǐng)求
409——對(duì)當(dāng)前資源狀態(tài),請(qǐng)求不能完成
410——服務(wù)器上不再有此資源且無(wú)進(jìn)一步的參考地址
411——服務(wù)器拒絕用戶定義的Content-Length屬性請(qǐng)求
412——一個(gè)或多個(gè)請(qǐng)求頭字段在當(dāng)前請(qǐng)求中錯(cuò)誤
413——請(qǐng)求的資源大于服務(wù)器允許的大小
414——請(qǐng)求的資源URL長(zhǎng)于服務(wù)器允許的長(zhǎng)度
415——請(qǐng)求資源不支持請(qǐng)求項(xiàng)目格式
416——請(qǐng)求中包含Range請(qǐng)求頭字段恩闻,在當(dāng)前請(qǐng)求資源范圍內(nèi)沒(méi)有range指示值艺糜,請(qǐng)求也不包含If-Range請(qǐng)求頭字段
417——服務(wù)器不滿足請(qǐng)求Expect頭字段指定的期望值,如果是代理服務(wù)器,可能是下一級(jí)服務(wù)器不能滿足請(qǐng)求長(zhǎng)破停。5xx:服務(wù)器端錯(cuò)誤--服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求
HTTP 500 - 內(nèi)部服務(wù)器錯(cuò)誤
HTTP 500.100 - 內(nèi)部服務(wù)器錯(cuò)誤 - ASP 錯(cuò)誤
HTTP 500-11 服務(wù)器關(guān)閉
HTTP 500-12 應(yīng)用程序重新啟動(dòng)
HTTP 500-13 - 服務(wù)器太忙
HTTP 500-14 - 應(yīng)用程序無(wú)效
HTTP 500-15 - 不允許請(qǐng)求 global.asa
Error 501 - 未實(shí)現(xiàn)
HTTP 502 - 網(wǎng)關(guān)錯(cuò)誤
斷點(diǎn)續(xù)傳和多線程下載的實(shí)現(xiàn)原理
HTTP協(xié)議的GET方法翅楼,支持只請(qǐng)求某個(gè)資源的某一部分;
206 Partial Content 部分內(nèi)容響應(yīng)真慢;
Range 請(qǐng)求的資源范圍毅臊;
Content-Range 響應(yīng)的資源范圍;
在連接斷開(kāi)重連時(shí)黑界,客戶端只請(qǐng)求該資源未下載的部分管嬉,而不是重新請(qǐng)求整個(gè)資源,來(lái)實(shí)現(xiàn)斷點(diǎn)續(xù)傳朗鸠。
分塊請(qǐng)求資源實(shí)例:
eg1:Range: bytes=306302- :請(qǐng)求這個(gè)資源從306302個(gè)字節(jié)到末尾的部分蚯撩;
eg2:Content-Range: bytes 306302-604047/604048:響應(yīng)中指示攜帶的是該資源的第306302-604047的字節(jié),該資源共604048個(gè)字節(jié)烛占;
客戶端通過(guò)并發(fā)的請(qǐng)求相同資源的不同片段胎挎,來(lái)實(shí)現(xiàn)對(duì)某個(gè)資源的并發(fā)分塊下載。從而達(dá)到快速下載的目的忆家。目前流行的FlashGet和迅雷基本都是這個(gè)原理犹菇。
多線程下載的原理:
- 下載工具開(kāi)啟多個(gè)發(fā)出HTTP請(qǐng)求的線程;
- 每個(gè)http請(qǐng)求只請(qǐng)求資源文件的一部分:Content-Range: bytes 20000-40000/47000芽卿;
- 合并每個(gè)線程下載的文件揭芍。