圖解HTTP-筆記
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頁面顯示速度也能提高。
管線化
不用等待上一個請求響應可直接發送下一個請求
cookie
服務器端,設置響應頭字段 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.
- 緩存,請求指令
指令 | 參數 | 說明 |
---|---|---|
no-cache | 無 | 強制向源服務器再次驗證 |
no-store | 無 | 不緩存請求或響應的任何內容 |
max-age = [秒] | 必需 | 響應的最大Age值 |
max-stale(=[秒]) | 可省略 | 接收已過期的響應 |
min-fresh=[秒] | 必需 | 期望在指定時間內的響應仍有效 |
no-transform | 無 | 代理不可更改的媒體類型 |
only-if-cached | 無 | 從緩存獲取資源 |
cache-extension | - | 新指令標記(token) |
- 緩存,響應指令
指令 | 參數 | 說明 |
---|---|---|
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(防止緩存或代理壓縮圖片).
當使用
on-store
指令時,暗示請求或響應中包含機密信息,規定緩存不能在本地存儲請求或響應的任一部分。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
- 用於控制不再轉發的首部字段名。
Upgrade: http/1.1
Connection:Upgrade
則代理服務器接收到這兩個字段時,不會繼續轉發這兩個字段 (Upgrade, Connection
) 到源服務器。
管理持久連接:
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不足:
- 通信使用明文(不加密),內容可能會被竊聽
- 不驗證通信方身份,因此有可能遭遇偽裝
- 無法證明報文的完整性,所以有可能已遭篡改
通信的加密:
- HTTP協議中沒有加密機制,但可以通過和SSL(安全套接層)或TLS(安全傳輸層協議)的組合使用,加密HTTP的通信內容。
- 用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采用共享密鑰加密和公開密鑰加密混合的方式。
- 使用非對稱密碼學,安全的交換對稱密碼學的秘鑰。
- 采用對稱密碼學進行信息的通信。
HTTPS 的加密通信會消耗更多的CPU和內存資源,每次通信都加密,會消耗相當多的資源。因此非敏感信息則使用HTTP通信,敏感信息才使用HTTPS。
認證
BASIC認證,基本認證。
DIGEST認證,摘要認證。
SSL客戶端認證。
FormBase認證,基於表單認證。
- BASIC(不常用)
1. 客戶端請求
2. 服務端返回401 Authorization Required,同時返回WWW-Authenticate信息
3. 客戶端用戶名ID+密碼進行BASE64編碼(不安全),字段為Authorization:
4. 服務端返回200或401.
另外想再進行一次BASIC認證時,一般瀏覽器無法實現認證註銷操作。
- DIGEST 彌補BASIC的缺點。(不常用)
客戶端:發起認證。
服務端:發送質詢碼
客戶端:通過質詢碼計算出響應碼
session管理及cookie應用
客戶端發送登錄信息,服務器利用 session
記錄登錄信息,並生成 session ID
發送給客戶端,客戶端記錄 session id
到 cookie
中, 客戶端下次請求帶上cookie。
HTTP功能追加
消除HTTP瓶頸的 SPDY
HTTP標準
- 一條連接上只可發送一個請求。
- 請求只能從客戶端開始,客戶端不可以接收除響應之外的指令。
- 請求、響應首部未經壓縮就發送,首部信息越大延遲越大。
- 發送冗長的首部,每次相互發送相同的首部造成的浪費越大。
- 可任意選擇數據壓縮格式,非強制壓縮發送。
- AJAX
- Comet 服務器推:
通常服務器收到請求,處理完畢後立即返回響應,但是為了實現推送,Comet會將響應置於掛起狀態,當服務器有內容更新時,再返回該響應。 - SPDY
- 多路復用,一條TCP處理多個HTTP請求。
- 請求優先級。
- 壓縮HTTP首部。
- 推送功能。
- 服務器提示功能,主動提示客戶端請求所需的資源。
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-筆記