歷史: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 能夠併發多個請求和響應,這些資源又有重要性的區別,因此須要制定這些資源的優先級
定義:面向報文的簡單協議 特色:無鏈接的;能夠一對多;盡最大努力交付,不保證可靠;傳輸效率高 應用場景:包總量不多的通訊:DNS;視頻音頻即時通訊;廣播 與tcp的區別:tcp是面向鏈接的,只能一對一,保證可靠,傳輸效率低
定義:分爲應用層,傳輸層,網絡層和數據鏈路層 應用層:決定了向用戶提供何種服務,常見協議有http、ftp、dns 傳輸層:對應用層提供數據傳輸,常見協議有tcp、udp 網絡層:用來處理網絡上的數據包,規定了傳輸路線和怎麼樣把數據包傳送給對方 數據鏈路層:硬件
全稱:Open System Interconnection Reference Model 歷史:當時符合tcp、ip網絡分層的協議不少、很混亂 定義:應用層,表示層,會話層,傳輸層,網絡層,數據鏈路層,物理層 應用層:面向具體的應用傳輸數據 表示層:把數據轉換成合適、可理解的語法 會話層:維護網絡中的鏈接狀態 傳輸層:至關於tcp/ip裏面的傳輸層 網絡層:至關於tcp/ip裏面的網絡層 數據鏈路層:至關於tcp/ip裏面的數據鏈路層 物理層:網絡的物理形式,好比電纜、光纖等
定義:Context Delivery Network,應用了 http 協議裏的緩存和代理技術,代理源站響應客戶端的請求。是一種專門解決長距離網絡傳輸慢這個問題的網絡應用服務。 核心原則:就近原則 使用的技術:緩存代理,負載均衡
硬件含義:物理形式或雲形式的物理機器,可能不是一臺服務器,而是一個集羣。 軟件含義:提供 Web 服務的應用程序
差別: url 是 uri 的一個子集 構成部分:協議名 + 主機名 + 路徑
定義:執行轉發的服務器 匿名代理:隱匿了的代理服務器 透明代理:外界既知道代理,也知道服務器 正向代理:靠近客戶端 反向代理:靠近服務器 用途:負載均衡、內容緩存、安全防禦、數據處理
定義:本質上仍是 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:主要用於頁面之間的通訊,頁面的所屬域不一樣
定義:超文本傳輸協議。它不關心尋址、路由、數據完整性等傳輸細節,而要求這些工做都有下層處理。由於當時流行的 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 所取代
1.DNS 解析:得出 ip 地址 2.HTTP:生成請求報文 3.TCP:將請求報文分紅多個報文段,確保報文段準確送到。使用三次握手確保鏈接可靠 4.ip地址:節點被分配的地址(ip地址:節點被分配的地址;MAC地址:網卡所屬的固定地址),一邊中轉一邊傳動 5.TCP:重組報文 6.HTTP:對請求進行處理
DNS 查詢:因爲 DNS 數據包不大,而且只須要一個請求,一個應答就行了,因此 DNS 協議通常使用 UDP 協議就行了,除非當數據長度大於 512 字節時,纔會使用 tcp 協議。 非權威域名服務器:許多大公司會創建本身的 DNS 服務器,代理用戶訪問核心 DNS 系統。 DNS的查詢順序:瀏覽器 DNS 緩存,操做系統 DNS 緩存,Hosts 文件,非權威域名服務器,根域名服務器,頂級域名服務器,權威域名服務器 DNS 查詢的應用場景:負載均衡、域名屏蔽、域名劫持
目的:主要解決尋址和路由問題,以及如何在兩點傳輸數據包。對比現實中的電話系統。 特色:提供可靠的(數據不丟失)、字節流形式(保證數據完整)的通訊
定義:面向鏈接的、可靠的字節流服務 三次握手:首先客戶端發送一個 syn 的tcp 包,表示請求應答;服務端接受這個 tcp 包以後回傳一個 syn 和 ack 的 tcp 包,表示確認應答;客戶端接受這個 tcp 包以後再發送一個 syc + 1 和 ack 的 tcp 包,表示確認鏈接。 爲何要用三次:防止失效的鏈接請求耗費服務器資源的狀況 四次揮手:首先客戶端說本身已經沒有數據要發送了,可是仍然能夠接受數據;而後服務器回覆收到了,準備關閉請求,可是尚未準備好;而後服務器準備好了以後就對客戶端說已經準備好了;客戶端收到後,回覆能夠關閉了,而後服務器接收到以後就會關閉請求,而客戶端這邊等待一下子以後若是沒有再收到數據纔會關閉。 爲何要四次揮手:由於客戶端再也不發送數據的時候可能還須要接受數據 tcp/ip 協議族:ip協議、tcp協議以及基於它們的其餘協議好比udp協議、dns協議等
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漏洞。