應用層 -> HTTP FTP 爲應用軟件提供了不少服務 構建於TCP協議之上 屏蔽網絡傳輸的相關細節 傳輸層 -> TCP UDP 向用戶提供可靠的端對端的服務(end to end) (數據量過大,會分包發送) 網絡層 -> 爲數據節點之間傳輸建立邏輯鏈路 數據鏈路層 -> 物理鏈接完成後,須要經過軟件進行鏈接 物理層 -> 網線,光纖等傳輸硬件設備
計算機與網絡設備相互通訊,雙方就必須基於相同的方法,不管是語言之間的通信,設備,硬件,操做系統的通信,怎麼開始,怎麼發起,怎麼結束,都須要一種規則。我這種規則被稱爲協議。例如:TCP、FTP、HTTP、DNS、ICMP、IP、UDP......javascript
IP協議位於網絡層,指的是網際協議。做用是把各類數據包傳送給對方。而要保證確實傳送到對方那裏。(須要兩個重要的條件1:IP地址 2:MAC地址)css
TCP協議位於傳輸層,提供可靠的字節流服務。所謂字節流:指的是把大數據分割成以報文字段爲單位的數據包進行管理。而且將數據準確可靠的傳給對方。html
工做原理: 1.輸入url地址,按回車 2.發生跳轉(redirect)[可能有301的狀況,純客戶端行爲] 3.判斷是否已經緩存過,緩存是否過時等 4.DNS域名解析,把解析完的地址返回給客戶端 5.瀏覽器建立TCP連接,三次握手 6.http生成目標web請求報文 6.1 若是有代理服務器,會先通過代理服務器,也會判斷緩存狀況 7.通過各類路由器[能夠經過抓包工具瞭解通過了哪些路由器] 8.服務器拿到報文信息,並把請求結果,也利用TCP通信協議按照原路返回給客戶端 9.客戶端拿到服務器的http響應報文後,使用了gzip或其餘壓縮算法,拿到指望的HTML代碼 10.在瀏覽器接收完整HTML文件前,瀏覽器就開始渲染頁面了(瀏覽器將HTML字節數據通過一個流程解析爲DOM樹) - 字節->字符->令牌->節點對象->對象模型 11.當HTML代碼遇到<link>標籤時,瀏覽器會發送請求得到該標籤中標記的CSS文件。 使人欣喜的是,這是一個異步請求,不影響其餘操做,瀏覽器得到數據後就會像構建DOM樹同樣構建CSSOM樹。
URL Uniform Resource Identifier /統一資源標誌符 用來惟一標識互聯網上的信息資源 包含了URL URN URL Uniform Resource Locator /統一資源定位器 舊版 http://user:pass@host.com:80/path?query=string#hash 默認端口號:80 URN 永久統一資源定位符
第一次握手:創建鏈接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SENT狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。前端
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;java
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP鏈接成功)狀態,完成三次握手。node
三次握手的目的:爲了防止已失效的鏈接請求報文段忽然又傳送到了服務端,於是產生錯誤
第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。nginx
第二次揮手:Server收到FIN後,發送一個ACK給Client,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。web
第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。算法
第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接着發送一個ACK給Server,確認序號爲收到序號+1,Server進入CLOSED狀態,完成四次揮手。apache
P:由於服務端在LISTEN狀態下,收到創建鏈接請求的SYN報文後,把ACK和SYN放在一個報文裏發送給客戶端。而關閉鏈接時,當收到對方的FIN報文時,僅僅表示對方再也不發送數據了可是還能接收數據,己方也未必所有數據都發送給對方了,因此己方能夠當即close,也能夠發送一些數據給對方後,再發送FIN報文給對方來表示贊成如今關閉鏈接,所以,己方ACK和FIN通常都會分開發送。(因此是四次揮手)
DNS服務是和HTTP協議同樣位於應用層的協議,它提供域名到IP地址之間的解析服務。 計算機擅長處理IP地址這樣長數字形式的內容,但卻不符合人類的記憶習慣,因此用戶會藉助域名(www.baidu.com)和端口號等來記憶。
但域名卻難以理解這樣的一串字符串,所以,DNS協議就營運而生,用於解析域名,經過域名查找IP地址,也能夠逆向從IP地址查找域名
同源策略(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能,若是缺乏了同源策略,則瀏覽器的正常功能可能會受到影響,能夠說web是構建在同源策略基礎上的,瀏覽器只是針對同源策略的一種實現。
他的核心在於它認爲自任何站點裝載的信賴內容都不安全的,當被瀏覽器半信半疑的腳本運行的沙箱時,他們應該只被容許訪問來自統一站點的資源,而不是那些來自其餘站點可能不懷好意的資源
另外,同源策略又分爲如下兩種
1.DOM同源策略:禁止對不一樣源頁面DOM進行操做,這裏主要場景是iframe跨域的狀況,不一樣域名的iframe是限制相互訪問的
2.XMLHttpRequest同源策略:禁止使用XHR對象向不一樣源的服務器發起http請求
若是出現了域名不一樣,協議不一樣,端口不一樣,就會受到同源策略的限制,產生跨域的問題。
同源策略的目的是保證用戶信息安全,防止惡意的網站竊取數據,防止其餘網站在訪問的時候獲取其餘網站留下的cookie信息。
限制範圍:
Cross-Origin Resource Sharing(CORS)跨域資源共享是一份瀏覽器技術的規範,提供了 Web 服務從不一樣域傳來沙盒腳本的方法,以避開瀏覽器的同源策略,確保安全的跨域數據傳輸。現代瀏覽器使用CORS在API容器如XMLHttpRequest來減小HTTP請求的風險來源。與 JSONP 不一樣,CORS 除了 GET 要求方法之外也支持其餘的 HTTP 要求。服務器通常須要增長以下響應頭的一種或幾種: Access-Control-Allow-Origin: *//(不安全)容許跨域的端口(url),或者是一個接口 Access-Control-Allow-Methods: POST, GET, OPTIONS//容許跨域的方式 Access-Control-Allow-Headers: X-PINGOTHER, Content-Type //容許跨域的請求頭,能夠自定 Access-Control-Max-Age: 86400 //容許在一千秒內發起正式,不用發起預請求
jsonp的原理就是,在客戶端和服務端定義一個函數,當客戶端發起一個請求時,服務端返回一段javascript代碼,其中調用了在客戶端定義的函數,並將相應的數據做爲參數傳入該函數。須要先後端協商函數。
代理與反向代理 同源策略是針對瀏覽器端進行的限制,能夠經過服務器端來解決該問題 瀏覽器--訪問(發出請求)--->代理服務器---(代請求)---> 服務器 Nginx,node中間件等
跨域技術不只僅是有這幾種,還有圖片ping方法!(一樣利用了標籤的src不受同源策略影響)、websocket(瀏覽器與服務器全雙工通訊,同時容許跨域通信) 、window.postMessage()等等。(自行百度!)
做用:利用緩存技術減小網絡帶寬的流量,組織內部針對特定網站的訪問控制,以獲取訪問日誌爲主要目的。
特色:代理不改變請求的URL,會直接發送給前方持有資源的目標服務器(源服務器)。在HTTP通訊中,可級聯多臺代理服務器(即請求和響應都通過數臺相似鎖鏈同樣鏈接的代理服務器),轉發時,須要附加Via首部字段以標記出通過的主機信息。
緩存代理:會預先將資源的副本(緩存)保存在代理服務器上,當下次再接受到一樣的請求時,就能夠不須要從源服務器上獲取資源,而是在代理服務器上直接返回資源
透明代理:轉發請求或響應時,不對報文作任何加工的代理類型,叫作透明代理,反之叫非透明代理...
目的:隧道的目的是爲了確保客戶端能與服務器進行安全的通訊
可按要求創建起來一條與其餘服務器的通信線路,屆時使用SSL等加密手段進行通信.確保安全性.隧道自己不會去解析HTTP請求。也就是說,隧道只是用來中轉HTTP請求,當通信雙方斷開鏈接是結束
網關的工做機制和代理十分類似,而網關能使通信線路上的服務器提供非HTTP協議服務。 利用網關能提升通訊的安全性。由於能夠在客戶端與網關之間的通信路上加密以確保連接的安全
使用首部字段是爲了給瀏覽器和服務器提供報文主體大小,所使用的語言,認證信息等內容。
請求報文和響應報文雙方都要使用的首部!
通用首部字段名 | 說明 |
---|---|
Cache-Control | 控制緩存的行爲 |
Connection | 控制不在轉發給代理的首部字段、管理持久連接 |
Date | 建立報文的日期和時間 |
Pragma | 僅做爲HTTP/1.0的向後兼容被定義 |
Trailer | 報文主體後加的首部字段 ,可用在分塊編碼時 |
Transfer-Encoding | 指定報文主體的傳輸編碼格式 |
Upgrade | 檢測協議是否可以使用更高版本,(在使用該字段時要額外添加 Connection:Upgrade字段) |
Via | 追蹤客戶端和服務器以前請求和響應的傳輸路徑,(全部代理服務器的信息) |
Warning | 各類錯誤警告 |
從服務器端向客戶端返回響應報文時使用的首部,補充了響應的附加內容,也會要求客戶端附加的內容信息
響應首部字段名 | 說明 |
---|---|
Accept-Range | 用來告知客戶端服務器是否能處理範圍請求,能夠指定爲betys,反之指定爲none |
Age | 返回資源建立到此次請求所通過的時間,單位爲s |
ETage | 服務器將資源以字符串的形式做惟一標識ETage |
Location | 告知服務器用戶代理可以處理的天然語言以及天然語言的優先級 |
Authorization | 用來告知服務器用戶代理的認證信息(屬客戶端與代理之間的通訊) |
Retry-After | 告知客戶端多久以後再次訪問 |
Server | 告知客戶端當前服務器安裝的HTTP服務器應用程序的信息 |
Vary | 代理服務器須要緩存的管理信息 |
WWW-Authenticate | 服務器對對客戶端的認證信息 |
從客戶端向服務器發送請求報文時使用的首部!補充了請求的附加內容,客戶端信息,響應內容的相關優先級等信息。
請求首部字段名 | 說明 |
---|---|
Accept | 通知服務器用戶代理可處理的媒體類型以及優先級 |
Accept-Charset | 通知服務器用戶代理支持的字符集以及字符集的優先順序 |
Accept-Encoding | 告知服務器用戶代理支持的內容編碼以及內容編碼的優先順序 |
Accept-Language | 告知服務器用戶代理可以處理的天然語言以及天然語言的優先級 |
Authorization | 用來告知服務器用戶代理的認證信息 |
Expet | 期待服務器出現某種待定行爲 |
From | 告知服務器用戶代理的電子郵箱地址 |
Host | 請求資源所處計算機的主機名和端口號 |
If-Match | 告知服務器匹配資源所用的實體標記值 |
If-Modified-Sincest | 告知服務器字段值時間以後有更新資源,則獲取 |
If-None-Match | 和If-Match相反 |
If-Range | 資源未更新時發送實體Bety的範圍請求 |
If-Unmodified-Since | 告知服務器字段之間以後未更新資源,則獲取 |
Max-Forwards | 以十進制的形式指定可通過的服務器的最大數目 |
Proxy-Authorization | 代理服務器要求客戶端的認證信息 |
Pange | 只須要獲取部分資源的請求告知服務器的資源指定範圍 |
Referer | 告知服務器請求的原始資源的URI |
TE | 告知服務器客戶端能處理的編碼格式以及相對優先級 |
User-Agent | Http客戶端的信息,若是請求通過代理也可能會添加代理服務器的信息 |
注:形如If-xxx這樣的請求字段稱爲條件請求,服務器通常接收到附帶條件請求的URL,只有判斷條件成立後纔會執行請求
針對請求報文和響應報文的實體部分使用的首部。補充了資源內容,更新時間等與實體相關的信息。
實體首部字段名 | 說明 |
---|---|
Allow | 通知客戶端能支持的HTTP的全部方法 |
Content-Encoding | 通知客戶端服務器對實體的主體的編碼方式 |
Content-Language | 通知客戶端實體主體的天然語言 |
Content-Length | 實體主體的大小 |
Content-Location | 表示報文返回資源的原始URI |
Content-MD5 | 客戶端對接收到的報文主體執行相同的MD5算法,而後與字段中的值進行比較。(目的檢測傳輸過程實體主體是否保持完整) |
Content-Range | 實體主體返回的是資源的那部分位置範圍 |
Content-Type | 實體主體的媒體類型 |
Expires | 告知客戶端資源的有效截止日期 |
Last-Modified | 告知客戶端資源的最後修改日期 |
自行擴展的,非標轉的首部字段
其餘首部字段名 | 說明 |
---|---|
X-Frame-Options | 控制網站內容在其餘web上用frame標籤內顯示的問題,主要防止點擊劫持攻擊 |
X-XSS-Protection | 針對跨腳本攻擊的一種對策,用於控制瀏覽器XSS防禦機制的開關(0 無效 1 有效) |
DNT | 拒絕我的信息被收集,表示拒絕被精準廣告追蹤的一種方法,(0 贊成 1 拒絕) |
P3P | 在線隱私偏好系統 |
1. 處理預請求 'Access-Control-Allow-Headers':'X-Test-Cors'//容許跨域的請求頭,能夠自定義 'Access-Control-Allow-Methods': 'POST, PUT, Delete'//容許跨域的方式 'Access-Control-Max-Age': '1000' //容許在一千秒內發起正式,不用發起預請求 2. CORS帶Cookie的跨域請求 Access-Control-Allow-Origin:'*' //當設置爲*的時候,容許任何地方的跨域請求,但當帶有Cookie的時候,則報錯,並且,也至關不安全。 //所以,須要設置成指定的要訪問的域。 1.判斷接口是否帶cookie,若是帶cookie,則獲取請求頭部的origin的值(即訪問的域) 而且加上「Access-Control-Allow-Credentials":"true" 3. Content-Type //傳輸的數據類型 (很重要) text/plain multipart/form-data application/x-www-form-urlencoded 4. 可緩存 public (任何地方) private(發起請求的地方) no-cache(驗證後是否使用本地緩存才能緩存) 5. 到期時間 max-age=100 (緩存時間) s-maxage=100 (緩存時間[在代理服務器上用]) max-stale=1000 (即便過去,也還能用,在規定時間範圍內) 6. 從新驗證 must-revalidate (在過時後,在服務端發送請求,從新獲取數據驗證是否真的過時) proxy-revalidate (在緩存服務器上使用) 7. 其餘 no-store (不用驗證,不能緩存,每次都要拿新的內容) no-transform (告訴代理服務器 不容許改動內容) 8. 資源驗證 配合if-Match或者if-Non-Match使用對比資源的簽名判斷是否使用緩存 //第一個修改信息時,把修改的內容發送到服務器,第二次請求的時候,會返回第一次的數值,而後跟如今的數值對比,若是有不同,證實修改了,須要從後臺拿數據
狀態碼的職責是當客戶端向服務器發送請求時,描述返回的請求結果,藉助狀態碼,能夠知道服務器端是正常處理了請求,仍是出現錯誤
code | 類別 | 緣由短語 |
---|---|---|
1XX | Informational(信息性狀態碼) | 接收的請求正在處理 |
2XX | Success(成功狀態碼) | 請求正常處理完畢 |
3XX | Redirection(重定向狀態碼) | 須要進行附加操做以完成請求 |
4XX | Client Error(客戶端錯誤狀態碼) | 服務器沒法處理請求 |
5XX | Server Error(服務器錯誤狀態碼) | 服務器處理請求出錯 |
http狀態碼多達六十多種,但實際使用大概只有十四種左右
code | 緣由短語 |
---|---|
200 | 請求成功 |
204 | 請求成功,但無資源返回 |
206 | 請求成功,只是請求部分資源 |
code | 緣由短語 |
---|---|
301 | 永久性重定向 資源地址更新,須要進行變動,(主要做用在書籤頁) |
302 | 臨時性重定向 資源地址更新,須要進行變動,(主要做用在書籤頁) |
303 | 臨時性重定向 使用get 方法獲取資源 |
304 | 資源找到了,但不符合條件請求,意思是:內容還沒更新,先使用客戶端內緩存的內容(非重定向) |
404 | 服務器沒有找到該資源 |
code | 緣由短語 |
---|---|
400 | 沒法理解請求的內容(報文語法錯誤) |
401 | 須要經過HTTP認證 |
403 | 被服務器拒絕訪問內容 |
404 | 資源找到了,但不符合條件請求,意思是:內容還沒更新,先使用客戶端內緩存的內容(非重定向) |
code | 緣由短語 |
---|---|
500 | 服務器內部出現故障 |
503 | 服務器正忙(處於暫時超負載或者停機維護等,沒法處理請求) |
是目前使用最普遍的Cookie標準,卻不是RFC中定義的任何一個
首部字段名 | 說明 | 首部類型 |
---|---|---|
Set-Cookie | 開始狀態管理所使用的Cookie信息 | 響應首部字段 |
Cookie | 服務器接收到的Cookie信息 | 請求首部字段 |
HTTP協議中沒有加密機制,但能夠經過SSL(安全套接層)或者TLS(安全傳輸層協議)的組合,加密HTTP通訊內容
與SSL組合適用的HTTP稱爲HTTPS 超文本傳輸安全協議 或者HTTP over SSL
前提是要求客戶端和服務器同時具有加密和解密的機制
但因爲加密方式不一樣,報文主體被加密處理,但報文首部未被加密處理,因此仍然有被篡改的風險。
SSL是當今世界上應用最普遍的網絡安全技術
SSL才用一種叫作公開密鑰加密的加密處理方式。 公開密鑰加密使用一對非對稱的密鑰。一把叫作私有密鑰(不能讓任何人知道),一把叫作公開密鑰(隨意發佈)。
HTTPS才用共享密鑰加密和公開密鑰加密二者並用的混合加密機制。
前提:證書的認證主要在三次握手中完成。 1.瀏覽器實現有數字證書機構的公開密鑰。服務器有公鑰和私鑰
PS:非對稱的RSA加密性能是很是低的,緣由在於尋找大素數、大數計算、數據分割須要耗費不少的CPU週期,因此通常的HTTPS鏈接只在第一次握手時使用非對稱加密,經過握手交換對稱加密密鑰,在以後的通訊走對稱加密。
瀏覽器將本身支持的一套加密規則發送給網站。
網站從中選出一組加密算法與HASH算法,並將本身的身份信息以證書的形式發回給瀏覽器。證書裏面包含了網站地址,加密公鑰,以及證書的頒發機構等信息。
瀏覽器得到網站證書以後瀏覽器要作如下工做:
驗證證書的合法性(頒發證書的機構是否合法,證書中包含的網站地址是否與正在訪問的地址一致等),若是證書受信任,則瀏覽器欄裏面會顯示一個小鎖頭,不然會給出證書不受信的提示。
若是證書受信任,或者是用戶接受了不受信的證書,瀏覽器會生成一串隨機數的密碼,並用證書中提供的公鑰加密。
使用約定好的HASH算法計算握手消息,並使用生成的隨機數對消息進行加密,最後將以前生成的全部信息發送給網站。
網站接收瀏覽器發來的數據以後要作如下的操做:
使用本身的私鑰將信息解密取出密碼,使用密碼解密瀏覽器發來的握手消息,並驗證HASH是否與瀏覽器發來的一致。
使用密碼加密一段握手消息,發送給瀏覽器。
瀏覽器解密並計算握手消息的HASH,若是與服務端發來的HASH一致,此時握手過程結束,以後全部的通訊數據將由以前瀏覽器生成的隨機密碼並利用對稱加密算法進行加密。
HTTP/2.0在2014年11月實現標準化,但目前大部分的網絡仍然使用HTTP/1.1協議
HTTP/2 協議由兩個 RFC 組成:一個是 RFC 7540,描述了 HTTP/2 協議自己;一個是 RFC 7541,描述了 HTTP/2 協議中使用的頭部壓縮技術
Keep-Alive 解決了同一域名下屢次請求的重複創建三次握手和四次揮手的問題。只須要創建一次HTTP請求便可。 但仍然存在着 "串行傳輸問題",以及併發問題 由於瀏覽器限制,瀏覽器發起的最大請求數爲6。
服務端推送容許咱們向用戶發送一些尚未被訪問的資源
若樣式、腳本資源之外鏈及模塊形式引用,會更高效地進行緩存。當用戶訪問後續頁面須要這些資源時,能夠直接從緩存中獲取,從而省去了額外的資源請求
當推送資源時,咱們能得到與內聯相同的性能提高,同時保持資源的外鍊形式,從而有獨立的緩存策略。
使用Server Push,一般會如下面的方式使用 Link 這個HTTP首部。
Link: </css/styles.css>; rel=preload; as=style
在進行 HTTP/2 網站性能優化時很重要一點是「使用盡量少的鏈接數」,本文提到的頭部壓縮是其中一個很重要的緣由:同一個鏈接上產生的請求和響應越多,動態字典積累得越全,頭部壓縮效果也就越好。因此,針對 HTTP/2 網站,最佳實踐是不要合併資源,不要散列域名。