1.當用戶輸入url後,期間發生的事情?html
1)若是地址是一個IP地址,會直接找該IP對應的網絡計算機。若是不是IP地址,則經過DNS(域名系統)將該地址解析成IP地址,再去網絡上找對應的計算機。DNS服務器自己也IP,你的網絡設置包含DNS服務器的IP。
注:DNS解析完成,查找對應的網絡計算機時,可能電腦直接詢問的DNS服務器可能沒有對應的IP,那當前DNS服務器就會向它的上級服務器詢問,上級服務器也可能沒有,就依次一層層向上找,最高查找到根節點,找到或者一直找不到爲止。
2)若是地址不包含端口號,協議的默認端口號爲80。若是指定了端口好,那麼使用指定的端口號。
3)IP和端口號都肯定後,發起請求,鏈接對應的網絡計算機和對應的端口。
4)根據http協議要求,須要把大量的請求信息放在請求頭上,發送給對應的服務器。包括請求的資源路徑、請求者身份等信息。
5)服務器響應請求,將數據返回給瀏覽器。瀏覽器接受到html類型的代碼,開始渲染頁面,放遇到內嵌資源地址時,再次向瀏覽器發送請求來獲取這些資源。(若是資源路徑指示的資源不存在,服務器就會返回404錯誤。)
6)將渲染好的頁面顯示出來,並開始響應用戶的操做。
web
域名解析 --> TCP3次握手 --> 發起http請求 --> 服務器響應http請求並傳輸數據 –> 瀏覽器解析並渲染呈現給用戶 –> TCP4次揮手瀏覽器
2.OSI七層模型:緩存
1.物理層 :鏈接線纜的標準服務器
2.數據鏈路層 :加mac地址的標記(網卡的物理地址) 802.3,802.2網絡
3.網絡層:源ip地址,目的ip地址 ip多線程
4.傳輸層 : 源端口,目的端口 tcop/udp編碼
5.會話層 :通訊狀態 操做系統url
6.表示層 : 編碼方式 ASCII操作系統
7.應用層 : http協議就是應用層的一種協議
3.域名解析:從 www.toutiao.com 到 202.108.250.213 的轉換工做稱爲域名解析,域名解析須要由專門的域名解析服務器來完成,DNS就是進行域名解析的服務器
當用戶在瀏覽器輸入https://www.cnblogs.com/時,瀏覽器會對此域名或主機進行解析,獲得對應的IP地址,那麼它時怎麼進行域名解析的呢?
一、首先先去本機hosts文件查找此FQDN沒有沒定義的指向所在的IP地址條目,若是找到,就結束解析
二、若是沒有找到,回去瀏覽器器自己DNS緩存裏去尋找,找打結束解析
三、沒有找到,會去本機配置的首選DNS服務器查詢,通常這是三大運營商提供的,經過UTP53端口發起請求,這個請求是遞歸查詢,DNS服務器收到請求後,會查詢自身緩存,找到條目而且沒有過時,就返回給用戶,結束解析。若是沒有找到,它會去找根服務器,全球13個根服務器(根服務器地址本機DNS服務器內置),詢問根服務器(你知不知道一個域名叫「www.cnblogs.com」的IP地址),根回覆說,(我不知道此域名的IP地址,但我知道com域的IP地址,你去詢問它吧),因而運行商提供的DNS服務器就去詢問com這個域,(你知不知道一個叫「www.cnblogs.com」域名IP地址),com域回答你說,(我不知道此域名的IP地址,但我知道「cnblogs.com域的IP地址,你去問他吧「),這是運行商DNS服務器,對cnblogs.com域發起請求詢問,(你知不知道一個叫」www.cnblogs.com「域的IP地址,它一查,發現此域,就是它負責的,就會對你說,此域是我負責的,它的IP是X.X.X.X這時運行商DNS服務器拿到地址,就會返回客戶主機內核,內核再返回給瀏覽器,到此解析結束,進行下一步。
域名等級:主機名.次級域名.頂級域名.根域名(www.example.com.root)
瀏覽器拿到域名對應的IP後,會拿一個隨機端口向WEB服務程序80端口發起TCP請求連接
第一次握手:創建鏈接,客戶端將SYN標記爲1,seq標記爲x,並將SYN包發送到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到SYN,知道客戶端要創建連接,同時向客戶端也發送一個SYN包(SYN=1)和一個ACK包(ACK=1),隨機產生一個數seq=y,ack=x+1(客戶端的seq值x加1),來確認客戶端的SYN,並進入SYN_RECV;
第三次握手:客戶端收到服務器發來的SYN+ACK後,確認ack值,並回復服務器端一個ACK確認,發送完畢後,雙方進入ESTABLISHED狀態。
三次握手成功後,開始傳輸數據。
一個完整的三次握手也就是 請求---應答---再次確認
連接創建成功後,就要開始下一步,傳輸數據。
接收或拒絕鏈接請求
發送請求報文:報文由請求頭,首部行,實體主體
接收客戶端發來的請求報文中的信息對某資源的一次請求的過程
Web訪問響應模型(Web I/O)
1)單進程I/O模型:
啓動一個進程處理用戶請求,並且一次只處理一個,多個請求被串行響應
2)多進程I/O模型:
並行啓動多個進程,每一個進程響應一個鏈接請求
3)複用I/O結構:
啓動一個進程,同時響應N個鏈接請求
實現方法: 多線程模型和事件驅動
多線程模型: 一個進程生成N個線程,每線程響應一個鏈接請求
事件驅動: 一個進程處理N個請求
4)複用的多進程I/O模型:
啓動M個進程,每一個進程響應N個鏈接請求,同時接收M*N個請求。
服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理。HTTP經常使用請求方式,Method
GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS。
服務器獲取請求報文中請求的資源web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源
資源放在服務端特定的目錄下
備註:經過MAC地址和端口號肯定具體的應用程序
向客戶端回覆報文
最後,當事務結束時,Web服務器會在日誌文件中添加一個條目,來描述已執行的事務
1.爲何創建鏈接協議是三次握手,而關閉鏈接倒是四次握手呢?
這是由於服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求後,它能夠把ACK和SYN(ACK起應答做用,而SYN起同步做用)放在一個報文裏來發送。但關閉鏈接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你全部的數據都所有發送給對方了,因此你能夠未必會立刻會關閉SOCKET,也即你可能還須要發送一些數據給對方以後,再發送FIN報文給對方來表示你贊成如今能夠關閉鏈接了,因此它這裏的ACK報文和FIN報文多數狀況下都是分開發送的.
2.爲何須要三次握手?
若是客戶端遲遲沒有收到服務器返回確認報文,這時會放棄鏈接,從新啓動一條鏈接請求,但問題是,
服務器不知道客戶端沒有收到,因此他會收到兩個鏈接,浪費鏈接開銷。若是每次都是這樣,就會浪費多個鏈接開銷。
爲了防止已失效的鏈接請求報文段忽然又傳送到了服務端,於是產生錯誤。