Http 1.0 與 Http 1.1的區別:
1.0協議,客戶端與web服務器建立連接后,只能獲得一個web資源!
1.1協議,允許客戶端與web服務器建立連接后,在一個連接上獲取多個web資源!
Http請求的工作流程:
SYN和ACK
SYN(synchronous):TCP/IP建立連接時使用的握手信號
ACK(Acknowledgement):確認字符,確認發來的數據已經接受無誤
TCP/IP三次握手的概念:
1、客戶端發送syn包(syn = j)到服務器,進入SYN_SEND狀態,然后等待服務器確認
2、服務器收到syn包,確認客戶的syn(ack = j + 1),同時在自己也發送一個SYN包(syn=k), 即SYN + ACK包,服務器進入SYN_RECV狀態
3、客戶端收到SYN + ACK包,想服務器發送確認包ACK(ack = k +1),發送完畢后,客戶端與服務端 進入ESTABLISHED狀態,完成三次握手,然后兩者開始傳送數據
TCP建立連接要進行3次握手,而斷開連接要進行4次
1 當主機A完成數據傳輸后,將控制位FIN置1,提出停止TCP連接的請求
2 主機B收到FIN后對其作出響應,確認這一方向上的TCP連接將關閉,將ACK置1
3 由B 端再提出反方向的關閉請求,將FIN置1
4 主機A對主機B的請求進行確認,將ACK置1,雙方向的關閉結束.
TCP三次握手過程
1 主機A通過向主機B 發送一個含有同步序列號的標志位的數據段給主機B ,向主機B 請求建立連接,通過這個數據段,
主機A告訴主機B 兩件事:我想要和你通信;你可以用哪個序列號作為起始數據段來回應我.
2 主機B 收到主機A的請求后,用一個帶有確認應答(ACK)和同步序列號(SYN)標志位的數據段響應主機A,也告訴主機A兩件事:
我已經收到你的請求了,你可以傳輸數據了;你要用哪個序列號作為起始數據段來回應我
3 主機A收到這個數據段后,再發送一個確認應答,確認已收到主機B 的數據段:"我已收到回復,我現在要開始傳輸實際數據了
這樣3次握手就完成了,主機A和主機B 就可以傳輸數據了
"傳輸層"的功能,就是建立"端口到端口"的通信。相比之下,"網絡層"的功能是建立"主機到主機"的通信。只要確定主機和端口,我們就能實現程序之間的交流。因此,Unix系統就把主機+端口,叫做"套接字"(socket)。有了它,就可以進行網絡應用程序開發了。
一、HTTP關系密切的協議:IP、TCP和DNS
1、負責傳輸的IP協議
IP網際協議位于網絡層。IP的作用的就是把各種數據包傳送給對方。確保傳送到隨訪的兩個條件:IP地址和MAC地址
使用ARP協議憑借MAC地址進行通行。
2、確保可靠性的TCP協議
TCP位于傳輸層,提供可靠的字節流服務。
所謂字節流的服務,是為了方便傳輸,將大塊數據分割成報文段為單位的數據包進行管理。
確保數據能到達目標
TCP協議采用了三次握手策略。握手過程中使用了TCP的標志---SYN(synchronize)和ACK(acknowledment)
發送端首先發送一個帶SYN標志得瑟數據包給對方,接收端收到后,會傳一個帶有SYN/ACK標志的數據包以示傳達確認信息,最后,發送端再傳回一個帶ACK標志的數據包,代表握手結束。
3、負責域名解析的DNS服務
DNS服務是和Http協議一樣位于應用層的協議。它提供域名到IP地址之間的解析服務。
二、HTTP協議
1、HTTP協議用于客戶端和服務器端之間的通信。
2、通過請求和響應的交換達成通信。
3、HTTP是不保存狀態的協議。
HTTP可使用的方法
1、GET:獲取資源
GET方法用來請求訪問已被URI識別的的資源。
2、POST:傳輸實體主體
POST方法用來傳輸實體的主體。
3、PUT:傳輸文件
4、HEAD:獲取報文首部
HEAD方法和GET方法一樣,只是不返回報文主題部分。
5、DELETE:刪除文件
6、OPTION:詢問支持的方法。
7、TRACE:追蹤路徑
8、CONNECT:要求喲過隧道協議連接代理
CONNECT方法要求與代理服務器通信是建立隧道,實現用隧道協議進行TCP通信。主要使用SSL(安全套接字)和TLS(傳輸層安全)協議把通信內容加密后經網絡隧道傳輸。
持久連接:
HTTP keep-alive:只要任意一端有明確提出斷開連接,則保持TCP連接狀態。
持久連接的好處在于減少TCP連接的重復建立和斷開造成的額外開銷,減少了服務器的負載。
在Http/1.1,所有的連接默認都是持久化連接。
管線化
持久連接使得多數請求以管線化方式發送成為可能。從前發送請求后序等待并得到響應,才能發送下一個請求。管線化技術出現后,不用等待響應亦可直接發送下一個請求。
使用Cookie的狀態管理
HTTP是無狀態協議,它不對以前發生過的請求和響應的狀態進行管理。
Cookie技術通過在請求和響應報文中寫入coo kie信息來控制客戶端的狀態。
HTTP報文
用于HTTP協議交互的信息被稱為HTTP報文。請求端的HTTP報文叫做請求報文,相應端的叫做響應段的報文。
HTTP報文大致可以分為報文首部和報文主題兩個主體。
請求報文和響應報文的首部內容有以下數據組成
1、請求行
包含用于請求的方法,請求URI和HTTP的版本
2、狀態行
包含表明響應結果的狀態碼,原因短語和HTTP版本
3、首部字段
包含表示請求和響應的各種條件和屬性的各類首部。
編碼提升傳輸效率
1、壓縮傳輸的內容編碼(常用)
gzip
compress
deflate
identity
2、分割發送的分塊傳輸編碼
把主體分塊的功能稱為分塊傳輸編碼(chunked tranfer coding)
3、發送多種數據的多部分對象集合
多部分對象集合包含:
1、multipart/form-data
在web表單文件上傳時使用
2、multipart/byteranges
狀態碼206響應報文包含了多個范圍的內容時使用。
content-Type:mutipart/form-data;
獲取部分內容的范圍請求
指定范圍發送風格的請求叫做范圍請求(range request)
Range:bytes=5001-10000
另外多重范圍的范圍請求,響應會在首部字段Content-Type標明multipart/byteranges后返回響應報文。
內容協商返回最合適的內容
內容協商機制是指客戶端和服務器端就響應的資源內容進行交涉,然后提供給客戶端最為合適的資源
Accept
Accept-Charset
Accept-Encoding
Accept-Language
Accept-Language
用單臺虛擬主機實現多個域名
由于虛擬主機可以寄存多個不同主機名和域名的Web網站,因此在發送HTTP請求時,必須在Host首部內容完整指定主機名或域名的URI
通信數據轉發程序:代理,網關,隧道
1、代理
代理是一種有轉發功能的應用程序,它扮演了位于服務器和客戶端“中間人”的角色,接收由客戶端的請求并轉發給服務器,同時也接受服務器返回的響應并轉發給客戶端。
緩存代理
代理轉發響應,緩存代理回預先將資源的副本保存在代理服務器上。
當代理再次接收到對相同資源的請求時,就可以不從源服務器那里獲取資源,而是將之前的緩存的資源作為響應返回。
緩存的有效期
即使存在緩存,也會因為客戶端的要求,緩存的有效期等因素,向源服務器確認資源的有效性。若判斷緩存失效,緩存服務器將會再次從源服務器上獲取資源。
客戶端緩存
緩存不僅可以緩存在服務器中,還可以緩存在客戶端瀏覽器。
2、隧道
隧道可按要求建立起一條與其他服務器的通信線路,屆時使用SSL等加密手段進行通行。隧道的目的是確保客戶端與服務器進行安全的通信。
HTTP首部
HTTP請求報文
HTTP協議的請求和響應報文必定包含HTTP首部。
HTTP請求報文:方法,URI,HTTP版本,HTTP首部字段等部分構成
HTTP響應報文:
在響應中,HTTP報文由HTTP版本,狀態碼,HTTP首部字段3部分構成
HTTP首部字段結構
HTTP首部字段是由首部字段和字段值構成:
首部字段:字段值
Content-Type:text/html
keep-Alive:timeout=15,max=100
四種HTTP首部字段類型:
1、通用首部字段
請求報文和響應報文都會使用的首部
2、請求首部字段
3、響應首部字段
4、實體首部字段
通用首部字段
首部字段名 | 說明
---------------- | -------------------
Cache-Control | 控制緩存的行為
connection | 逐跳首部,連接的管理
Date |創建報文的日期時間
Pragma |報文指令
Transfer-Encoding|報文末端一覽
Upgrade|升級為其他協議
Via|代理服務器的相關信息
Warning|錯誤通知
請求首部字段
首部字段名 | 說明
-------- | --------
Accept|用戶代理可處理的媒體類型
Accept-Charset|優先的字符集
Accept-Encoding|優先的內容編碼
Accept-Language|優先的語言
Authorization|Web認證信息
Expect|期待服務器的特定行為
From|用戶的電子郵箱地址
Host|請求資源所在的服務器
if-Match|比較實體標記
if-Modified-Since|比較資源的更新時間
if-none-Match|比較實體標記
if-Range|資源未更新時間發送實體Byte的范圍請求
if-Unmodified-Since|比較資源的更新時間
Range|實體的范圍請求
Referer|對請求中URI的原始獲取方
User-Agent|HTTP客戶端程序的信息
響應首部字段
首部字段名 | 說明
---------|-----------
Accept-Ranges|是否接受字節范圍的請求
Age|推算資源創建經過時間
ETag|資源的匹配信息
Location|令客戶端重定向至指定URI
實體首部字段
首部字段名 | 說明
---------|-----------
Allow|資源可支持的HTTP方法
Content-Encoding|實體主體適用的編碼方式
Content-Language|實體主體的自然語言
Content-Length|實體主體的大小
Content-Location|替代資源的URI
Content-Range|實體主體范圍
Content-Type|實體主體的媒體類型
Expires|實體主體過期的日期時間
Last-Modified|資源的最后修改時間
Cache-Control指令簡要講
緩存請求指令
指令 |說明
------|------
no-cache|強制向源服務器再次驗證
no-store|不緩存請求或響應的任何內容
max-age=「秒」|響應的最大age值
緩存響應指令
指令|說明
-------|------
public|可向任意的提供響應的緩存
private|僅向特定的用戶返回響應
no-cache|緩存前必須先確定其有效性
no-store|不緩存請求和響應的任何內容
使用no-cache指令的目的是為了防止從緩存中返回過期的資源
Connection字段
1、控制不在轉發給代理的首部字段
2、管理持久連接
控制不在轉發給代理的首部字段(代理服務器)
GET /HTTP/1.1
Upgrage:HTTP/1.1
Connection:Upgrade
Connection:close
不持續連接
Pragma指令
是HTTP/1.1之前版本的歷史遺留字段:等同于Cache-Control
Transfer-Encoding指令
HTTP/1.1的傳輸編碼方式僅對分塊傳輸編碼有效。
Transfer-Encoding:chunked
Via指令
使用首部字段Via是為了追蹤客戶端與服務器端之間的請求和響應報文的傳輸路徑
請求首部字段
Host指令
首部字段Host會告訴服務器,請求的資源所處的互聯網主機名和端口號(必須)
if-Match指令
形如if-xxx這種樣式的請求首部字段,都可稱為條件強求
if-Match:”hansheng“
只有當if-match的字段值更ETag值匹配一致時,服務器才會接受請求
if-Modified-Since:Thu 10 Apr 2016 00:00:00 GET
只要是2016年4月10號之后更新過的資源,所以可以接受
Range指令
只需獲取部分資源的范圍請求,包含首部字段Range即可告知服務器資源的制定范圍
Referer指令
首部字段Referer會告知服務器請求的原始資源的URI
User-Agent指令
首部字段User-Agent將創建請求的瀏覽器和用戶代理告訴服務器
響應首部字段
Accept-Ranges指令
首部字段Accept-Range是用來告知客戶端服務器是否能處理范圍請求,以指定獲取服務器某個部分的資源
ETag
首部字段ETag能告知客戶端實體表識,資源更新時,有統一的算法規則。
Location
使用首部字段Location可以將響應接收方引導至某個與請求URI位置不同的資源。
確保Web安全的 HTTPS
HTTP的缺點
通信使用明文(不加密),內容可能會被竊聽;
不驗證通信方的身份,因此可能遭遇偽裝;
無法證明報文的完整性,所以可能已遭篡改。
HTTP + 加密 + 認證 + 完整性保護 = HTTPS
HTTPS并非是應用層的一種新協議。只是普通HTTP通信接口部分用SSL和TLS協議替代而已。
SSL是獨立于HTTP的協議,所以不光是HTTP協議,其他運行在應用層的SMTP和Telnet等協議均可配合SSL協議使用。所以說SSL是當今世界上應用最為廣泛的網絡安全技術。
由于HTTPS需要做服務器、客戶端雙方加密及解密處理,因此會消耗CPU和內存等硬件資源;
和HTTP相比,SSL通信部分消耗網絡資源。而SSL通信部分,又因為要對通信進行處理,所以時間上有延遲了;
和HTTP相比,網絡負載和速度上會變慢2~100倍。
http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
HTTP狀態碼
1、100~199 : 成功接受請求,客戶端需提交下一次請求才能完成整個處理過程
2、200: OK,客戶端請求成功
3、300~399:請求資源已移到新的地址(302,307,304)
4、401:請求未授權,改狀態代碼需與WWW-Authenticate報頭域一起使用
5、403:Forbidden,服務器收到請求,但是拒絕提供服務
6、404:Not Found,請求資源不存在,這個就不用說啦
7、500:Internal Server Error,服務器發生不可預期的錯誤
8、503:Server Unavailable,服務器當前不能處理客戶端請求,一段時間后可能恢復正常
HTTP的功能追加協議
HTTP的瓶頸
一條連接上只能發送一個請求;
請求只能從客戶端開始,客戶端不可以接收除響應以外的指令;
請求/響應首部未經壓縮就發送,首部信息越多延遲越大;
發送冗長的首部,每次互相發送相同的首部造成的浪費較多;
可任意選擇數據壓縮格式,非強制壓縮發送。
SPDY
SPDY沒有完全改寫HTTP協議,而是在TCP/IP的應用層與傳輸層之間通過新加會話層的形式運作。同時,考慮到安全問題,SDPY規定通信中使用SSL。
多路復用流;
賦予請求優先級;
壓縮HTTP首部;
推送功能;
服務器提示功能。
下章講解:TCP/IP協議精講,敬請期待。。。。。。