前端基礎之HTTP篇

http篇

http2.0 協議

歷史:html

http/1.0:每次請求、響應都須要創建一次 tcp 鏈接

http/1.1:能夠持久鏈接,可是必須先進先出(瀏覽器有併發限制,通常是 6 個,同時這個也防止了 ddos 攻擊)

首部壓縮:前端

目標:爲了減小傳輸流量

條件:兩端維護相同的靜態字典和動態字典,而且都支持靜態哈夫曼表的哈夫曼編碼

原理:徹底匹配的鍵值對直接用字典的key;只匹配到頭部信息,能夠用一個字符+哈夫曼編碼;瀏覽器能夠告知服務器往動態字典裏面添加頭部信息

二進制分幀:node

目標:在高層 http api 與低層 tcp 之間引入二進制分幀層,一個請求報文會被分割成多個幀。

原理:tcp 鏈接在客戶端、服務端創建雙向通道;A端將消息切割成多個幀;A端發起一個流,並在流中將多個幀傳輸到B端,B端把多個幀整合成消息。

多路複用:nginx

目標:在一個 tcp 鏈接能夠併發多個請求和響應

原理:二進制分幀的幀具備流ID,接收端能夠根據ID整合幀,這樣能夠無序併發的發送多個流的幀。

注意:因爲能夠併發和木桶效應,影響傳輸的瓶頸在於體積最大的那個幀。

服務器推送web

目標:服務器擁有主動推送資源的能力

原理:服務器在響應請求的時候,能夠主動推送一些其餘的資源。

注意點:須要有請求才能有推送;服務器推送只是減小了客戶端的對推送資源的請求

優先級與依賴性算法

目標:因爲 http2.0 能夠併發多個請求和響應,這些資源又有重要性的區別,因此須要制定這些資源的優先級

udp 協議

定義:面向報文的簡單協議

特色:無鏈接的;能夠一對多;盡最大努力交付,不保證可靠;傳輸效率高

應用場景:包總量不多的通訊:DNS;視頻音頻即時通訊;廣播

與tcp的區別:tcp是面向鏈接的,只能一對一,保證可靠,傳輸效率低

tcp、ip網絡分層

定義:分爲應用層,傳輸層,網絡層和數據鏈路層

應用層:決定了向用戶提供何種服務,常見協議有http、ftp、dns
傳輸層:對應用層提供數據傳輸,常見協議有tcp、udp
網絡層:用來處理網絡上的數據包,規定了傳輸路線和怎麼樣把數據包傳送給對方
數據鏈路層:硬件

osi 七層網絡模型

全稱:Open System Interconnection Reference Model

歷史:當時符合tcp、ip網絡分層的協議不少、很混亂

定義:應用層,表示層,會話層,傳輸層,網絡層,數據鏈路層,物理層

應用層:面向具體的應用傳輸數據
表示層:把數據轉換成合適、可理解的語法
會話層:維護網絡中的鏈接狀態
傳輸層:至關於tcp/ip裏面的傳輸層
網絡層:至關於tcp/ip裏面的網絡層
數據鏈路層:至關於tcp/ip裏面的數據鏈路層
物理層:網絡的物理形式,好比電纜、光纖等

cdn

定義:Context Delivery Network,應用了 http 協議裏的緩存和代理技術,代理源站響應客戶端的請求。是一種專門解決長距離網絡傳輸慢這個問題的網絡應用服務。

核心原則:就近原則

使用的技術:緩存代理,負載均衡

web 服務器

硬件含義:物理形式或雲形式的物理機器,可能不是一臺服務器,而是一個集羣。

軟件含義:提供 Web 服務的應用程序

url 和 uri

差別: url 是 uri 的一個子集

構成部分:協議名 + 主機名 + 路徑

代理

定義:執行轉發的服務器

匿名代理:隱匿了的代理服務器
透明代理:外界既知道代理,也知道服務器
正向代理:靠近客戶端
反向代理:靠近服務器

用途:負載均衡、內容緩存、安全防禦、數據處理

https 協議

定義:本質上仍是 http 協議,只不過把下層的 tcp/ip 協議換成了 ssl/tls

對稱加密:json

定義:加密和解密用的是同一個祕鑰,速度很快

算法:AES,ChaCha20

分組模式:把祕鑰加密成任意長度的密文,好比:GCM,CCM,Poly1305

定義:把算法和分組模式結合起來,就是對稱加密,好比 AES128-GCM 表示祕鑰長度爲 128 位 AES 算法,而且分組模式爲 GCM 的對稱加密方法

非對稱加密:後端

定義:加密和解密用的是不一樣祕鑰,速度不快

例子:DH、DSA、RSA、ECC

RSA:最著名的一個,基於因素分解的數學難題

ECC:是後起之秀,基於橢圓曲線離散對數的數學難題

混合加密:api

原由:須要速度快又安全的加密方式

定義:在通訊剛開始的時候使用非對稱加密,解決祕鑰交換問題,以後使用對稱加密進行信息傳輸

完整性:跨域

定義:指數據在傳輸過程當中沒有被篡改。

算法:摘要算法,好比散列函數、哈希函數

原理:把任意長度的數據加密成任意長度而且獨一無二的摘要字符串

特色:單向不可逆推,雪崩效應

哈希消息認證碼(HMAC):摘要算法並不保證機密性,因此在混合加密裏面同時加密消息和摘要,它主要運用於身份認證中

數字簽名:

定義:是私鑰對摘要的加密,只能由私鑰對應的公鑰解密,實現身份認證。

數字證書:

目標:解決公鑰的信任問題。(由於數字簽名裏面的公鑰容易被替換)

過程:由 CA 把公鑰、序列號、用途、頒發者、有效時間打成一個包再進行簽名,就造成了數字證書

用途:用來在非對稱加密中確認服務器的真實性

中間人攻擊:

定義:中間人產生一對非對稱祕鑰,而後代替僞裝服務器發佈公鑰給客戶端

怎麼避免中間人攻擊:使用數字證書證實公鑰是服務器的公鑰

數字證書所需的 CA 公鑰怎麼認證:內置在瀏覽器或操做系統中

跨域

同源策略:

定義:協議、域名、端口三者必須相同

限制內容:Cookie、Storage、DOM 節點、Ajax 等

解決方案:

圖像ping: 利用了 img src標籤沒有跨域限制的漏洞

jsonp:利用了script標籤沒有跨域限制的漏洞

cors:跨域解決方案,前端不須要作什麼,須要後端配置 cors。(cors請求會分爲簡單請求和非簡單請求,簡單請求的話瀏覽器會自動加上Access-Control-Allow-Origin-xx 頭部,非簡單請求會在通訊以前增長一次 http 查詢請求)

websocket: 使用 ws

node、nginx等代理:服務器沒有同源策略

postmessage:主要用於頁面之間的通訊,頁面的所屬域不一樣

http 協議

定義:超文本傳輸協議。它不關心尋址、路由、數據完整性等傳輸細節,而要求這些工做都有下層處理。由於當時流行的 tcp/ip 協議正好知足 http 的需求,因此 http 協議就運行在了 tcp/ip 之上

報文:

起始行:描述請求或響應的基本信息
頭部字段集合:使用 key-value 的形式更詳細地說明報文
消息正文:實際傳輸的數據,可能不是文字,而是圖片、音頻等二級制數據
請求頭和響應頭:起始行 + 頭部字段集合
實體:消息正文
body:消息正文(與header對應)
請求行:請求報文的起始行。它包括:請求方法、請求目標、版本號
狀態行:響應報文的起始行。它包括:版本號、狀態碼、緣由

頭部通用字段:Cache-Control

public: 表示客戶端和代理服務器均可以緩存
private:表示只有客戶端能夠緩存,默認值
no-cache: 表示使用協商緩存來決定
no-store: 表示既不使用強制緩存,也不使用協商緩存
max-age=xxx:緩存內容將在xxx秒後失效

頭部通用字段:Connection

1.Connection: 再也不轉發的首部字段名
2.Connection: close。由於 http1.1 默認都是持久鏈接,因此能夠用這個字段斷開鏈接
3.Connection: keep-alive。持久鏈接

頭部通用字段:Date

定義:代表建立 http 報文的日期和時間

頭部通用字段:Upgrade

用途:用來檢測 http 協議或其它協議是否可用更高的版本進行通訊

頭部請求字段:Host

用途:告知服務器,請求的資源所處的互聯網主機名和端口號。它是 http1.1 惟一一個必須被包含在請求內的首部字段

頭部請求字段:Accept

用途:告知服務器,用戶代理可以處理的媒體類型和優先級

頭部請求字段:Accept-Charset

用途:告知服務器,用戶代理可以支持的字符集和優先級

頭部請求字段:Accept-Encoding

用途:告知服務器,用戶代理可以支持的內容編碼和優先級

gzip:由 gzip 生成的編碼格式
compress:由 UNIX 文件壓縮程序 compress 生成的編碼格式
deflate:組合使用 zlib 格式並有 deflate 算法生成的編碼格式
identity: 不執行壓縮或不會變化的默認編碼格式

頭部請求字段:Accept-Language

用途:告知服務器,用戶代理可以支持的天然語言集和優先級

頭部請求字段:Authorization

用途:告知服務器,用戶代理的認證信息

頭部請求字段:If-Modified-Since

用途:用於確認資源的更新時間,若是資源發生了更新,服務器會接受請求;若是資源沒有發生更新,服務器會返回狀態碼 304 Not Modified 的響應,瀏覽器使用本地緩存

頭部請求字段:If-None-Match

用途:用於檢查 ETag,若是不一致時,服務器會接受請求;若是一致則返回狀態碼 304 Not Modified 的響應,瀏覽器使用本地緩存

頭部請求字段:Referer

用途:告知服務器,請求的原始資源的 uri

頭部響應字段:Age

用途:告知客戶端,實體從產生到如今通過多長時間

頭部響應字段:ETag

用途:將資源以字符串形式作惟一性標識的方式

頭部響應字段:Location

用途:配合 3xx 能夠將接收方引導至另外一個資源

實體字段:Content-Type

用途:說明實體內對象的數據類型

實體字段:Allow

用途:用於通知客戶端支持的全部 http 方法,當服務器收到不支持的方法時,會以狀態碼 405 Method Not Allowed 做爲響應返回

實體字段:Content-Encoding

用途:告知客戶端實體主體部分選用的內容編碼方式,內容編碼是指在不丟失實體信息的前提下所進行的壓縮

實體字段:Content-Language

用途:告知客戶端實體主體部分選用的天然語言

實體字段:Content-Length

用途:告知客戶端實體主體部分的大小

實體字段:Expires

用途:告知客戶端資源失效的日期

實體字段:Set-Cookie

expires: cookie 的有效期
path: cookie 的文件路徑
domain: cookie 的域名
secure: 限制僅在 https 的狀況下才發送 cookie
HttpOnly: 限制 js 可否獲取 cookie

響應狀態碼

1xx:

定義:表示目前是協議處理的中間狀態,還須要後續的操做

101:表示客戶端正在使用 Upgrade 字段改變協議

2xx:

定義:表示成功,報文已收到並被正確處理

200:OK,表示一切正常
204:No Content,表示一切正常,可是後面沒有 body 數據
206:Partial Content,表示範圍請求,是斷點續傳的基礎

3xx:

定義:重定向,資源位置發生變更,須要客戶端從新發送請求

301:Moved Permanently,永久重定向,請求的資源不存在,須要用新的 uri 訪問。好比網站升級到了 https,之前的 http 再也不使用了,就須要使用 301 跳轉
302:Found,臨時重定向,表示請求的資源還在,但須要暫時用另外一個 uri 訪問。好比夜裏網站後臺須要維護,服務暫不可用,就能夠配置 302 跳轉,此時瀏覽器不會作緩存優化,次日還會訪問原來的地址。
304:Not Modified,表示資源未修改,用於緩存控制,一般不會進行跳轉,可是能夠理解成重定向到已經緩存的文件

4xx:

定義:客戶端錯誤,請求報文有誤,服務器沒法處理

400:Bad Request,表示請求報文有誤,是一個籠統的錯誤,客戶端一頭霧水。在開發時應儘可能使用有其它明確意思的狀態碼。
403:Forbidden,表示服務器禁止訪問資源
404:Not Found,表示資源在本服務器上未找到
405:Method Not Allowed,表示不容許使用某些方法操做資源
406:Not Acceptable,表示資源沒法知足客戶端請求的條件,好比請求中文可是隻有英文
408:Request Timeout,表示請求超時
409:Conflict,表示多個請求發生了衝突
413:Request Entity Too Large,表示請求報文的 body 太大了
414:Request URI Too Large,表示請求行裏的 uri 太大了
429:Too Many Request,客戶端發送了太多的請求
431:Request Header Fields Too Large,請求頭某個字段太大了

5xx:

定義:服務器錯誤,服務器在處理請求時內部發生了錯誤

500:Internal Server Error,通用的服務器錯誤,沒有告知緣由
501:Not Implemented,表示客戶端請求的功能還不支持,意思是即將開業,敬請期待
502:Bad Gateway,表示網關或代理服務器工做正常,可是訪問後端服務器發生了錯誤
503:Service Unavailable,表示服務器當前很忙,暫時沒法響應服務

安全和冪等

安全:指請求方法不會破壞服務器上的資源。只讀操做的 GET 和 HEAD 方法是安全的。

冪等:指屢次執行相同的操做,結果也是相同的。GET 和 HEAD 顯然是冪等的,DELETE 屢次刪除同一個資源,會提示資源不存在,因此也是冪等的,PUT 屢次更新一個資源,結果仍是第一個更新的資源,因此也是冪等的,POST 屢次提交新數據會建立多個資源,因此不是冪等的

併發與域名分片

原理:瀏覽器對每一個域名的併發請求數有數量限制,通常是6個,因此域名分片是指,把單個域名分拆成多個域名,而後指向同一個服務器。

缺點:已過期,如今被 http2.0 所取代

一個 http 請求的全週期

1.DNS 解析:得出 ip 地址
2.HTTP:生成請求報文
3.TCP:將請求報文分紅多個報文段,確保報文段準確送到。使用三次握手確保鏈接可靠
4.ip地址:節點被分配的地址(ip地址:節點被分配的地址;MAC地址:網卡所屬的固定地址),一邊中轉一邊傳動
5.TCP:重組報文
6.HTTP:對請求進行處理

DNS 協議

DNS 查詢:因爲 DNS 數據包不大,而且只須要一個請求,一個應答就行了,因此 DNS 協議通常使用 UDP 協議就行了,除非當數據長度大於 512 字節時,纔會使用 tcp 協議。

非權威域名服務器:許多大公司會創建本身的 DNS 服務器,代理用戶訪問核心 DNS 系統。

DNS的查詢順序:瀏覽器 DNS 緩存,操做系統 DNS 緩存,Hosts 文件,非權威域名服務器,根域名服務器,頂級域名服務器,權威域名服務器

DNS 查詢的應用場景:負載均衡、域名屏蔽、域名劫持

IP 協議

目的:主要解決尋址和路由問題,以及如何在兩點傳輸數據包。對比現實中的電話系統。
特色:提供可靠的(數據不丟失)、字節流形式(保證數據完整)的通訊

TCP 協議

定義:面向鏈接的、可靠的字節流服務

三次握手:首先客戶端發送一個 syn 的tcp 包,表示請求應答;服務端接受這個 tcp 包以後回傳一個 syn 和 ack 的 tcp 包,表示確認應答;客戶端接受這個 tcp 包以後再發送一個 syc + 1 和 ack 的 tcp 包,表示確認鏈接。

爲何要用三次:防止失效的鏈接請求耗費服務器資源的狀況

四次揮手:首先客戶端說本身已經沒有數據要發送了,可是仍然能夠接受數據;而後服務器回覆收到了,準備關閉請求,可是尚未準備好;而後服務器準備好了以後就對客戶端說已經準備好了;客戶端收到後,回覆能夠關閉了,而後服務器接收到以後就會關閉請求,而客戶端這邊等待一下子以後若是沒有再收到數據纔會關閉。

爲何要四次揮手:由於客戶端再也不發送數據的時候可能還須要接受數據

tcp/ip 協議族:ip協議、tcp協議以及基於它們的其餘協議好比udp協議、dns協議等

http 安全

xss 跨站腳本攻擊:

本質:攻擊者提交惡意代碼,瀏覽器執行惡意代碼

反射型:惡意 js 腳本是用戶本身發送給網站的(一般被帶在連接裏面),而後網站又把惡意 js 腳本返回給用戶進行執行,這個時候 js 腳本就會作一些惡意操做。好比:http://localhost:3000/?xss=<script>alert('你被xss攻擊了')</script>

儲存型:惡意 js 腳本被上傳到服務器,經過服務器發送給用戶。好比論壇系統的惡意代碼

DOM型:經過修改 Web 頁面的數據,把惡意代碼注入到 html 裏面,從而在用戶打開頁面的時候執行惡意操做。好比 wifi 路由器劫持、本地惡意軟件劫持等。

應對策略:輸入過濾、轉義、限制輸入長度、使用驗證碼等。

CSP網頁安全策略:本質是白名單,明確告訴瀏覽器,哪些資源能夠加在,開發者能夠經過 meta 標籤添加。好比:<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">

csrf 跨站請求僞造:

概念:誘導用戶在登陸狀態下打開其它網站,此時就能夠利用用戶目前的登陸狀態發起跨站請求

特色:主要發生在第三域名;攻擊者不能獲取 cookie,但能使用

應對策略:使用白名單阻止不明外域的訪問(referer等);請求上添加只有本域才能得到的 csrf token;驗證碼;轉帳前輸入密碼

SameSite:cookie 有一個 SameSite 屬性,它可以禁止第三方請求攜帶cookie

簡單檢測網站是否存在 csrf 漏洞的方法:抓取一個正常請求的數據包,去掉 Referer 字段後再從新提交,若是該提交還有效,那麼基本上能夠肯定存在CSRF漏洞。
相關文章
相關標籤/搜索