前端知識體系(二)http請求

https://blog.csdn.net/Lammonpeter/article/details/81358387html

1、DNS解析瀏覽器

首先DNS域名系統的做用是將輸入的url域名解析成ip地址以方便對於ip對應的電腦的查找。好比:咱們在瀏覽器地址欄輸入:www.baidu.com接下來就是解析過程:緩存

一、首先在瀏覽器的緩存中查找有沒有域名對應的ip地址信息。安全

用戶經過瀏覽器瀏覽過某網站以後,瀏覽器就會自動緩存該網站域名對應的IP地址,當用戶再次訪問的時候,瀏覽器就會從緩存中查找該域名對應的IP地址,由於緩存不只是有大小限制,並且還有時間限制(域名被緩存的時間經過TTL屬性來設置),因此存在域名對應的IP找不到的狀況。當瀏覽器從緩存中找到了該網站域名對應的IP地址,那麼整個DNS解析過程結束,若是沒有找到,將進行下一步驟。對於IP的緩存時間問題,不宜設置太長的緩存時間,時間太長,若是域名對應的IP發生變化,那麼用戶將在一段時間內沒法正常訪問到網站,若是過短,那麼又形成頻繁解析域名。
二、接着在本地系統查找是否緩存過該域名對應的ip地址。服務器

若是第一個步驟沒有完成對域名的解析過程,那麼瀏覽器會去系統緩存中查找系統是否緩存過這個域名對應的IP地址,也能夠理解爲系統本身也具有域名解析的基本能力。在Windows系統中,能夠經過設置hosts文件來將域名手動綁定到某IP上,hosts文件位置在C:\Windows\System32\drivers\etc\hosts。網絡

三、向本地域名系統發起域名解析請求tcp

若是上面第二部仍舊沒有查找到,那麼就要向本地的域名解析系統發送域名解析請求了,本地域名系統LDNS通常都是本地區的域名服務器,好比你鏈接的校園網,那麼域名解析系統就在你的校園機房裏,若是你鏈接的是電信、移動或者聯通的網絡,那麼本地域名解析服務器就在本地區,由各自的運營商來提供服務。對於本地DNS服務器地址,Windows系統使用命令ipconfig就能夠查看,在Linux和Mac系統下,直接使用命令cat /etc/resolv.conf來查看LDNS服務地址。LDNS通常都緩存了大部分的域名解析的結果,固然緩存時間也受域名失效時間控制,大部分的解析工做到這裏就差很少已經結束了,LDNS負責了大部分的解析工做。網站

四、向根域名服務器發起解析請求ui

本地DNS域名解析器尚未完成解析的話,那麼本地域名解析服務器將向根域名服務器發起解析請求。而後根域名服務器再返回給本地域名服務器一個所查詢域(根的子域)的主域名服務器的地址。加密

五、重複查詢

本地服務器再向上一步返回的域名服務器發送請求,而後接受請求的服務器查詢本身的緩存,若是沒有該紀錄,則返回相關的下級的域名服務器的地址。重複這一步,直到找到正確的紀錄。

六、緩存結果

本地域名服務器把返回的結果保存到緩存,以備下一次使用,同時還將結果返回給客戶機。

接下來咱們用nslookup這個命令看,能夠看到有非權威應答,意思就是來自於緩存。若是對域名解析想要深刻了解能夠查看大神博客:https://blog.csdn.net/Lammonpeter/article/details/81358387

2、TCP鏈接

將ip地址解析出來以後,咱們就能夠進行tcp鏈接,這裏是著名的三次握手和四次揮手。

參考:https://blog.csdn.net/qq_34386891/article/details/80515912

三次握手:

第一次握手:

Client將SYN置爲1,seq=隨機值j,將該數據包發送給Server,進入SYN_SENT狀態,等待Server確認。

第二次握手:

Server收到數據包由標誌位SYN=1知道,是請求創建新鏈接, 將ACK置爲1,ack=j+1,做爲響應Client的請求, 將SYN置爲1,seq=隨機值k,發送給Client等待確認, Server進入SYN_RECV狀態 由於是創建鏈接,這些信息在一個數據包中。
第三次握手:

Client收到響應 檢查ACK==1?,ack==j+1?,若都符合 將ACK置爲1,ack=k+1,發送給Server,Client進入establish狀態 Server收到響應 檢查ACK==1?,ack==k+1?,若都符合 進入establish狀態,三次握手完成,TCP鏈接創建,開始通訊。

如圖:

接下來四次揮手:

因爲TCP鏈接時全雙工的,所以,每一個方向都必需要單獨進行關閉,這一原則是當一方完成數據發送任務後,發送一個FIN來終止這一方向的鏈接,收到一個FIN只是意味着這一方向上沒有數據流動了,即不會再收到數據了,可是在這個TCP鏈接上仍然可以發送數據,直到這一方向也發送了FIN。首先進行關閉的一方將執行主動關閉,而另外一方則執行被動關閉。

(1)第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
(2)第二次揮手:Server收到FIN後,發送一個ACK給Client,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。
(3)第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。
(4)第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接着發送一個ACK給Server,確認序號爲收到序號+1,Server進入CLOSED狀態,完成四次揮手。

以下圖:

接下來爲何是三次握手?

在通訊的過程當中,協議會給每一個字節一個序分配一個序號。三步握手的過程,主要是爲了互相確認雙方的起始序列號。

若是隻進行兩次握手,客戶端發送連接請求及起始序列號seq = x, 收到 服務器端的起始序列號seq = y及對客戶端序列號seq= x 的確認。此時,雙方就 客戶端的起始序列號達成了共識。

此時,並無對服務器的起始序列號達成共識,因此就須要進行第三次握手。對B的起始序列號達成共識,不能保證通訊的可靠。

若是進行四次握手,在四次握手的過程當中,能夠把第2、三步合併,這樣能夠提升鏈接的速度與效率。

爲何是四次揮手?

 TCP協議是一種面向鏈接的、可靠的、基於字節流的運輸層通訊協議。TCP是全雙工模式,這就意味着,當主機1發出FIN報文段時,只是表示主機1已經沒有數據要發送了,主機1告訴主機2,它的數據已經所有發送完畢了;可是,這個時候主機1仍是能夠接受來自主機2的數據;當主機2返回ACK報文段時,表示它已經知道主機1沒有數據發送了,可是主機2仍是能夠發送數據到主機1的;當主機2也發送了FIN報文段時,這個時候就表示主機2也沒有數據要發送了,就會告訴主機1,我也沒有數據要發送了,以後彼此就會愉快的中斷此次TCP鏈接。

爲何四次揮手會有TIME_WAIT狀態?

爲了保證B能收到A的確認應答。 
若A發完確認應答後直接進入CLOSED狀態,那麼若是該應答丟失,B等待超時後就會從新發送鏈接釋放請求,但此時A已經關閉了,不會做出任何響應,所以B永遠沒法正常關閉。

 

3、HTTP請求

https://blog.51cto.com/13570193/2108347

https://www.cnblogs.com/ranyonsue/p/5984001.html

 HTTP(超文本傳輸協議)是一種創建在TCP上的無狀態鏈接,整個基本的工做流程是客戶端發送一個HTTP請求,說明客戶端想要訪問的資源和請求的動做,服務端收到請求以後,服務端開始處理請求,並根據請求作出相應的動做訪問服務器資源,最後經過發送HTTP響應把結果返回給客戶端。

HTTP請求:

 HTTP請求是客戶端往服務端發送請求動做,告知服務器本身的要求。HTTP請求由狀態行、請求頭、請求正文三部分組成:

狀態行:包括請求方式Method、資源路徑URL、協議版本Version;

請求頭:包括一些訪問的域名、用戶代理、Cookie等信息;

請求正文:就是HTTP請求的數據

其中請求方式又分爲幾種:

1.GET:獲取資源

  GET方法用來請求訪問已被URI識別的資源。也就是指定了服務器處理請求以後響應的內容。

2.POST:傳輸實體主體

  POST方法用來傳輸實體主體。POST與GET的區別之一就是目的不一樣,兩者之間的區別會在文章的最後詳細說明。雖然GET方法也能夠傳輸,可是通常不用,由於GET的目的是獲取,POST的目的是傳輸。

3.PUT:傳輸文件

  PUT方法用來傳輸文件。相似FTP協議,文件內容包含在請求報文的實體中,而後請求保存到URL指定的服務器位置。

4.HEAD:得到報文首部

  HEAD方法相似GET方法,可是不一樣的是HEAD方法不要求返回數據。用於確認URI的有效性及資源更新時間等。

5.DELETE:刪除文件

  DELETE方法用來刪除文件,是與PUT相反的方法。DELETE是要求返回URL指定的資源。

6.OPTIONS:詢問支持的方法

  由於並非全部的服務器都支持規定的方法,爲了安全有些服務器可能會禁止掉一些方法例如DELETE、PUT等。那麼OPTIONS就是用來詢問服務器支持的方法。

7.TRACE:追蹤路徑

  TRACE方法是讓Web服務器將以前的請求通訊環回給客戶端的方法。這個方法並不經常使用。

8.CONNECT:要求用隧道協議鏈接代理

  CONNECT方法要求在與代理服務器通訊時創建隧道,實現用隧道協議進行TCP通訊。主要使用SSL/TLS協議對通訊內容加密後傳輸。

GET和POST的區別:

    1. GET提交的數據會放在URL以後,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的數據放在HTTP包的Body中.

    2. GET提交的數據大小有限制(由於瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.

    3. GET方式須要使用Request.QueryString來取得變量的值,而POST方式經過Request.Form來獲取變量的值。

    4. GET方式提交數據,會帶來安全問題,好比一個登陸頁面,經過GET方式提交數據時,用戶名和密碼將出如今URL上,若是頁面能夠被緩存或者其餘人能夠訪問這臺機器,就能夠從歷史記錄得到該用戶的帳號和密碼.

HTTP響應:

服務器收到了客戶端發來的HTTP請求後,根據HTTP請求中的動做要求,服務端作出具體的動做,將結果迴應給客戶端,稱爲HTTP響應。HTTP響應由三部分組成:狀態行、響應頭、響應正文;

狀態行:包括協議版本Version、狀態碼Status Code、迴應短語;

響應頭:包括搭建服務器的軟件,發送響應的時間,迴應數據的格式等信息;

響應正文:就是響應的具體數據。

常見狀態碼:

  200---OK/請求已經正常處理完畢

        301---/請求永久重定向

        302---/請求臨時重定向

        304---/請求被重定向到客戶端本地緩存

        400---/客戶端請求存在語法錯誤

        401---/客戶端請求沒有通過受權

        403---/客戶端的請求被服務器拒絕,通常爲客戶端沒有訪問權限

        404---/客戶端請求的URL在服務端不存在

        500---/服務端永久錯誤

        503---/服務端發生臨時錯誤

接下來HTTPS:

https://blog.csdn.net/xiaoming100001/article/details/81109617

HTTPS是一種經過計算機網絡進行安全通訊的傳輸協議,經由HTTP進行通訊,利用SSL/TLS創建全信道,加密數據包。HTTPS使用的主要目的是提供對網站服務器的身份認證,同時保護交換數據的隱私與完整性,此過程當中有兩次HTTP鏈接。

一、client向server發送請求https://baidu.com,而後鏈接到server的443端口。

服務端必需要有一套數字證書,能夠本身製做,也能夠向組織申請。區別就是本身頒發的證書須要客戶端驗證經過,才能夠繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面,這套證書其實就是一對公鑰和私鑰。

二、傳送證書
這個證書其實就是公鑰,只是包含了不少信息,如證書的頒發機構,過時時間、服務端的公鑰,第三方證書認證機構(CA)的簽名,服務端的域名信息等內容。

三、客戶端解析證書
這部分工做是由客戶端的TLS來完成的,首先會驗證公鑰是否有效,好比頒發機構,過時時間等等,若是發現異常,則會彈出一個警告框,提示證書存在問題。若是證書沒有問題,那麼就生成一個隨即值(祕鑰)。而後用證書對該隨機值進行加密。

四、傳送加密信息
這部分傳送的是用證書加密後的祕鑰,目的就是讓服務端獲得這個祕鑰,之後客戶端和服務端的通訊就能夠經過這個隨機值來進行加密解密了。

五、服務段加密信息
服務端用私鑰解密祕密祕鑰,獲得了客戶端傳過來的私鑰,而後把內容經過該值進行對稱加密。

六、傳輸加密後的信息
這部分信息是服務端用私鑰加密後的信息,能夠在客戶端被還原。

七、客戶端解密信息 客戶端用以前生成的私鑰解密服務端傳過來的信息,因而獲取瞭解密後的內容。

相關文章
相關標籤/搜索