Web使用一種名爲HTTP(HyperText Transfer Protocol,超文本傳輸協議)的協議做爲規範,完成從客戶端到服務器等一系列運做流程。而協議是指規則的約定。能夠說,Web是創建在HTTP協議上通訊的。php
如今是http3.0css
http是它們的一個子集。按層次分別分爲如下四層:html
IP協議前端
做用是把各類數據包傳送給對方(根據IP地址、MAC地址)nginx
TCP協議git
爲了更容易傳送大數據,把數據分割成以報文段爲單位的數據包進行管理,可以確認數據是否到達對方(發起三次握手)github
HTTPS基於HTTP協議,經過SSL或TLS提供加密處理數據、驗證對方身份以及數據完整性保護&web
- 內容加密:採用混合加密技術,中間者沒法直接查看明文內容
- 驗證身份:經過證書認證客戶端訪問的是本身的服務器
- 保護數據完整性:防止傳輸的內容被中間人冒充或者篡改
複製代碼
區別:ajax
一個由客戶端發出的請求,會通過 http協議包裝一層,TCP協議包裝一層,IP協議包裝一層,以太網再包裝一層,和發快遞是同樣的,這個過程稱爲封裝,包裝好以後就上路了(經過物理層傳輸),到達服務器就開始拆開這個快遞,從外到內。這個過程任何人沒法絕對掌握數據是否可靠,因此要經過TCP三次握手json
一、發送端發送一個帶SYN(synchronize)標誌的數據包給對方
二、接收端收到後,回傳一個帶有SYN/ACK(acknowledgement)標誌的數據包已示傳達確認信息
三、發送端再回傳一個帶ACK標誌的數據包,表明握手結束
若在握手過程當中某個階段莫名中斷,TCP協議會再次以相同的順序發送相同的數據包
客戶端或服務器都可主動發起揮手動做。
(1)客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送。
(2)服務器B收到這個FIN,它發回一個ACK
(3)服務器B關閉與客戶端A的鏈接,發送一個FIN給客戶端A。
(4)客戶端A發回ACK報文確認。
表示客戶端HTTP請求的返回結果、標識服務器處理是否正常、代表請求出現的錯誤等。
1XX 接收的請求正在處理
2XX 成功(這系列代表請求被正常處理了)
3XX 重定向(代表瀏覽器要執行特殊處理) -301 moved permanently,永久性重定向,表示資源已被分配了新的 URL
4XX 客戶端錯誤,代表客戶端是發生錯誤的緣由所在
5XX 服務器錯誤
位於應用層的協議,提供域名到IP地址之間的解析服務
協議、域名、端口任意一個不一樣,會產生問題是由於瀏覽器的同源策略限制
簡單請求,
後端適配方案: 在respones header中添加Access-Control-Allow-Origin
預檢請求,會在普通跨域請求前添加了個options請求,用來檢查前端headers的修改是否在後端容許範圍內 首先methods設置 PUT、DELETE、CONNECT、OPTIONS、TRACE會致使預檢請求 設置了Accept、Accept-Language、Content-Language、Content-Type 以外的headers中任一的配置,好比常見的token:authorization,緩存機制cache-contorl Content-Type設置了簡單請求不容許的值,如經常使用的application/json
預檢請求就須要後端設置更多的respones headers
- Access-Control-Allow-Methods表明可接受methods
- Access-Control-Allow-Headers表明可接受的headers修改
- Access-Control-Max-Age表明預檢的殘留時間,表明預檢以後能夠免預檢的時間
複製代碼
juejin.im/post/5c35f6… mp.weixin.qq.com/s/S9NYjMAXq…
function jsonp(setting){
setting.data = setting.data || {}
setting.key = setting.key||'callback'
setting.callback = setting.callback||function(){}
setting.data[setting.key] = '__onGetData__'
window.__onGetData__ = function(data){
setting.callback (data);
}
var script = document.createElement('script')
var query = []
for(var key in setting.data){
query.push( key + '='+ encodeURIComponent(setting.data[key]) )
}
script.src = setting.url + '?' + query.join('&')
document.head.appendChild(script)
document.head.removeChild(script)
}
jsonp({
url: 'http://api.jirengu.com/weather.php',
callback: function(ret){
console.log(ret)
}
})
jsonp({
url: 'http://photo.sina.cn/aj/index',
key: 'jsoncallback',
data: {
page: 1,
cate: 'recommend'
},
callback: function(ret){
console.log(ret)
}
})
複製代碼
缺點:只能get請求,須要後端配合,出錯沒法查找緣由
用於服務器和客戶端的全雙工通訊,服務器和客戶端發起一次鏈接後,就會一直保持鏈接的狀態
http的Upgrade字段:websocket,告知服務器通訊協議發生改變
HTTP協議使用 URI 定位互聯網上的資源。概念:
URI(Universal Resource Identifier:統一資源標識符) URL(Universal Resource Locator:統一資源定位符) URN(Universal Resource Name:統一資源名稱)。
URI是由某個協議方案(http、ftp)表示的/資源的/定位標識符(/用來斷句,方便理解)。URI用字符串標識某一互聯網資源,而URL標示資源的地址(互聯網上所處的位置)。URL是URI的子集
跨站腳本攻,利用script標籤,將腳本注入到網頁的一種手段
假如掘金有個加關注的GET接口,id參數是關注人Id,以下:
https://juejin.im?id=5cd0438c6fb9a031ec6d3ab2
那我只須要在個人一個頁面裏面寫一個img標籤:
<img src="https://juejin.im?id=5cd0438c6fb9a031ec6d3ab2" />
CSRF攻擊是源於Web的隱式身份驗證機制!Web的身份驗證機制雖然能夠保證一個請求是來自於某個用戶的瀏覽器,但卻沒法保證該請求是用戶批准發送的。CSRF攻擊的問題通常是由服務端解決,防範 CSRF 攻擊能夠遵循如下幾種規則:
攻擊者將須要攻擊的網站經過 iframe 嵌入本身的網頁中,並將 iframe 設置爲透明,而後誘使用戶在該頁面上進行操做,此時用戶將在不知情的狀況下點擊透明的iframe頁面
防護方法: 使用一個HTTP響應頭——X-Frame-Options。X-Frame-Options能夠說是爲了解決點擊劫持而生的,它有三個可選的值:
攻擊方同時與服務端和客戶端創建起了鏈接,並讓對方認爲鏈接是安全的,可是實際上整個通訊過程都被攻擊者控制了。攻擊者不只能得到雙方的通訊信息,還能修改通訊信息。中間人攻擊的本質是客戶端和服務端之間的認證和信任問題。
HTTPS做爲防止中間人攻擊的終極手段,引入證書機制解決了客戶端和服務端的信任問題,從而較爲有效的防止了中間人攻擊。
用於HTTP協議交互的信息被稱爲HTTP報文。客戶端的HTTP報文叫請求報文,服務端的HTTP報文叫響應報文。
請求報文 是由請求行(請求方法、協議版本)、請求首部(請求URI、客戶端信息等)和內容實體(用戶信息和資源信息等,可爲空)構成。
響應報文 是由狀態行(協議版本、狀態碼)、響應首部(服務器名稱、資源標識等)和內容實體(服務端返回的資源信息)構成。
控制緩存的行爲:no-cache(強制向服務器再次驗證)、no-store(不作任何緩存)、max-age=111111(資源可緩存最大時間 秒)、public(客戶端、代理服務器均可利用緩存)、private(代理服務器不可用緩存)
能正確接收的媒體類型:application/json text/plain
強緩存和協商緩存,根據響應的header內容來決定的
不會發起請求。
cache-control(緩存控制): max-age=number(單位是秒),它規定了一個到期時間,http1.1規範。
expires(到期時間),它的值是個時間的GMT格式的時間字符串,老規範。
會發起一次請求。
這兩組搭檔都是成對出現的,即第一次請求的響應頭帶上某個字段(Last-Modified或者Etag),則後續請求則會帶上對應的請求字段(If-Modified-Since或者If-None-Match),若響應頭沒有Last-Modified或者Etag字段,則請求頭也不會有對應的字段。
etag,它會把一個資源打上一個 「二維碼」
客戶端發送值爲ETag的If-None-Match header字段:
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
服務器將客戶端的ETag(做爲If-None-Match字段的值一塊兒發送)與其當前版本的資源的ETag進行比較,若是兩個值匹配(即資源未更改),服務器將返回不帶任何內容的304未修改狀態,告訴客戶端緩存版本可用(新鮮)。
Last-Modified 是一個響應首部,其中包含源頭服務器認定的資源作出修改的日期及時間。 它一般被用做一個驗證器來判斷接收到的或者存儲的資源是否彼此一致.和請求頭If-Modified-Since(若是有的話)對比,沒變返回304
當與 If-Modified-Since 一同使用的時候,If-None-Match 優先級更高(假如服務器支持的話)
這個簡單,只須要在URI後邊加上query字段便可,也就是咱們所謂的版本號。
function callBack () {
console.log(this.responseText)
}
let xhr = new XMLHttpRequest()
xhr.onload = callBack
xhr.open(method, url, true)
xhr.send()
複製代碼