當你在瀏覽器裏輸入一個url發生了什麼?

DNS域名解析

首先瀏覽器拿到咱們的url,會將咱們的url解析出來,而後拿到域名部分,因爲咱們的包在互聯網上傳輸是根據ip地址來尋找下一個轉發點,因此若是咱們以咱們的域名來看成地址顯然是不可能的。因此瀏覽器會拿到咱們的域名而後經過咱們設備內置的dns處理模塊去附近最近的dns服務器去查找該域名對應的ip地址,若是找不到,再去其餘的dns服務器查找,最終將查找到的ip地址放到咱們的請求頭部,而不是咱們的域名。web

(ping www.baidu.com)該指令可用來查看域名的ip

域名查找的過程,主要是根據域名的分級,一級一級的去找,這就是域名分級的做用。下面給一張dns解析的過程圖瀏覽器

clipboard.png

TCP鏈接

客戶端(瀏覽器)經過TCP傳輸協議創建到服務器的TCP鏈接 ,該過程稱爲三次握手,過程以下。安全

clipboard.png

  1. 先Client端發送鏈接、請求報文。讓服務器知道我要發起鏈接
  2. Server端接受鏈接後回覆ACK報文,併爲此次鏈接分配資源。表示服務器知道你要發送數據,而且準備好接收數據
  3. Client端接收到ACK報文後也向Server端發送ACK報文,並分配資源,這樣TCP鏈接就創建了。能夠開始發送數據

發送數據

客戶端(瀏覽器)向web服務器端(HTTP服務器)發送HTTP協議包,請求服務器裏的資源文檔 (telnet 模擬)服務器

接收數據

服務器向客戶端發送HTTP協議應答包網絡

斷開鏈接

等到數據發送完畢,客戶端就會主動發起斷開鏈接,這個過程叫作四次揮手,過程以下url

clipboard.png

  1. Client端發起中斷鏈接請求,也就是發送FIN(結束)報文。Server端接到FIN報文後,意思是說"我Client端沒有數據要發給你了",可是若是你還有數據沒有發送完成,則沒必要急着關閉(Socket),能夠繼續發送數據。
  2. server發送ACK,"告訴Client端,你的請求我收到了,可是我還沒準備好,請繼續等個人消息"。
    wait:這個時候Client端就進入FIN_WAIT狀態,繼續等待Server端的FIN報文。
  3. 當Server端肯定數據已發送完成,則向Client端發送FIN報文,"告訴Client端,好了,我這邊數據發完了,準備好關閉鏈接了"。
  4. Client端收到FIN報文後,"就知道能夠關閉鏈接了,可是他仍是不相信網絡,怕Server端不知道要關閉,因此發送ACK後進入TIME_WAIT狀態,若是Server端沒有收到ACK則能夠重傳。「,Server端收到ACK後,"就知道能夠斷開鏈接了"。Client端等待了2MSL後依然沒有收到回覆,則證實Server端已正常關閉,那好,我Client端也能夠關閉鏈接了。Ok,TCP鏈接就這樣關閉了!

TCP、UDP、http、https是什麼

面向鏈接的TCP

TCP(Transmission Control Protocol,傳輸控制協議)是基於鏈接的協議,也就是說,在正式收發數據前,必須和對方創建可靠的鏈接。一個TCP鏈接必需要通過三次「對話」才能創建起來,其中的過程很是複雜,咱們這裏只作簡單、形象的介紹,你只要作到可以理解這個過程便可。spa

面向非鏈接的UDP協議

「面向非鏈接」就是在正式通訊前沒必要與對方先創建鏈接,無論對方狀態就直接發送。與手機短信很是類似:你在發短信的時候,只須要輸入對方手機號就OK了。
UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是面向非鏈接的協議,它不與對方創建鏈接,而是直接就把數據包發送過去!.net

應用層協議http https

超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最爲普遍的一種網絡協議。
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。
咱們傳輸數據時使用的就是這些協議code

http請求與響應報文

請求報文

  • 請求行server

    • 格式: 請求方法(GET POST DELETE HEAD TRACE OPTION等) 請求資源 (URL) 請求協議版本(HTTP/1.1)
  • 請求頭

  • 請求體

    • 這裏通常是咱們要發送的各類格式的數據,例如表單數據 name=aimee&age=18

響應報文

  • 響應行

    • 響應協議版本號(HTTP/1.1) 響應狀態碼 (200等) 響應狀態文字 (0K等)
  • 響應頭
  • 響應主體

    • 後臺返回給咱們的數據

請求方法 GET POST HEAD

  1. GET 使用URL(?a=xx&b=xx)或Cookie傳參,不能將數據放到請求體中去,若是放到請求體當中,數據是發不出去的。而對於POST要將數據放在BODY中。即xhr.send(data)
  2. GET 的URL會有長度上的限制,因此傳參上面會有限制,而POST能夠傳輸不少數據,雖然它也有大小限制可是能傳輸的數據比GET多得多。之因此傳輸數據都有限制是爲了防止惡意攻擊,保護服務器的安全性。
  3. POST比GET安全(其實只是對於非專業人士來講而已,打開控制檯都一目瞭然)。
  4. HEAD方法用於獲取響應頭,不能把數據放到body中,響應中也不會有數據部分,就算服務器端放了。
相關文章
相關標籤/搜索