HTTP數(shù)據(jù)包詳解
什么是HTTP協(xié)議
超文本傳輸協(xié)議(英語(yǔ):Hyper Text Transfer Protocol,縮寫:HTTP)是一種用于分布式、協(xié)作式和超媒體信息系統(tǒng)的應(yīng)用層協(xié)議[1]。HTTP是萬(wàn)維網(wǎng)的數(shù)據(jù)通信的基礎(chǔ)。
目前廣泛流行使用的是1999年6月公布的HTTP/1.1 版本,HTTP/2已經(jīng)出現(xiàn),但不常用
HTTP/2
當(dāng)前版本,于2015年5月作為互聯(lián)網(wǎng)標(biāo)準(zhǔn)正式發(fā)布。[5]
HTTP/3
最新版本,于2022年6月6日標(biāo)準(zhǔn)化為RFC9114。[6]會(huì)拋棄使用TCP,通過(guò)UDP上使用QUIC來(lái)承載應(yīng)用層數(shù)據(jù)。
插播:TCP/IP協(xié)議
參考鏈接:https://cloud.tencent.com/developer/article/2359341
TCP/IP(Transmission Control Protocol/Internet Protocol,傳輸控制協(xié)議/互聯(lián)網(wǎng)協(xié)議)是互聯(lián)網(wǎng)的基本協(xié)議,也是國(guó)際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ)。
TCP/IP 不是指一個(gè)協(xié)議,也不是 TCP 和 IP 這兩個(gè)協(xié)議的合稱,而是一個(gè)協(xié)議族,包括多個(gè)網(wǎng)絡(luò)協(xié)議,比如 IP、ICMP(Internet Control Message Protocol,互聯(lián)網(wǎng)控制報(bào)文協(xié)議)、TCP、HTTP(Hyper Text Transfer Protocol,超文本傳輸協(xié)議)、FTP(File Transfer Protocol,文件傳輸協(xié)議)、POP3(Post Office Protocol version 3,郵局協(xié)議)等。
TCP/IP 定義了計(jì)算機(jī)操作系統(tǒng)如何連入互聯(lián)網(wǎng),以及數(shù)據(jù)傳輸?shù)臉?biāo)準(zhǔn)。
TCP/IP 是為了解決不同系統(tǒng)的計(jì)算機(jī)之間的傳輸通信而提出的一個(gè)標(biāo)準(zhǔn),不同系統(tǒng)的計(jì)算機(jī)采用了同一種協(xié)議后,就能相互通信,從而能夠建立網(wǎng)絡(luò)連接,實(shí)現(xiàn)資源共享和網(wǎng)絡(luò)通信。就像兩個(gè)不同國(guó)家的人,用同一種語(yǔ)言就能相互交流了。
1. 協(xié)議介紹:
TCP/IP協(xié)議族包括許多協(xié)議,其中一些最重要的包括:
- IP協(xié)議(Internet Protocol): 它定義了互聯(lián)網(wǎng)上的唯一標(biāo)識(shí)符(IP地址),并負(fù)責(zé)數(shù)據(jù)包的路由和轉(zhuǎn)發(fā)。
- TCP協(xié)議(Transmission Control Protocol): 提供可靠的、面向連接的數(shù)據(jù)傳輸。它確保數(shù)據(jù)以正確的順序到達(dá)目標(biāo),并具有錯(cuò)誤檢測(cè)和重傳機(jī)制。
- UDP協(xié)議(User Datagram Protocol):** 提供無(wú)連接的、不可靠的數(shù)據(jù)傳輸。它用于一些實(shí)時(shí)應(yīng)用程序,如音頻和視頻流。
- ICMP協(xié)議(Internet Control Message Protocol): 用于網(wǎng)絡(luò)故障診斷和錯(cuò)誤報(bào)告。
- ARP協(xié)議(Address Resolution Protocol): 用于將IP地址映射到物理MAC地址。
- HTTP協(xié)議(Hypertext Transfer Protocol): 用于在Web上傳輸超文本文檔,是萬(wàn)維網(wǎng)的基礎(chǔ)。
- FTP協(xié)議(File Transfer Protocol): 用于文件傳輸。
- SMTP協(xié)議(Simple Mail Transfer Protocol): 用于電子郵件的發(fā)送。
- DNS****協(xié)議(Domain Name System): 用于將域名解析為IP地址。
2. 數(shù)據(jù)傳輸:
TCP/IP協(xié)議的數(shù)據(jù)傳輸是端到端的,意味著數(shù)據(jù)從一個(gè)端點(diǎn)(例如計(jì)算機(jī))傳輸?shù)搅硪粋€(gè)端點(diǎn),通過(guò)一系列的中間路由器和交換機(jī)。數(shù)據(jù)被分為數(shù)據(jù)包,每個(gè)數(shù)據(jù)包包含源和目標(biāo)IP地址以及端口號(hào)。
數(shù)據(jù)傳輸過(guò)程如下:
- 發(fā)送端將數(shù)據(jù)劃分為數(shù)據(jù)包,添加源IP地址、目標(biāo)IP地址和端口號(hào)。
- 數(shù)據(jù)包從源計(jì)算機(jī)發(fā)送到目標(biāo)計(jì)算機(jī),經(jīng)過(guò)中間路由器和交換機(jī)。
- 路由器根據(jù)目標(biāo)IP地址將數(shù)據(jù)包路由到下一跳。
- 目標(biāo)計(jì)算機(jī)接收數(shù)據(jù)包,根據(jù)端口號(hào)將數(shù)據(jù)傳遞給相應(yīng)的應(yīng)用程序。
3. 子網(wǎng)和路由:
TCP/IP網(wǎng)絡(luò)通常分為多個(gè)子網(wǎng),每個(gè)子網(wǎng)有自己的IP地址范圍。路由器用于連接不同的子網(wǎng),負(fù)責(zé)數(shù)據(jù)包的轉(zhuǎn)發(fā)。
4. 安全性:
TCP/IP協(xié)議并不特別關(guān)注安全性,因此需要額外的安全協(xié)議來(lái)確保數(shù)據(jù)的保密性和完整性。例如,SSL/TLS協(xié)議用于加密數(shù)據(jù)傳輸,IPSec協(xié)議用于虛擬專用網(wǎng)絡(luò)(V**)的安全性。
5.TCP/IP的分層結(jié)構(gòu):
TCP/IP 協(xié)議族按照層次由上到下分成 4 層,分別是應(yīng)用層(Application Layer)、傳輸層(Transport Layer)、網(wǎng)絡(luò)層(Internet Layer,或稱網(wǎng)際層)和網(wǎng)絡(luò)接口層(Network Interface Layer,或稱數(shù)據(jù)鏈路層)。
應(yīng)用層包含所有的高層協(xié)議,比如 Telnet(Telecommunications Network,遠(yuǎn)程登錄協(xié)議)、FTP、SMTP(Simple Mail Transfer Protocol,簡(jiǎn)單郵件傳輸協(xié)議)、DNS(Domain Name Service,域名服務(wù))、NNTP(Net News Transfer Protocol,網(wǎng)絡(luò)新聞傳輸協(xié)議)和 HTTP 等。Telnet 允許一臺(tái)機(jī)器上的用戶登錄遠(yuǎn)程機(jī)器進(jìn)行工作,F(xiàn)TP 提供將文件從一臺(tái)機(jī)器上移到另一臺(tái)機(jī)器上的有效方法,SMTP用于電子郵件的收發(fā),DNS 用于把主機(jī)名映射到網(wǎng)絡(luò)地址,NNTP 用于新聞的發(fā)布、檢索和獲取,HTTP 用于在 WWW 上獲取主頁(yè)。
應(yīng)用層的下面一層是傳輸層,著名的 TCP 和 UDP(User Datagram Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)就在這一層。TCP 是面向連接的協(xié)議,它提供可靠的報(bào)文傳輸和對(duì)上層應(yīng)用的連接服務(wù)。為此,除了基本的數(shù)據(jù)傳輸外,它還有可靠性保證、流量控制、多路復(fù)用、優(yōu)先權(quán)和安全性控制等功能。UDP 是面向無(wú)連接的不可靠傳輸協(xié)議,主要用于不需要TCP的排序和流量控制等功能的應(yīng)用程序。
傳輸層的下面一層是網(wǎng)絡(luò)層,該層是整個(gè) TCP/IP 體系結(jié)構(gòu)的關(guān)鍵部分,其功能是使主機(jī)可以把數(shù)據(jù)報(bào)(Packet,或稱為分組)發(fā)往任何網(wǎng)絡(luò),并使分組獨(dú)立地傳向目標(biāo)。這些分組經(jīng)由不同的網(wǎng)絡(luò)到達(dá)的順序和發(fā)送的順序可能不同。網(wǎng)絡(luò)層使用的協(xié)議有 IP。
網(wǎng)絡(luò)層的下面是數(shù)據(jù)鏈路層,該層是整個(gè)體系結(jié)構(gòu)的基礎(chǔ)部分,負(fù)責(zé)接收 IP 層的 IP 數(shù)據(jù)報(bào),通過(guò)網(wǎng)絡(luò)向外發(fā)送,或接收從網(wǎng)絡(luò)上來(lái)的物理幀,抽出 IP 數(shù)據(jù)報(bào),向 IP 層發(fā)送。該層是主機(jī)與網(wǎng)絡(luò)的實(shí)際連接層。
數(shù)據(jù)鏈路層下面就是實(shí)體線路(比如以太網(wǎng)絡(luò)、光纖網(wǎng)絡(luò)等)。數(shù)據(jù)鏈路層有以太網(wǎng)、令牌環(huán)網(wǎng)等標(biāo)準(zhǔn),負(fù)責(zé)網(wǎng)卡設(shè)備的驅(qū)動(dòng)、幀同步(就是從網(wǎng)線上檢測(cè)到什么信號(hào)算作新幀的開始)、沖突檢測(cè)(如果檢測(cè)到?jīng)_突就自動(dòng)重發(fā))、數(shù)據(jù)差錯(cuò)校驗(yàn)等工作。交換機(jī)可以在不同的數(shù)據(jù)鏈路層的網(wǎng)絡(luò)之間(比如十兆以太網(wǎng)和百兆以太網(wǎng)之間、以太網(wǎng)和令牌環(huán)網(wǎng)之間)轉(zhuǎn)發(fā)數(shù)據(jù)幀,由于不同數(shù)據(jù)鏈路層的幀格式不同,交換機(jī)要將進(jìn)來(lái)的數(shù)據(jù)報(bào)拆掉報(bào)頭重新封裝之后再轉(zhuǎn)發(fā)。
不同的協(xié)議層對(duì)數(shù)據(jù)報(bào)有不同的稱謂,在傳輸層叫作段(Segment),在網(wǎng)絡(luò)層叫作數(shù)據(jù)報(bào)(Datagram),在數(shù)據(jù)鏈路層叫作幀(Frame)。數(shù)據(jù)封裝成幀后發(fā)送到傳輸介質(zhì)上,到達(dá)目的主機(jī)后,每層協(xié)議再剝掉相應(yīng)的報(bào)頭,最后將應(yīng)用層數(shù)據(jù)交給應(yīng)用程序處理。
我們來(lái)看一個(gè)例子。以瀏覽某個(gè)網(wǎng)頁(yè)為例,看一下瀏覽網(wǎng)頁(yè)的過(guò)程中 TCP/IP 各層做了哪些工作。
發(fā)送方:
打開瀏覽器,輸入網(wǎng)址 www.xxx.com,按回車鍵來(lái)訪問(wèn)網(wǎng)頁(yè),其實(shí)就是訪問(wèn) Web 服務(wù)器上的網(wǎng)頁(yè),在應(yīng)用層采用的協(xié)議是 HTTP,瀏覽器將網(wǎng)址等信息組成 HTTP 數(shù)據(jù),并將數(shù)據(jù)傳送給傳輸層。
傳輸層在數(shù)據(jù)前面加上 TCP 報(bào)頭,并標(biāo)記端口為 80(Web 服務(wù)器的默認(rèn)端口),將這個(gè)數(shù)據(jù)段給了網(wǎng)絡(luò)層。
網(wǎng)絡(luò)層在這個(gè)數(shù)據(jù)段前面加上自己機(jī)器的 IP 和目的 IP,這時(shí)該段被稱為 IP 數(shù)據(jù)報(bào),然后將這個(gè) IP 數(shù)據(jù)報(bào)給了數(shù)據(jù)鏈路層。
數(shù)據(jù)鏈路層先在 IP 數(shù)據(jù)報(bào)前面加上自己機(jī)器的 MAC 地址以及目的 MAC 地址,加上 MAC 地址的數(shù)據(jù)稱為幀,然后通過(guò)物理網(wǎng)卡把這個(gè)幀以比特流的方式發(fā)送到網(wǎng)絡(luò)上。
互聯(lián)網(wǎng)上有路由器,它會(huì)讀取比特流中的 IP 地址進(jìn)行路由操作,到達(dá)正確的網(wǎng)段后,這個(gè)網(wǎng)段的交換機(jī)讀取比特流中的 MAC 地址,從而找到要接收的對(duì)應(yīng)機(jī)器。
接收方:
數(shù)據(jù)鏈路層用網(wǎng)卡接收到了比特流,讀取比特流中的幀,將幀中的 MAC 地址去掉,就成了 IP 數(shù)據(jù)報(bào),傳遞給網(wǎng)絡(luò)層。
網(wǎng)絡(luò)層接收下層傳來(lái)的 IP 數(shù)據(jù)報(bào),將 IP 從包的前面拿掉,取出帶有 TCP 的數(shù)據(jù)(數(shù)據(jù)段)交給傳輸層。
傳輸層拿到了這個(gè)數(shù)據(jù)段,看到 TCP 標(biāo)記的端口是 80,說(shuō)明應(yīng)用層協(xié)議是 HTTP,之后將 TCP 頭去掉并將數(shù)據(jù)交給應(yīng)用層,告訴應(yīng)用層對(duì)方請(qǐng)求的是 HTTP 數(shù)據(jù)。
應(yīng)用層得知發(fā)送方請(qǐng)求的是 HTTP 數(shù)據(jù),因此調(diào)用 Web 服務(wù)器程序把 www.xxx.com 的首頁(yè)文件發(fā)送回去
URL詳解
URL(Uniform Resource Locator) 地址用于描述一個(gè)網(wǎng)絡(luò)上的資源, 基本格式如下
schema://host[:port#]/path/.../[?query-string][#anchor]
scheme 指定低層使用的協(xié)議(例如:http, https, ftp)
host HTTP服務(wù)器的IP地址或者域名
port# HTTP服務(wù)器的默認(rèn)端口是80,這種情況下端口號(hào)可以省略。如果使用了別的端口,必須指明,例如 http://www.cnblogs.com:8080/
path 訪問(wèn)資源的路徑
query-string 發(fā)送給http服務(wù)器的數(shù)據(jù)
anchor 錨 用于跳轉(zhuǎn)(快速滾動(dòng))到當(dāng)前頁(yè)面的某個(gè)特定id位置(例如:<p id="myAnchor">這是一個(gè)錨點(diǎn)的示例</p>
,則anchor設(shè)置為#myanchor)
以下是URL 的一個(gè)例子
http://www.mywebsite.com/sj/test/test.aspx?name=sviergn&x=true#stuff
Schema: http
host: www.mywebsite.com
path: /sj/test/test.aspx
Query String: name=sviergn&x=true
Anchor: stuff
請(qǐng)求方法
HTTP/1.1協(xié)議中共定義了八種方法(也叫“動(dòng)作”)來(lái)以不同方式操作指定的資源:
-
GET
向指定的資源發(fā)出“顯示”請(qǐng)求。使用GET方法應(yīng)該只用在讀取資料,而不應(yīng)當(dāng)被用于產(chǎn)生“副作用”的操作中,例如在網(wǎng)絡(luò)應(yīng)用程序中。其中一個(gè)原因是GET可能會(huì)被網(wǎng)絡(luò)爬蟲等隨意訪問(wèn)。參見安全方法。瀏覽器直接發(fā)出的GET只能由一個(gè)url觸發(fā)。GET上要在url之外帶一些參數(shù)就只能依靠url上附帶querystring。
-
HEAD
與GET方法一樣,都是向服務(wù)器發(fā)出指定資源的請(qǐng)求。只不過(guò)服務(wù)器將不傳回資源的本文部分。它的好處在于,使用這個(gè)方法可以在不必傳輸全部?jī)?nèi)容的情況下,就可以獲取其中“關(guān)于該資源的y信息”(元信息或稱元數(shù)據(jù))。
-
POST
向指定資源提交數(shù)據(jù),請(qǐng)求服務(wù)器進(jìn)行處理(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求本文中。這個(gè)請(qǐng)求可能會(huì)建立新的資源或修改現(xiàn)有資源,或二者皆有。每次提交,表單的數(shù)據(jù)被瀏覽器用編碼到HTTP請(qǐng)求的body里。瀏覽器發(fā)出的POST請(qǐng)求的body主要有兩種格式,一種是application/x-www-form-urlencoded用來(lái)傳輸簡(jiǎn)單的數(shù)據(jù),大概就是"key1=value1&key2=value2"這樣的格式。另外一種是傳文件,會(huì)采用multipart/form-data格式。采用后者是因?yàn)閍pplication/x-www-form-urlencoded的編碼方式對(duì)于文件這種二進(jìn)制的數(shù)據(jù)非常低效。
-
PUT
向指定資源位置上傳其最新內(nèi)容。
-
DELETE
請(qǐng)求服務(wù)器刪除Request-URI所標(biāo)識(shí)的資源。
-
TRACE
回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷。
-
OPTIONS
這個(gè)方法可使服務(wù)器傳回該資源所支持的所有HTTP請(qǐng)求方法。用’*'來(lái)代替資源名稱,向Web服務(wù)器發(fā)送OPTIONS請(qǐng)求,可以測(cè)試服務(wù)器功能是否正常運(yùn)作。
-
CONNECT
HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為隧道方式的代理服務(wù)器。通常用于SSL加密服務(wù)器的鏈接(經(jīng)由非加密的HTTP代理服務(wù)器)。
方法名稱是區(qū)分大小寫的。當(dāng)某個(gè)請(qǐng)求所針對(duì)的資源不支持對(duì)應(yīng)的請(qǐng)求方法的時(shí)候,服務(wù)器應(yīng)當(dāng)返回狀態(tài)碼405(Method Not Allowed),當(dāng)服務(wù)器不認(rèn)識(shí)或者不支持對(duì)應(yīng)的請(qǐng)求方法的時(shí)候,應(yīng)當(dāng)返回狀態(tài)碼501(Not Implemented)。
HTTP服務(wù)器至少應(yīng)該實(shí)現(xiàn)GET和HEAD方法,其他方法都是可選的。
HTTP數(shù)據(jù)包表頭參數(shù)詳解
Requests Header | Http Header
Header | 解釋 | 示例 |
---|---|---|
Accept | 指定客戶端能夠接收的內(nèi)容類型 | Accept: text/plain, text/html |
Accept-Charset | 瀏覽器可以接受的字符編碼集。 | Accept-Charset: iso-8859-5 |
Accept-Encoding | 指定瀏覽器可以支持的web服務(wù)器返回內(nèi)容壓縮編碼類型。 | Accept-Encoding: compress, gzip |
Accept-Language | 瀏覽器可接受的語(yǔ)言 | Accept-Language: en,zh |
Accept-Ranges | 可以請(qǐng)求網(wǎng)頁(yè)實(shí)體的一個(gè)或者多個(gè)子范圍字段 | Accept-Ranges: bytes |
Authorization | HTTP授權(quán)的授權(quán)證書 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Cache-Control | 指定請(qǐng)求和響應(yīng)遵循的緩存機(jī)制 | Cache-Control: no-cache |
Connection | 表示是否需要持久連接。(HTTP 1.1默認(rèn)進(jìn)行持久連接) | Connection: close |
Cookie | HTTP請(qǐng)求發(fā)送時(shí),會(huì)把保存在該請(qǐng)求域名下的所有cookie值一起發(fā)送給web服務(wù)器。 | Cookie: $Version=1; Skin=new; |
Content-Length | 請(qǐng)求的內(nèi)容長(zhǎng)度 | Content-Length: 348 |
Content-Type | 請(qǐng)求的與實(shí)體對(duì)應(yīng)的MIME信息 | Content-Type: application/x-www-form-urlencoded |
Date | 請(qǐng)求發(fā)送的日期和時(shí)間 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
Expect | 請(qǐng)求的特定的服務(wù)器行為 | Expect: 100-continue |
From | 發(fā)出請(qǐng)求的用戶的Email | From: user@email.com |
Host | 指定請(qǐng)求的服務(wù)器的域名和端口號(hào) | Host: www.zcmhi.com |
If-Match | 只有請(qǐng)求內(nèi)容與實(shí)體相匹配才有效 | If-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Modified-Since | 如果請(qǐng)求的部分在指定時(shí)間之后被修改則請(qǐng)求成功,未被修改則返回304代碼 | If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
If-None-Match | 如果內(nèi)容未改變返回304代碼,參數(shù)為服務(wù)器先前發(fā)送的Etag,與服務(wù)器回應(yīng)的Etag比較判斷是否改變 | If-None-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Range | 如果實(shí)體未改變,服務(wù)器發(fā)送客戶端丟失的部分,否則發(fā)送整個(gè)實(shí)體。參數(shù)也為Etag | If-Range: “737060cd8c284d8af7ad3082f209582d” |
If-Unmodified-Since | 只在實(shí)體在指定時(shí)間之后未被修改才請(qǐng)求成功 | If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
Max-Forwards | 限制信息通過(guò)代理和網(wǎng)關(guān)傳送的時(shí)間 | Max-Forwards: 10 |
Pragma | 用來(lái)包含實(shí)現(xiàn)特定的指令 | Pragma: no-cache |
Proxy-Authorization | 連接到代理的授權(quán)證書 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Range | 只請(qǐng)求實(shí)體的一部分,指定范圍 | Range: bytes=500-999 |
Referer | 先前網(wǎng)頁(yè)的地址,當(dāng)前請(qǐng)求網(wǎng)頁(yè)緊隨其后,即來(lái)路 | Referer: http://www.zcmhi.com/archives/71.html |
TE | 客戶端愿意接受的傳輸編碼,并通知服務(wù)器接受接受尾加頭信息 | TE: trailers,deflate;q=0.5 |
Upgrade | 向服務(wù)器指定某種傳輸協(xié)議以便服務(wù)器進(jìn)行轉(zhuǎn)換(如果支持) | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
User-Agent | User-Agent的內(nèi)容包含發(fā)出請(qǐng)求的用戶信息 | User-Agent: Mozilla/5.0 (Linux; X11) |
Via | 通知中間網(wǎng)關(guān)或代理服務(wù)器地址,通信協(xié)議 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 關(guān)于消息實(shí)體的警告信息 | Warn: 199 Miscellaneous warning |
Responses 部分 | Http Header
Header | 解釋 | 示例 |
---|---|---|
Accept-Ranges | 表明服務(wù)器是否支持指定范圍請(qǐng)求及哪種類型的分段請(qǐng)求 | Accept-Ranges: bytes |
Age | 從原始服務(wù)器到代理緩存形成的估算時(shí)間(以秒計(jì),非負(fù)) | Age: 12 |
Allow | 對(duì)某網(wǎng)絡(luò)資源的有效的請(qǐng)求行為,不允許則返回405 | Allow: GET, HEAD |
Cache-Control | 告訴所有的緩存機(jī)制是否可以緩存及哪種類型 | Cache-Control: no-cache |
Content-Encoding | web服務(wù)器支持的返回內(nèi)容壓縮編碼類型。 | Content-Encoding: gzip |
Content-Language | 響應(yīng)體的語(yǔ)言 | Content-Language: en,zh |
Content-Length | 響應(yīng)體的長(zhǎng)度 | Content-Length: 348 |
Content-Location | 請(qǐng)求資源可替代的備用的另一地址 | Content-Location: /index.htm |
Content-MD5 | 返回資源的MD5校驗(yàn)值 | Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== |
Content-Range | 在整個(gè)返回體中本部分的字節(jié)位置 | Content-Range: bytes 21010-47021/47022 |
Content-Type | 返回內(nèi)容的MIME類型 | Content-Type: text/html; charset=utf-8 |
Date | 原始服務(wù)器消息發(fā)出的時(shí)間 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
ETag | 請(qǐng)求變量的實(shí)體標(biāo)簽的當(dāng)前值 | ETag: “737060cd8c284d8af7ad3082f209582d” |
Expires | 響應(yīng)過(guò)期的日期和時(shí)間 | Expires: Thu, 01 Dec 2010 16:00:00 GMT |
Last-Modified | 請(qǐng)求資源的最后修改時(shí)間 | Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT |
Location | 用來(lái)重定向接收方到非請(qǐng)求URL的位置來(lái)完成請(qǐng)求或標(biāo)識(shí)新的資源 | Location: http://www.zcmhi.com/archives/94.html |
Pragma | 包括實(shí)現(xiàn)特定的指令,它可應(yīng)用到響應(yīng)鏈上的任何接收方 | Pragma: no-cache |
Proxy-Authenticate | 它指出認(rèn)證方案和可應(yīng)用到代理的該URL上的參數(shù) | Proxy-Authenticate: Basic |
refresh | 應(yīng)用于重定向或一個(gè)新的資源被創(chuàng)造,在5秒之后重定向(由網(wǎng)景提出,被大部分瀏覽器支持) | Refresh: 5; url=http://www.atool.org/httptest.php |
Retry-After | 如果實(shí)體暫時(shí)不可取,通知客戶端在指定時(shí)間之后再次嘗試 | Retry-After: 120 |
Server | web服務(wù)器軟件名稱 | Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) |
Set-Cookie | 設(shè)置Http Cookie | Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1 |
Trailer | 指出頭域在分塊傳輸編碼的尾部存在 | Trailer: Max-Forwards |
Transfer-Encoding | 文件傳輸編碼 | Transfer-Encoding:chunked |
Vary | 告訴下游代理是使用緩存響應(yīng)還是從原始服務(wù)器請(qǐng)求 | Vary: * |
Via | 告知代理客戶端響應(yīng)是通過(guò)哪里發(fā)送的 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 警告實(shí)體可能存在的問(wèn)題 | Warning: 199 Miscellaneous warning |
WWW-Authenticate | 表明客戶端請(qǐng)求實(shí)體應(yīng)該使用的授權(quán)方案 | WWW-Authenticate: Basic |
GET請(qǐng)求數(shù)據(jù)包示例
常見的GET請(qǐng)求數(shù)據(jù)包如下:
GET /path/to/resource HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
最簡(jiǎn)單的GET請(qǐng)求數(shù)據(jù)包:
GET /path/to/resource HTTP/1.1
Host: example.com
POST請(qǐng)求數(shù)據(jù)包示例
常見的POST請(qǐng)求數(shù)據(jù)包:
POST /path/to/resource HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 20
key1=value1&key2=value2
文件上傳的POST請(qǐng)求數(shù)據(jù)包:
POST /upload-file HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=---------------------------7d915317b0434
Content-Length: [計(jì)算實(shí)際的內(nèi)容長(zhǎng)度]
-----------------------------7d915317b0434
Content-Disposition: form-data; name="file"; filename="example.txt"
Content-Type: text/plain
[這里是文件內(nèi)容]
-----------------------------7d915317b0434--
最簡(jiǎn)單的POST數(shù)據(jù)包:
POST /path/to/resource HTTP/1.1
Host: example.com
Content-Length: 13
Hello, Server!
HTTP請(qǐng)求數(shù)據(jù)包詳解
客戶端發(fā)送一個(gè)HTTP請(qǐng)求到服務(wù)器的請(qǐng)求消息包括以下格式:
請(qǐng)求行(request line)、請(qǐng)求頭部(header)、空行和請(qǐng)求數(shù)據(jù)四個(gè)部分組成。
- 請(qǐng)求行以一個(gè)方法符號(hào)開頭,以空格分開,后面跟著請(qǐng)求的URI和協(xié)議的版本。
Get請(qǐng)求例子,使用Charles抓取的request:
GET /562f25980001b1b106000338.jpg HTTP/1.1
Host img.mukewang.com
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/*,*/*;q=0.8
Referer http://www.imooc.com/
Accept-Encoding gzip, deflate, sdch
Accept-Language zh-CN,zh;q=0.8
第一部分:請(qǐng)求行,用來(lái)說(shuō)明請(qǐng)求類型,要訪問(wèn)的資源以及所使用的HTTP版本.
GET說(shuō)明請(qǐng)求類型為GET,[/562f25980001b1b106000338.jpg]為要訪問(wèn)的資源,該行的最后一部分說(shuō)明使用的是HTTP1.1版本。
第二部分:請(qǐng)求頭部,緊接著請(qǐng)求行(即第一行)之后的部分,用來(lái)說(shuō)明服務(wù)器要使用的附加信息
從第二行起為請(qǐng)求頭部,HOST將指出請(qǐng)求的目的地.User-Agent,服務(wù)器端和客戶端腳本都能訪問(wèn)它,它是瀏覽器類型檢測(cè)邏輯的重要基礎(chǔ).該信息由你的瀏覽器來(lái)定義,并且在每個(gè)請(qǐng)求中自動(dòng)發(fā)送等等
第三部分:空行,請(qǐng)求頭部后面的空行是必須的
即使第四部分的請(qǐng)求數(shù)據(jù)為空,也必須有空行。
第四部分:請(qǐng)求數(shù)據(jù)也叫主體,可以添加任意的其他數(shù)據(jù)。
這個(gè)例子的請(qǐng)求數(shù)據(jù)為空。
POST請(qǐng)求例子,使用Charles抓取的request:
POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
第一部分:請(qǐng)求行,第一行明了是post請(qǐng)求,以及http1.1版本。
第二部分:請(qǐng)求頭部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:請(qǐng)求數(shù)據(jù),第八行。
HTTP之響應(yīng)消息Response
一般情況下,服務(wù)器接收并處理客戶端發(fā)過(guò)來(lái)的請(qǐng)求后會(huì)返回一個(gè)HTTP的響應(yīng)消息。
HTTP響應(yīng)也由四個(gè)部分組成,分別是:狀態(tài)行、消息報(bào)頭、空行和響應(yīng)正文。
例子
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8
<html>
<head></head>
<body>
<!--body goes here-->
</body>
</html>
第一部分:狀態(tài)行,由HTTP協(xié)議版本號(hào), 狀態(tài)碼, 狀態(tài)消息 三部分組成。
第一行為狀態(tài)行,(HTTP/1.1)表明HTTP版本為1.1版本,狀態(tài)碼為200,狀態(tài)消息為(ok)
第二部分:消息報(bào)頭,用來(lái)說(shuō)明客戶端要使用的一些附加信息
第二行和第三行為消息報(bào)頭,
Date:生成響應(yīng)的日期和時(shí)間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8
第三部分:空行,消息報(bào)頭后面的空行是必須的
第四部分:響應(yīng)正文,服務(wù)器返回給客戶端的文本信息。
空行后面的html部分為響應(yīng)正文。
HTTP之狀態(tài)碼
狀態(tài)代碼有三位數(shù)字組成,第一個(gè)數(shù)字定義了響應(yīng)的類別,共分五種類別:
1xx:指示信息–表示請(qǐng)求已接收,繼續(xù)處理
2xx:成功–表示請(qǐng)求已被成功接收、理解、接受
3xx:重定向–要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作
4xx:客戶端錯(cuò)誤–請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)
5xx:服務(wù)器端錯(cuò)誤–服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求
常見狀態(tài)碼:
200 OK //客戶端請(qǐng)求成功
400 Bad Request //客戶端請(qǐng)求有語(yǔ)法錯(cuò)誤,不能被服務(wù)器所理解
401 Unauthorized //請(qǐng)求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用
403 Forbidden //服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù)
404 Not Found //請(qǐng)求資源不存在,eg:輸入了錯(cuò)誤的URL
500 Internal Server Error //服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤
503 Server Unavailable //服務(wù)器當(dāng)前不能處理客戶端的請(qǐng)求,一段時(shí)間后可能恢復(fù)正常
Content-Type:
-
application/json
: 用于 JSON 格式的數(shù)據(jù) -
application/xml
: 用于 XML 格式的數(shù)據(jù) -
application/x-www-form-urlencoded
: 用于 HTML 表單數(shù)據(jù) -
multipart/form-data
: 用于傳輸帶有文件的表單數(shù)據(jù) -
text/plain
: 純文本數(shù)據(jù),無(wú)格式 -
text/html
: HTML 格式的文檔 -
application/javascript
: JavaScript 腳本 -
image/jpeg
,image/png
,image/gif
: 圖片格式 -
audio/mpeg
,audio/wav
: 音頻格式 -
video/mp4
,video/quicktime
: 視頻格式
附表
HTTP響應(yīng)碼大全
http狀態(tài)返回代碼 1xx(臨時(shí)響應(yīng))
表示臨時(shí)響應(yīng)并需要請(qǐng)求者繼續(xù)執(zhí)行操作的狀態(tài)代碼。
http狀態(tài)返回代碼 代碼 說(shuō)明
100 (繼續(xù))請(qǐng)求者應(yīng)當(dāng)繼續(xù)提出請(qǐng)求。服務(wù)器返回此代碼表示已收到請(qǐng)求的第一部分,正在等待其余部分。
101 (切換協(xié)議)請(qǐng)求者已要求服務(wù)器切換協(xié)議,服務(wù)器已確認(rèn)并準(zhǔn)備切換。
http狀態(tài)返回代碼 2xx (成功)
表示成功處理了請(qǐng)求的狀態(tài)代碼。
http狀態(tài)返回代碼 代碼 說(shuō)明
200 (成功) 服務(wù)器已成功處理了請(qǐng)求。通常,這表示服務(wù)器提供了請(qǐng)求的網(wǎng)頁(yè)。
201 (已創(chuàng)建) 請(qǐng)求成功并且服務(wù)器創(chuàng)建了新的資源。
202 (已接受) 服務(wù)器已接受請(qǐng)求,但尚未處理。
203 (非授權(quán)信息) 服務(wù)器已成功處理了請(qǐng)求,但返回的信息可能來(lái)自另一來(lái)源。
204 (無(wú)內(nèi)容) 服務(wù)器成功處理了請(qǐng)求,但沒(méi)有返回任何內(nèi)容。
205 (重置內(nèi)容)服務(wù)器成功處理了請(qǐng)求,但沒(méi)有返回任何內(nèi)容。
206 (部分內(nèi)容) 服務(wù)器成功處理了部分 GET 請(qǐng)求。
http狀態(tài)返回代碼 3xx (重定向)
表示要完成請(qǐng)求,需要進(jìn)一步操作。通常,這些狀態(tài)代碼用來(lái)重定向。
http狀態(tài)返回代碼 代碼 說(shuō)明
300 (多種選擇) 針對(duì)請(qǐng)求,服務(wù)器可執(zhí)行多種操作。服務(wù)器可根據(jù)請(qǐng)求者 (user agent) 選擇一項(xiàng)操作,或提供操作列表供請(qǐng)求者選擇。
301 (永久移動(dòng)) 請(qǐng)求的網(wǎng)頁(yè)已永久移動(dòng)到新位置。服務(wù)器返回此響應(yīng)(對(duì) GET 或 HEAD 請(qǐng)求的響應(yīng))時(shí),會(huì)自動(dòng)將請(qǐng)求者轉(zhuǎn)到新位置。
302 (臨時(shí)移動(dòng)) 服務(wù)器目前從不同位置的網(wǎng)頁(yè)響應(yīng)請(qǐng)求,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來(lái)進(jìn)行以后的請(qǐng)求。
303 (查看其他位置)請(qǐng)求者應(yīng)當(dāng)對(duì)不同的位置使用單獨(dú)的 GET 請(qǐng)求來(lái)檢索響應(yīng)時(shí),服務(wù)器返回此代碼。
304 (未修改)自從上次請(qǐng)求后,請(qǐng)求的網(wǎng)頁(yè)未修改過(guò)。服務(wù)器返回此響應(yīng)時(shí),不會(huì)返回網(wǎng)頁(yè)內(nèi)容。
305 (使用代理)請(qǐng)求者只能使用代理訪問(wèn)請(qǐng)求的網(wǎng)頁(yè)。如果服務(wù)器返回此響應(yīng),還表示請(qǐng)求者應(yīng)使用代理。
307 (臨時(shí)重定向) 服務(wù)器目前從不同位置的網(wǎng)頁(yè)響應(yīng)請(qǐng)求,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來(lái)進(jìn)行以后的請(qǐng)求。
http狀態(tài)返回代碼 4xx(請(qǐng)求錯(cuò)誤)
這些狀態(tài)代碼表示請(qǐng)求可能出錯(cuò),妨礙了服務(wù)器的處理。
http狀態(tài)返回代碼 代碼 說(shuō)明
400 (錯(cuò)誤請(qǐng)求)服務(wù)器不理解請(qǐng)求的語(yǔ)法。
401 (未授權(quán))請(qǐng)求要求身份驗(yàn)證。對(duì)于需要登錄的網(wǎng)頁(yè),服務(wù)器可能返回此響應(yīng)。
403 (禁止)服務(wù)器拒絕請(qǐng)求。
404 (未找到)服務(wù)器找不到請(qǐng)求的網(wǎng)頁(yè)。
405 (方法禁用)禁用請(qǐng)求中指定的方法。
406 (不接受)無(wú)法使用請(qǐng)求的內(nèi)容特性響應(yīng)請(qǐng)求的網(wǎng)頁(yè)。
407 (需要代理授權(quán))此狀態(tài)代碼與 401(未授權(quán))類似,但指定請(qǐng)求者應(yīng)當(dāng)授權(quán)使用代理。
408 (請(qǐng)求超時(shí)) 服務(wù)器等候請(qǐng)求時(shí)發(fā)生超時(shí)。
409 (沖突) 服務(wù)器在完成請(qǐng)求時(shí)發(fā)生沖突。服務(wù)器必須在響應(yīng)中包含有關(guān)沖突的信息。
410 (已刪除) 如果請(qǐng)求的資源已永久刪除,服務(wù)器就會(huì)返回此響應(yīng)。
411 (需要有效長(zhǎng)度)服務(wù)器不接受不含有效內(nèi)容長(zhǎng)度標(biāo)頭字段的請(qǐng)求。
412 (未滿足前提條件)服務(wù)器未滿足請(qǐng)求者在請(qǐng)求中設(shè)置的其中一個(gè)前提條件。
413 (請(qǐng)求實(shí)體過(guò)大)服務(wù)器無(wú)法處理請(qǐng)求,因?yàn)檎?qǐng)求實(shí)體過(guò)大,超出服務(wù)器的處理能力。
414 (請(qǐng)求的 URI 過(guò)長(zhǎng))請(qǐng)求的 URI(通常為網(wǎng)址)過(guò)長(zhǎng),服務(wù)器無(wú)法處理。
415 (不支持的媒體類型)請(qǐng)求的格式不受請(qǐng)求頁(yè)面的支持。
416 (請(qǐng)求范圍不符合要求)如果頁(yè)面無(wú)法提供請(qǐng)求的范圍,則服務(wù)器會(huì)返回此狀態(tài)代碼。
417 (未滿足期望值)服務(wù)器未滿足"期望"請(qǐng)求標(biāo)頭字段的要求。
http狀態(tài)返回代碼 5xx(服務(wù)器錯(cuò)誤)
這些狀態(tài)代碼表示服務(wù)器在嘗試處理請(qǐng)求時(shí)發(fā)生內(nèi)部錯(cuò)誤。這些錯(cuò)誤可能是服務(wù)器本身的錯(cuò)誤,而不是請(qǐng)求出錯(cuò)。
http狀態(tài)返回代碼 代碼 說(shuō)明
500 (服務(wù)器內(nèi)部錯(cuò)誤) 服務(wù)器遇到錯(cuò)誤,無(wú)法完成請(qǐng)求。
501 (尚未實(shí)施)服務(wù)器不具備完成請(qǐng)求的功能。例如,服務(wù)器無(wú)法識(shí)別請(qǐng)求方法時(shí)可能會(huì)返回此代碼。
502 (錯(cuò)誤網(wǎng)關(guān))服務(wù)器作為網(wǎng)關(guān)或代理,從上游服務(wù)器收到無(wú)效響應(yīng)。
503 (服務(wù)不可用)服務(wù)器目前無(wú)法使用(由于超載或停機(jī)維護(hù))。通常,這只是暫時(shí)狀態(tài)。
504 (網(wǎng)關(guān)超時(shí)) 服務(wù)器作為網(wǎng)關(guān)或代理,但是沒(méi)有及時(shí)從上游服務(wù)器收到請(qǐng)求。
505 (HTTP 版本不受支持)服務(wù)器不支持請(qǐng)求中所用的 HTTP 協(xié)議版本。
一些常見的http狀態(tài)返回代碼為:
200 - 服務(wù)器成功返回網(wǎng)頁(yè)
404 - 請(qǐng)求的網(wǎng)頁(yè)不存在
503 - 服務(wù)不可用文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-857717.html
參考鏈接:https://www.cnblogs.com/ranyonsue/p/5984001.html文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-857717.html
到了這里,關(guān)于一篇文章講好HTTP數(shù)據(jù)包的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!