1.dns解析
爲什麼需要dns解析?
TCP/IP協議只認識ip地址,不認識域名,域名的設計爲了方便記憶,讓你記住一個baidu.com遠比記錄一個180.101.49.12靠譜.
具體什麼是dns解析?
d=domain n=name s=system
域名系統解析,就是把名字轉換成ip
怎麼做dns解析(dns解析的過程)
如果你輸入的是一個ip,那麼顯而易見,你不需要dns解析。
- 把輸入的url中的域名(主機名)抽離出來
- 判斷host文件是否有這個主機名
- 去查本地dns解析緩存
- 問老大的老大根服務器(TLD頂級域名服務器)是否能查出來
- 返回一個小老大的ip,你去問這個人試試
- 這個人不知道,但是他知道A知道,返回A的地址
- … 最後返回了一個ip給你
如果是轉發模式,會一級一級往上查找
什麼是dns負載均衡
在地理位置不同的地方訪問同樣的baidu.com,ip地址不一樣。會返回一個你所在的位置適合的ip給你
dns優化策略
使用meta告訴瀏覽器dns預取
<meta http-equiv="x-dns-prefetch-control" content="on" />
可以讓域名不需要點擊就在後臺解析
因爲靜態資源一般都是使用其他域名來存放(爲了解決一個域名只能同時創建6個左右的tcp連接),所以需要dns預解析來性能優化
瀏覽器緩存、系統緩存、路由器緩存、…進行dns優化
dns一般用tcp還是udp,哪個端口
udp傳輸效率高,傳輸字節數小於512字節的報文
因爲一次dns解析可能需要查詢多次,一次兩次tcp連接與udp還差距不大,但是多次就差距很大。
tcp傳輸大於512字節的報文
tcp可以傳輸證書,簽名,比較可靠
53端口
2.tcp協議
簡單介紹一下osi七層協議
應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層、物理層
tcp、udp在傳輸層 ip協議在網絡層 http在應用層 arp在數據鏈路層
三次握手與四次揮手
SYN(建立連接) ACK(確認) seq(序列號) FIN(結束)
三次握手:
-
第一次客戶端發送 SYN=1 seq=x
-
服務器收到,返回 SYN=1 SEQ=y ACK=1 ACKnumber=x+1
-
客戶端收到,返回ACK=1 ACKnumber=y+1
-
在每個階段丟包:在第三次丟包,服務器會超時重傳第二個包,直到收到相應或者超時
四次揮手:
- FIN=1 SEQ=x 自己處於可以接受數據狀態
- ACK=1,ACKnumber=x+1 收到了,但是我沒準備好
- 還是服務端 FIN=1,seq=y
- 客戶端ACK=1 ACKnumber=y+1 進入TIME_WAIT狀態
- 這個狀態是主動關閉的一方保持的
- 爲了解決最後一個包丟包重傳
- 爲了之前發的包不影響下一次連接
3.https
通俗易懂:https=http+ssl/tls(鑑權/認證)
爲了解決http竊聽
、篡改
、冒充
基本流程:公鑰(非對稱)加密算法:加密和解密的key不一致
客戶端要一個公鑰,加密完成發給你。你收到了,拿自己的私鑰解密
- 怎麼保證公鑰是你發的公鑰
- 使用證書
- 公鑰加密整個信息太耗時。
- 使用對話密鑰(對稱加密)加密信息,公鑰加密對話祕鑰本身
-
客戶端向服務器要公鑰並驗證
-
雙方生成對話密鑰
-
通信
-
ClientHello 我支持A、B、C、D·····加密方法,支持協議版本是1.0,再帶一個隨機數給你
-
那我們用C方法吧,帶一個隨機數,我的證書包裹着我的公鑰給你。
-
收到證書,看一下是不是你,是的話拿出公鑰,再公鑰把一個隨機數加密傳給服務器,並且告訴對方我們要加密說話了
- 證書是B帶着公鑰去機構C申請,然後發給A。A確認是不是B,是B則用這個公鑰
- 爲什麼要再生成一個隨機數。因爲前兩次的隨機數是公開的,這一次的隨機數是加密的,不容易被猜出
- 收到,組成一個對話密鑰,然後告訴對方接下來要開始加密說話了。
4.瀏覽器解析和渲染
瀏覽器通過前面鋪墊這麼多次終於拿到了html
瀏覽器開始解析html,並將元素轉換成一個個dom,構建成dom樹和css樹
- 構建dom樹
- 構建cssom樹
- 加載js(遇到script標籤,阻塞dom樹的創建)等js運行完成,纔會繼續創建dom樹
- 主要是因爲js有可能會對dom操作,瀏覽器無法知道dom節點最後的內容,爲了不造成無意義的操作,阻塞dom樹
- 構建渲染樹
- 由dom和cssom樹合併,(三者一邊加載一邊解析一邊渲染),根據選人數計算可見元素佈局,繪製到屏幕上
- 重排和重繪
- 重繪就是重新繪製,比如把顏色改了一下
- 重排就是重新排列,樹節點改變,需要重新佈局,生成渲染樹