餘爲前端菜鳥,感姿式水平匱乏,難觀前端之大局。遂決定循前端知識之脈絡,以興趣爲引,輔以幾分堅持,望於己能解惑致知、於同道能助力一二,豈不美哉。css
本系列代碼及文檔均在 此處html
實體層(物理層):鏈接計算機(光纖、電纜線、無線電波、雙絞線等)。前端
連接層(數據鏈路層):肯定0 1的分組形式。nginx
以太網協議git
一組電信號組成一幀,一幀分爲head和data兩部分,head中包含接收方MAC地址信息,以廣播的方式向本網絡內全部計算機發送數據包,由接收方本身比對MAC地址判斷是否接收。github
網絡層:主機到主機的通訊。web
互聯網由許多子網絡組成,在同一子網中能夠經過MAC地址以廣播形式找到目標,可是不一樣子網廣播不過去,因此須要在網絡層引入新的地址用於查找子網絡,即網址。算法
IP協議chrome
IPV4規定網絡地址由32個二進制位組成,以IP地址與子網掩碼相加是否相等判斷是否位於同一個子網絡。IP數據包放入到以太網數據包的data部分,IP數據包一樣包含head和data兩部分。瀏覽器
ARP協議
經過IP地址獲取MAC地址(不在同一子網交由網關處理),在同一個子網絡中廣播發出數據包包含目標IP地址,MAC地址爲FF:FF:FF:FF:FF:FF目標主機接收到後比對成功後報告本身的MAC地址,因而獲取到了MAC地址,能夠把數據包發送到子網絡裏任一主機。
傳輸層:端口到端口的通訊。(端口爲每一個使用網卡的程序的編號)
UDP協議
數據包放入到IP數據包的data中,一樣由head和data組成,head主要定義發出端口和接收端口,data爲具體內容。
TCP協議
有確認機制的UDP,每一個數據包須要確認,過程複雜,消耗更多的資源。
應用層:規定應用程序的數據格式。(DHCP,DNS,HTTP,FTP,SSH等)
網絡通訊是主機間數據包交換,要交換數據須要知道雙方的MAC地址和IP地址。
用戶能夠經過靜態IP和動態IP兩種方式實現網絡通訊配置。
實例:訪問頁面。
應用層協議,無狀態。
請求/響應模型
客戶端向服務端發送請求,服務端根據接收到的請求,處理後向客戶端返回響應信息。
url
協議類型:[//[訪問資源須要的憑證信息@]服務器地址[:端口號]][/資源層級UNIX文件路徑]文件名[?查詢][#片斷ID]
用於定位資源,輸入url->客戶端展現的過程再也不贅述
請求/響應結構
get和post區別在於前者參數在url後,後者在請求正文;前者有大小限制,後者無,後者有請求體,前者無
關於狀態碼,通常來講簡單記憶以下:1XX 可續發 2XX 成功 3XX 重定向 4XX 客戶端錯誤 5XX 服務端錯誤
長鏈接
// 請求頭、響應頭中包含
Connection: keep-alive
複製代碼
1.1默認開啓長鏈接,使得鏈接在一段時間內維持開啓,後續請求可複用,減小創建鏈接的成本
協議升級
// 請求頭中包含
Connection: Upgrade
Upgrade: websocket
複製代碼
升級爲websocket協議,後續會談到
緩存控制
1.0的expires -> 1.1的cache-control
後者是相對時間,二者都存在時,之後者爲判斷過時依據(瀏覽器判斷)
Etag與Last-Modified
若是上次返回頭中有Etag,則帶上if-none-match信息請求到服務端,服務端進行判斷Etag是否修改,選擇304/200
若是上次返回頭中有Last-Modified,則帶上if-modified-since信息請求道服務端,服務端判斷是否失效,返回304/200
痛點
需優化點
HTTPS運行在SSL/TLS上,SSL/TLS運行在TCP上,全部傳輸內容都是須要加密的,能夠有效防劫持
握手階段:
加密解密
對稱加密/非對稱加密
github免費的github pages用來搭建我的博客很是方便,感興趣的能夠參考這裏
在項目設置下選擇開啓HTTPS便可
小綠鎖很醒目
我的站點升級HTTPS
從域名服務商獲取免費的SSL證書
按照流程填寫
下載證書到服務器(個人是一年免費的谷歌gce)
修改nginx配置
server {
listen 80;
server_name pandora.derekz.cn;
# 重定向到https
rewrite ^(.*)$ https://$host$1 permanent;
location / {
root html;
index index.html index.htm;
}
}
server {
# 順便換http2吧
listen 443 ssl http2;
server_name pandora.derekz.cn;
root html;
index index.html index.htm;
# 你的證書路徑
ssl_certificate /etc/nginx/cert/xxxxxxx.pem;
ssl_certificate_key /etc/nginx/cert/xxxxxxx.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
}
複製代碼
重啓nginx,稍稍等待訪問我的網站
SPDY與HTTP2區別在於前者強制使用SSL傳輸協議,以及二者在首部算法上有所區別,SPDY出現於HTTP2前,特色與HTTP2相似:多路複用、服務器推送、頭部壓縮等。這裏暫不討論。
不須要域名分區,由於不限制,並且能夠雙向並行多個請求/響應
HTTP2的多路複用與1.x的keep-alive本質上有區別,一個位於傳輸層,一個位於應用層,且後者是串行的,前者容許多個文件傳輸幀在圖個TCP鏈接中同時流式傳輸
location / {
root /usr/share/nginx/html;
index index.html index.htm;
http2_push /style.css;
http2_push /example.png;
}
複製代碼
http2_push
字段,只請求了/index.html 卻返回了style.css等額外數據。待研究
細心的小夥伴也許發現了上面的nginx conf文件內有這麼一行
listen 443 ssl http2;
複製代碼
從HTTPS遷移到HTTP2很是簡單,只須要修改nginx配置便可,最後打開chrome能夠看到http2的鏈接狀況
咱們說一個網頁的性能多好,最直接的一個表現是從enter敲下到頁面展現花的時間多短,也就是咱們追求的低延遲高帶寬。帶寬隨着網絡基礎建設不斷提升,因此性能瓶頸主要在於低延遲的難實現。
想一想看,咱們又要DNS解析,又要創建鏈接,還要加密解密,歷經千難萬險才能把請求信息送到服務器上。完了之後那一頭的人還得禮尚往來,這之間每一個步驟都是咱們實現低延遲的障礙,也是咱們優化的方向。
好比DNS預解析、HTTP2的多路複用使用一條鏈接、頭部壓縮、對稱加密+非對稱加密、緩存策略等等。理解這樣一個過程之後,要怎麼作就得實際動手處理問題中積累經驗啦。
雖發表於此,卻畢竟爲一人之言,又是每日學有所得之筆記,內容未必詳實,看官老爺們還望海涵。