1. 程式人生 > >圖解HTTP-筆記

圖解HTTP-筆記

已過期 服務器端 session管理 重復 basic 求和 man 不能 圖片

HyperText Transfer Protocol 超文本傳輸協議
TCP/IP 是互聯網相關的各類協議族的總稱。 IP,ICMP,IEEE 802.3,PPPoE,DNS,TCP,FDDI,UDP,FTP,SNMP,HTTP

應用層:決定向用戶提供應用服務時通信的活動。 FTP,DNS,HTTP

傳輸層:對上層 應用層,提供處於網絡連接中的兩臺計算機之間的數據傳輸。

TCP,傳輸控制協議。UDP 用戶數據報協議。

網絡層(IP,選擇傳輸路線),數據鏈路層(ARP,RARP:IP -> MAC 硬件部分)。

通信傳輸流

客戶端
應用層:發HTTP請求
傳輸層 TCP:分割HTTP報文,在報文打上標記序號和端口號
網絡層 IP: 增加目的地的MAC地址後轉發到鏈路層

發送端層與層之間傳輸數據時,每經過一層打上該層所屬的首部信息,反之,接收端每經過一層將對應首部消去。

TCP協議為了更容易傳輸大數據才將數據分割,而且TCP協議能夠確認數據最終是否送達到對方。

TCP

三次握手:

發送端:SYN
接收端:SYN/ACK
發送端:ACK

四次揮手:

主動斷開方:FIN
被動斷開方:ACK
被動斷開方:FIN
主動斷開方:ACK

DNS

查找順序:瀏覽器緩存區 --> 操作系統 --> hosts --> DNS服務器

URI,統一資源標識符
URL,統一資源定位符
URL是URI的子集。

絕對URL:協議+登錄信息(可選)+服務器地址+端口+資源路徑

請求報文

請求報文 = 請求方法 + 請求URI + 協議版本 + 請求頭 + 內容實體
響應報文 = 協議版本 + 狀態碼 + 狀態碼原因短語(ok,not found) + 響應頭 + 內容實體

HTTP協議自身不具備保存之前發送過的請求或響應的功能:即無狀態協議

if-modified-since

假設請求 www.hacker.jp/index.html
響應頭為:If-Modified-Since:Thu,12 Jul 2012 07:30:00 GMT

表示:僅返回指定時間(2012,07,12)以後更新過的index.html頁面,如果未更新,則以狀態碼304 Not Modified返回

請求方法

1. PUT: 傳輸文件(不帶驗證機制,任何人都可以上傳,一般不采用該方法)

客戶端:put /example.html
服務端:204 No Content, 該example.html已存在服務器上

2. HEAD:獲取報文首部

類似Get方法,只是不返回報文頭部,用於確認URI的有效性和資源更新的日期時間

3.DELETE方法:刪除文件

同PUT一樣不帶驗證機制,一般不使用

4.OPTIONS 詢問服務端支持的請求方法

響應:Allow:GET,POST,HEAD,OPTIONS

5.TRACE:追蹤路徑

發送請求時,在Max-Forwards填入數值 ( TTL?),每經過一次服務器(包括代理服務器)數字減一,減到0時停止傳輸,最後接受請求的服務器(可能是代理服務器)響應200 OK,並在響應主體中返回該 最終服務器 收到的原始請求報文。

對於客戶端來說,就能知道從它這裏發出去的報文,在該報文最終停止傳輸時,變成了什麽樣的報文。

6.CONNECT:要求用隧道協議連接代理服務器。SSL+TLS

持久連接

HTTP/1.1默認持久連接,HTTP/1.0未標準化,持久化需要客戶端和服務器端同時支持。

http keep-alive
只要任意一端沒有明確提出斷開連接,則保持TCP連接狀態。減輕了TCP連接中重復建立和斷開所造成的額外開銷,同時請求響應更快結束,WEB頁面顯示速度也能提高。

管線化

不用等待上一個請求響應可直接發送下一個請求

服務器端,設置響應頭字段 Set-Cookie,通知客戶端保存cookie。下次客戶端向服務端發送請求時,客戶端自動在請求報頭中加入cookie。

HTTP報文結構

編碼提升傳輸速率。

實體 = 實體首部 + 實體主體。通常報文主體等於實體主體,只有當傳輸中進行編碼操作時,實體主體的內容發生變化,才導致和報文主體產生差異。

內容編碼:gzip,compress,deflate(zlib),identity(不進行編碼)


分塊傳輸編碼,傳輸大容量數據時,把數據分割成多塊,能夠讓瀏覽器逐步顯示頁面。

MIME:多用途因特網郵件擴展,允許處理文字,圖片,視頻等多個不同類型的數據。
MIME中采用稱為多部分對象集合的方法,容納多份不同類型的數據。

multipart / form-data ,web表單文件上傳時使用。

範圍請求:指定需要下載的實體範圍(例如:下載中斷恢復下載),Range字段指定資源的byte範圍。對於範圍請求,服務端響應206 Partial Content的響應報文。

內容協商

例如,返回對應瀏覽器語言的web頁面

客戶端和服務端就響應的資源內容進行交涉。 內容協商以 語言,字符集,編碼方式 為基準判斷響應的資源。

Accept
Accept-Charset
Accept-Encoding
Accept-Language
Content-Language

HTTP狀態碼

狀態碼 類別 原因短語
1xx 信息性狀態碼 接收的請求正在處理
2xx 成功狀態碼 請求正常處理完畢
3xx 重定向狀態碼 需要進行附加操作以完成請求
4xx 客戶端錯誤狀態碼 服務器無法處理該請求
5xx 服務器錯誤狀態碼 服務器處理請求出錯

200 ok:請求正常處理
204 No Content: 請求處理成功,但沒有資源可返回。
206 Partial Content:範圍請求成功。
301 Moved Permanently:永久性重定向,請求的資源已經被分配了新的URI,此時應該按照Location首部字段提示的URI重新訪問。
302 Found:臨時性重定向
301和302的區別:用戶把URI保存為書簽,不會像301出現一樣更新書簽,而是依舊保留302頁面的URI。
303 See Other: 表示請求對應的資源存在著另一個URI,應使用GET方法定向獲取該資源。
當301,302,303狀態碼返回時,就幾乎所有的瀏覽器都會把POST改成GET,並刪除請求報文的主題,之後再次發送請求。

304 Not Modified:服務端資源未改變,直接使用客戶端未過期的緩存。
400 Bad Request: 請求報文中存在語法錯誤。
401 Unauthorized: 發送的請求需要有通過HTTP,BASIC,DIGEST的認證信息。響應需包含,WWW-Authenticate首部以彈出認證用的對話窗口。
403 Forbidden: 對請求資源的訪問被服務器拒絕(未獲得文件系統的訪問授權,從未授權的發送源IP進行訪問)都是發生403的原因。
404 Not Found。
500 Internal Server Error。內部服務器出錯。
503 Service Unavailable,服務器超負荷或停機維護, Retry-After字段告知再次嘗試時間。

web服務器

HTTP通信時,除了客戶端和服務器之外,還有一些用於通信數據轉發的應用程序,比如 代理,網關,隧道

代理:應用程序,服務器和客戶端之間的中間人。
網關:服務器,接受從客戶端發送過來的請求時,就像自己擁有資源的原服務器一樣對請求進行處理。
隧道:相隔很遠的客戶端和服務器之間進行中轉,並保持雙方通信連接。

代理:通過代理服務器進行轉發請求或相應時,會追加via首部信息。
優點:利用緩存技術減少網絡寬帶的流量,組織內部對特定網站的訪問控制,以獲取訪問日誌為主要目的。
緩存代理;當代理轉發響應時,緩存代理會預先把資源副本緩存到代理服務器上,下次請求就可以將緩存結果直接返回,(會想向原服務器確定資源的有效性)。
透明代理:不對請求做任何處理.

網關:使通信線路上的服務器提供非HTTP協議服務。提高安全性。

HTTP首部

通用首部字段:

字段 說明
Cache-Control 控制緩存的行為
Connection 逐跳首部,連接的管理
Date 創建報文的日期時間
Pragma 報文指令
Trailer 報文末端的首部一覽
Transfer-Encoding 指定報文主體的傳輸編碼方式
Upgrade 升級為其他協議
Via 代理服務器的相關信息
Warning 錯誤通知

請求首部字段:

字段 說明
Accept 用戶代理可處理的媒體類型
Accept-Charset 優先的字符集
Accept-Encoding 優先的內容編碼
Accept-Language 優先的語言
Authorization Web認證信息
Expect 期待服務器的特定行為
From 用戶的電子郵箱地址
Host 請求資源所在服務器
If-Match 比較實體標記(ETag)
If-Modified-Since 比較資源的更新時間
If-None-Match 比較實體標記,與if-match相反
If-Range 資源未更新時發送實體Byte的範圍請求
If-Unmodified-Since 比較資源的更新時間(與if-modified-since相反)
Max-Forwards 比較傳輸逐跳數
Proxy-Authorization 代理服務器要求客戶端的認證信心
Range 實體的字節範圍請求
Referer 對請求的URI的原始獲取方
TE 傳輸編碼的優先級
User-Agent HTTP客戶端程序的信息

響應首部字段:

字段 說明
Accept-Ranges 是否可接受字節範圍請求
Age 推算資源創建經過時間
ETag 資源的匹配信息
Location 令客戶端重定向至指定URI
Proxy-Authenticate 代理服務器對客戶端的認證信息
Retry-After 對在此發起請求的時機要求
Server HTTP服務器的安裝信息
Vary 代理服務器緩存的管理信息
WWW-Authenticate 服務器對客戶端的認證信息

實體首部字段:針對請求報文和響應報文的【實體】部分使用的字段。即針對請求數據和返回數據的 要求

字段 說明
Allow 資源支持的HTTP方法
Content-Encoding 實體主體適用的編碼方式
Content-Language 實體主體的自然語言
Content-Length 實體主體的大小 單位(字節)
Content-Location 替代對應資源的URI
Content-MD5 實體主體的報文摘要
Content-Range 實體主體的位置範圍
Content-Type 實體主體的媒體類型
Expires 實體主體過期的日期時間
Last-Modified 資源的最後修改時間

端對端首部: 分在此類別的字段,會轉發給請求、響應的最終目標。

逐跳首部: 只對單次轉發有效,會因為緩存或者代理而不再轉發。

逐跳字段: Connection,Keep-Alive,Proxy-Authenticate,Proxy-Authorization,Trailer,TE,Transfer-Encoding,Upgrade.
[除以上字段,均為端對端首部]

Cache-Control

通過指定首部字段的Cache-Control 的指令,就能操作緩存的工作機制。指令參數可選,多個指令之間通過,分隔,可用在 請求以及響應 時。

Cache-Control: private, max-age=0,no-cache.

  1. 緩存,請求指令
指令 參數 說明
no-cache 強制向源服務器再次驗證
no-store 不緩存請求或響應的任何內容
max-age = [秒] 必需 響應的最大Age值
max-stale(=[秒]) 可省略 接收已過期的響應
min-fresh=[秒] 必需 期望在指定時間內的響應仍有效
no-transform 代理不可更改的媒體類型
only-if-cached 從緩存獲取資源
cache-extension - 新指令標記(token)

  1. 緩存,響應指令
指令 參數 說明
public 可向任意方提供響應的緩存
private 可省略 僅向特定用戶返回響應
no-cache 可省略 緩存前必需先(向服務器)確認其有效性
no-store 不緩存請求或響應的任何內容
no-transform 代理不可更改媒體類型
must-revalidate 可緩存但必須向源服務器進行確認
proxy-revalidare 要求中間緩存服務器對緩存的響應有效性再進行確認
max-age=[秒] 必需 響應的最大Age值
s-maxage=[秒 必需 公共緩存服務器響應的最大Age值
cache-extension - 新指令標記(token)

表示是否能緩存的指令:public,private,no-cache

no-cache 實際上代表【不緩存過期的資源】,而不是不緩存(no-store) 緩存會向源服務器進行有效期確認後處理資源。

由服務器返回的響應中,如果報文首部字段 Cache-Control中對no-cache字段指定參數,cache-control: no-cache=Location 則客戶端不能使用緩存。 換言之,如果沒有參數值的首部字段可以使用緩存。

控制可執行緩存的對象的指令:no-store, s-maxage,max-age,min-fresh,max-stale,only-if-cached(504 gateway timeout),must-revalidate(504),proxy-revalidate,on-transform(防止緩存或代理壓縮圖片).

  1. 當使用on-store指令時,暗示請求或響應中包含機密信息,規定緩存不能在本地存儲請求或響應的任一部分。

  2. s-maxage和max-age功能相同,區別在於s-maxage指令只適用於供多位用戶使用的代理服務器。對同一用戶重復返回響應的服務器來說,指令無效。當使用s-maxage時,expires首部字段和max-age字段無效.

    cache-control:max-age = 604800
    客戶端的角度(向緩存服務器): 要是緩存過期沒超過一周,就把它給我。
    服務器角度(向緩存服務器):一周以內不必向我確認,緩存服務器直接處理緩存。
    max-age: 如果判定緩存資源的緩存時間數值比指定時間的數值更小,則使用緩存。max-age=0 ,則緩存服務器需要向源服務器請求。

    cache-extension token,擴展cache-control首部字段的指令。

Connection

  1. 用於控制不再轉發的首部字段名。
Upgrade: http/1.1
Connection:Upgrade

則代理服務器接收到這兩個字段時,不會繼續轉發這兩個字段 (Upgrade, Connection ) 到源服務器。

  1. 管理持久連接:

    http/1.1默認都是持久連接keep-alive,當服務端 明確要斷開連接時,則指定connection:close.

    舊版本想使用持久連接,則客戶端指定connection:keep-alive,此時服務端會加上首部字段 keep-alive:timeout=10,max=500 後返回響應。

Pragma:no-cache

HTTP/1.1之前的遺留, 存在於客戶端發送的請求中,表示不接受緩存。
為了兼容所有協議的服務器,采用 cache-control:no-cache,pragma:no-cache

Upgrade

用於檢測 HTTP協議及其他協議 是否可使用更高的版本。

客戶端:
Upgrade:TLS/1.0
//指定中間服務器不轉發Upgrade字段,使得Upgrade(只限於客戶端和最終服務器)能轉發到源服務器。
Connection:Upgrade 

服務器端:  
101 Switching Protocols

via

追蹤客戶端與服務器之間的請求和響應報文的傳輸路徑,各個代理服務器會往 Via首部 添加自身服務器的信息。

warning

告知用戶一些與緩存相關的問題的警告。

請求首部字段

用於 補充 請求的附加信息,客戶端信息,對響應內容相關的優先級等內容。

Accept

通知服務器,用戶代理(客戶端)能夠處理的媒體類型及媒體類型的優先級:

q為0到1,代表權重,不指定默認為1,1的優先級最高。

Expect

客戶端告知服務器,期望出現某種特定的行為。服務器無法理解時,返回 471 Expection Failed

可利用此字段,寫明所期望的擴展。

If-Match

IF-xxx 條件請求,只有判斷指定條件為真,服務器才會執行請求。實體標記 ETag 是與特定資源關聯的確定值,資源更新後ETag也會更新。服務器對比 If-Match 字段值和 資源ETag 的值,只有當一致時,才執行請求。If-Match:"*" 代表只要有資源存在就處理請求。

if-modified-since

在if-modified-since指定時間之後,資源發生了更新,服務器才接受請求,否則返回 304

get,head方法中,if-none-match 用於獲取最新的資源。

if-unmodified-since

告知服務器,指定的請求資源只有在字段值內指定的時間日期之後,未發生更新的情況下,才能處理請求。

響應首部字段

服務器端向客戶端返回響應報文中所使用的字段,補充響應的附加信息,服務器信息,以及對客戶端的附加要求。

accept-ranges

accept-ranges:none 不能接受範圍請求
accept-ranges:bytes 可以接受範圍請求

Age

源服務器多久前創建了響應,單位為s,如果創建響應的服務器是緩存服務器,Age是指緩存後的響應再次 發起認證認證完成 的時間值。

ETag

強ETag值,無論發生多麽細微的變化都會改變其值。
弱ETag值,只用於提示資源是否相同,只有資源發生根本改變,產生差異時才會改變ETag值,此時字段開始處附加 W/

Location

響應接收方,引導至某個與請求URI位置不同的資源,通常與3XX,重定向響應配合使用。

Retry-After

單位s 配合503,或3xx,告訴客戶端應該在多久之後再次發送請求。

server

當前服務器上安裝的HTTP服務器應用程序的信息 例如:apache

實體首部字段

content-encoding

會告知客戶端, 服務器對實體主體部分選用的內容編碼方式。 內容編碼:在不丟失實體信息的前提下所進行的壓縮。采用內容編碼傳輸時,不再使用 content-length 計算內容大小。

Content-MD5

確保報文主體是否被篡改

Content-Type

報文主體的媒體類型

expires

服務端將資源的 過期時間 告知客戶端。緩存服務器在收到 expires 字段的響應後,會以緩存來應答請求,在expires字段指定的時間之前,響應的副本會一直保存,當超過指定時間之後,緩存服務器將向源服務器請求資源。

源服務器不希望緩存服務器緩存資源時 ,最好在expires字段寫入與 Date 字段相同的時間值。

Cache-control 有指定max-age指令時,比起 expires ,會優先處理max-age 。 設置max-age:0 則不使用緩存。

有關cookie的字段

set-cookie: 響應首部字段,開始狀態管理所使用的cookie信息。

屬性 說明
NAME=VALUE 賦予Cookie的名稱和值
expires=DATE cookie的有效期,不指定則默認瀏覽器關閉就失效
path=PATH 將服務器的文件目錄作為cookie的適用對象,不指定則默認文檔所在的文件目錄
domain=域名 作為cookie適用對象的域名,不指定則默認創建cookie的服務器的域名
secure 僅在https安全通信時才發送cookie
httponly 使cookie不能被js腳本訪問

一旦 cookie 從服務端發送至客戶端,服務端就 不存在可以顯示刪除cookie 的方法,但是可通過 覆蓋已過期的cookie ,實現對客戶端cookie的實質性刪除。

其他首部字段

X-Frame-Options: 用於控制網站內容在其他web網站的frame內的顯示問題。 可選值:Deny | SAMEORIGIN
X-XSS-Protection: 針對XSS 跨站腳本攻擊. 可選值:0 | 1
DNT:do not track: 拒絕被精準廣告追蹤 0 | 1
P3P: 在線隱私偏好平臺,讓個人隱私變成僅供程序可理解的形式。

HTTPS

HTTPS = HTTP+加密 + 證書 + 完整性保護

HTTP不足:

  1. 通信使用明文(不加密),內容可能會被竊聽
  2. 不驗證通信方身份,因此有可能遭遇偽裝
  3. 無法證明報文的完整性,所以有可能已遭篡改

通信的加密:

  1. HTTP協議中沒有加密機制,但可以通過和SSL(安全套接層)或TLS(安全傳輸層協議)的組合使用,加密HTTP的通信內容。
  2. 用SSL建立安全的通信線路之後,就可以在這條線路上進行HTTP通信了, 與SSL組合使用的HTTP被稱為HTTPS。

證書

用於確認通信方,證書由值得信任的第三方機構頒發。通過使用證書,以證明通信方就是意料中的服務器。客戶端持有證書即可完成個人身份的確認,可用於對WEB網站的認證環節。

在請求或響應的傳輸途中,遭攻擊者攔截並篡改內容的攻擊稱為中間人攻擊 ( MITM ) 。防止篡改:PGP,MD5

通常 HTTP 直接與 TCP 通信,當使用 SSL 時,則變成先和 SSL 通信,再由 SSL 和 TCP 通信。https 是身披 SSL 外殼的HTTP,SSL獨立於HTTP協議,所以其他運行在應用層的SMTP和TELNET等協議均可配合SSL協議使用。SSL是當今世界上最為廣泛的網絡安全技術。

密碼

對稱密碼學:共享秘鑰加密,加密和解密都是同一個秘鑰。(如何秘密的傳遞秘鑰?)
非對稱密碼學:公開密鑰加密, 公鑰和私鑰。(效率低)

發送方,利用【接收方的公鑰】進行加密,然後接收方接收到之後利用自己的【秘鑰】進行解密。

HTTPS采用共享密鑰加密和公開密鑰加密混合的方式。

  1. 使用非對稱密碼學,安全的交換對稱密碼學的秘鑰。
  2. 采用對稱密碼學進行信息的通信。

HTTPS 的加密通信會消耗更多的CPU和內存資源,每次通信都加密,會消耗相當多的資源。因此非敏感信息則使用HTTP通信,敏感信息才使用HTTPS。

認證

BASIC認證,基本認證。
DIGEST認證,摘要認證。
SSL客戶端認證。
FormBase認證,基於表單認證。

  1. BASIC(不常用)
1. 客戶端請求
2. 服務端返回401 Authorization Required,同時返回WWW-Authenticate信息
3. 客戶端用戶名ID+密碼進行BASE64編碼(不安全),字段為Authorization:
4. 服務端返回200或401.

另外想再進行一次BASIC認證時,一般瀏覽器無法實現認證註銷操作。
  1. DIGEST 彌補BASIC的缺點。(不常用)
客戶端:發起認證。
服務端:發送質詢碼
客戶端:通過質詢碼計算出響應碼

session管理及cookie應用

客戶端發送登錄信息,服務器利用 session 記錄登錄信息,並生成 session ID 發送給客戶端,客戶端記錄 session idcookie 中, 客戶端下次請求帶上cookie。

HTTP功能追加

消除HTTP瓶頸的 SPDY

HTTP標準

  1. 一條連接上只可發送一個請求。
  2. 請求只能從客戶端開始,客戶端不可以接收除響應之外的指令。
  3. 請求、響應首部未經壓縮就發送,首部信息越大延遲越大。
  4. 發送冗長的首部,每次相互發送相同的首部造成的浪費越大。
  5. 可任意選擇數據壓縮格式,非強制壓縮發送。
  6. AJAX
  7. Comet 服務器推:
    通常服務器收到請求,處理完畢後立即返回響應,但是為了實現推送,Comet會將響應置於掛起狀態,當服務器有內容更新時,再返回該響應。
  8. SPDY
    1. 多路復用,一條TCP處理多個HTTP請求。
    2. 請求優先級。
    3. 壓縮HTTP首部。
    4. 推送功能。
    5. 服務器提示功能,主動提示客戶端請求所需的資源。

websocket 全雙工通信

客戶端發起連接,之後服務端和客戶端任意一方都可以向對方發送請求。

請求:Upgrade
響應:101 Switching Protocols

HTTP 2.0 2014年標準化

Http Speed + Mobility
Network-Friendly HTTP Upgrade

WEB DAV: 對服務器上的內容直接進行復制,編輯等操作的分布式文件系統。

防火墻: 禁止非指定的 協議和端口號 的數據包通過,因此過去的新系統如果使用了新的端口或者協議,則必須修改防火墻設置。

CGI: Common Gateway Interface 通用網關接口 Web服務器在接收到客戶端發送過來的請求後轉發給程序的一組機制。

使用 CGI 的程序叫做 CGI 程序,如 PHP,Perl,Ruby,C 等編寫而成。之前提到的CGI,每次接收到請求,程序都得啟動一次,因此訪問量大的時候服務器會有相當大的負載。而Servlet運行在與服務器相同的進程中,負載較小。

發布更新信息的RSS/Atom

RSS 簡易信息聚合,聚合內容。

Web的攻擊技術

主動攻擊: SQL註入,QS命令註入
被動攻擊:XSS跨站腳本攻擊,CSR:跨站偽請求攻擊

XSS: 運行非法的 HTML 標簽或 JS ,或在URL中插入script

圖解HTTP-筆記