主要內(nèi)容:
- Web客戶(hù)端與服務(wù)端是如何通信的
- HTTP報(bào)文格式
- 底層TCP網(wǎng)絡(luò)傳輸
1.1 Web客戶(hù)端和服務(wù)端
Web資源都是存儲(chǔ)在Web服務(wù)器上的,因?yàn)閃eb服務(wù)器使用HTTP通信,以此也成為HTTP服務(wù)器。HTTP客戶(hù)端發(fā)出HTTP請(qǐng)求,服務(wù)端會(huì)根據(jù)客戶(hù)端傳輸?shù)臄?shù)據(jù),作出HTTP響應(yīng)發(fā)送請(qǐng)求的數(shù)據(jù)。如圖 1-1 所示,HTTP客戶(hù)端和HTTP服務(wù)端工作原理:
image.png
- Web服務(wù)器是Web資源的倉(cāng)庫(kù),資源包含任意內(nèi)容:文本文件、HTML文檔、Word文件、圖片、視頻等。但是資源不一定非得是像前面提高的靜態(tài)文件,也可以是根據(jù)Web應(yīng)用程序生成的動(dòng)態(tài)內(nèi)容,比如數(shù)據(jù)庫(kù)中里的數(shù)據(jù)。
- Web客戶(hù)端,瀏覽器是一種我們經(jīng)常使用到的Web客戶(hù)端,其中還可以是手機(jī)原生應(yīng)用、小程序等。也可以說(shuō)能實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求的程序都可以是Web客戶(hù)端。
1.2 URI
每一個(gè)Web服務(wù)器資源都有一個(gè)名字,這樣客戶(hù)端才可以說(shuō)明它想要的是什么資源。服務(wù)器資源名稱(chēng)被稱(chēng)為統(tǒng)一資源標(biāo)識(shí)符(Uniform Resource Identifier, URI)。
- URI的一般格式:
<方案名稱(chēng)>:<分層部分>[? <查詢(xún)參數(shù)>] [# <片段>]
統(tǒng)一資源定位符(URL)是資源標(biāo)識(shí)符最常見(jiàn)的形式。如圖 1-2 為URL實(shí)例:
image.png
1.3 HTTP報(bào)文
HTTP是一種請(qǐng)求-響應(yīng)協(xié)議,HTTP報(bào)文是由一行一行的簡(jiǎn)單字符串組成的,都是純文本,易讀。HTTP報(bào)文格式:
- 起始行
報(bào)文的第一行,在請(qǐng)求報(bào)文中用來(lái)說(shuō)明要做什么,在響應(yīng)報(bào)文中說(shuō)明出現(xiàn)了什么。 - 首部字段
起始行后面有零個(gè)或者多個(gè)首部字段。每個(gè)字段都包括一個(gè)名字和值。兩者之間用冒號(hào)(:)分隔。首部以空行結(jié)束。 - 主體
空行之后就是可選的報(bào)文主體,其中包含了所有類(lèi)型的數(shù)據(jù)。
HTTP報(bào)文實(shí)例:
- 請(qǐng)求報(bào)文
GET /index.html HTTP/1.0 起始行
Accept: text/* 首部
Accept-Language: en, fr
- 響應(yīng)報(bào)文
HTTP/1.0 200 OK 起始行
Content-type: text/plain 首部
Content-length: 19
Hi, I am index 主體
1.4 事務(wù)
1.4.1 HTTP請(qǐng)求方法
請(qǐng)求方法是起始行中的第一個(gè)單詞,指明了客戶(hù)端要對(duì)資源進(jìn)行的操作。
常見(jiàn)的HTTP方法:
- GET:命令服務(wù)器返回指定資源
- POST:命令服務(wù)器將報(bào)文主體中的數(shù)據(jù)傳遞給URI指定的資源。
- PUT:命令服務(wù)器將報(bào)文主體中的數(shù)據(jù)設(shè)置為URI指定的資源。
- DELETE:命令服務(wù)器刪除URI指定資源
1.4.2 HTTP響應(yīng)
HTTP響應(yīng)報(bào)文是對(duì)HTTP請(qǐng)求報(bào)文的回復(fù)。跟HTTP請(qǐng)求報(bào)文一樣,也是一些列的文本組成。
狀態(tài)碼:
- 1xx:情報(bào)狀態(tài)碼。
- 2xx: 成功狀態(tài)碼。
- 3xx:重定向狀態(tài)碼。
- 4xx:客戶(hù)端錯(cuò)誤狀態(tài)碼。
- 5xx:服務(wù)端錯(cuò)誤狀態(tài)碼。
一個(gè)Telnet實(shí)例
GET /index.html HTTP/1.1
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Connection: Keep-Alive
Content-Length: 14615
Content-Type: text/html
Date: Mon, 19 Aug 2019 08:57:08 GMT
Etag: "5d54da0d-3917"
Last-Modified: Thu, 15 Aug 2019 04:05:33 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
Server: BWS/1.1
Set-Cookie: BAIDUID=668FD107459E334256837E510A760274:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=668FD107459E334256837E510A760274; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1566205028; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1
<!DOCTYPE html><!--STATUS OK-->
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<link rel="dns-prefetch" />
<link rel="dns-prefetch" />
<link rel="dns-prefetch" />
<link rel="dns-prefetch" />
<link rel="dns-prefetch" />
<link rel="dns-prefetch" />
<link rel="dns-prefetch" />
<link rel="dns-prefetch" />
<title>百度一下,你就知道</title>
<link rel="stylesheet" type="text/css" />
<!--[if lte IE 8]><style index="index" >#content{height:480px\9}#m{top:260px\9}</style><![endif]-->
<!--[if IE 8]><style index="index" >#u1 a.mnav,#u1 a.mnav:visited{font-family:simsun}</style><![endif]-->
<script>var hashMatch = document.location.href.match(/#+(.*wd=[^&].+)/);if (hashMatch && hashMatch[0] && hashMatch[1]) {document.location.replace("http://"+location.host+"/s?"+hashMatch[1]);}var ns_c = function(){};</script>
<script>function h(obj){obj.style.behavior='url(#default#homepage)';var a = obj.setHomePage('//www.baidu.com/');}</script>
<noscript><meta http-equiv="refresh" content="0; url=/baidu.html?from=noscript"/></noscript>
<script>window._ASYNC_START=new Date().getTime();</script>
</head>
參考文獻(xiàn):
- 《HTTP權(quán)威指南》