描述網絡連接流程

網絡連接流程

0.題記

僅僅是自己的一個知識梳理,不具有參考價值,簡單回憶一下網絡連接的流程,督促自己查看一下相關資料。目的做到不僅要心知肚明,還要做到言出有評。

大通話,以一次瀏覽器訪問某個網址爲例子。(後續要梳理app通過okhttp連接某個網站,然後着重分析下okhttp的底層!)

1.域名解析

一個關鍵點:DNS解析,也就域名解析,作用是URL---->IP地址,形象一點就是一個電話簿。下面給出倆個參考鏈接。

DNS百度百科
什麼是DNS

網上通篇博客描述的過程其實就是DNS緩存的過程,詳情見鏈接2。

簡單順序就是 :

  • 瀏覽器緩存
  • 操作系統緩存
  • DNS遞歸解析器緩存

2.網絡連接-3次握手

先拉個文字回憶線。
SYN:Synchronize Sequence Numbers 同步序列編號
ACK:Acknowledge Character 確認字符

  1. 客戶端開啓,第一次發送TCP報文(SYN)企圖喚醒服務器。
    • 標記位SYN,表示“請求建立新連接”
    • 序號爲seq=x
    • 隨後客戶端進入SYN-SENT階段
  2. 服務器端接收到客戶端的TCP報文,結束監聽,並第一次返回給客戶端報文(SYN-ACK)。報文內容如下:
    • 標誌位:SYN & ACK。表示“確認客戶端的報文Seq序號有效,服務器能正常接收客戶端發送的數據,並同意創建新連接”;
    • 序號:seq=y。這裏是服務器新定義的值。
    • 確認號爲ack=x+1,表示收到客戶端的序號Seq並將其值加1作爲自己確認號Ack的值;
      隨後服務器端進入SYN-RCVD階段。
  3. 客戶端接收到服務器端的TCP報文,確定數據傳輸正常,結束SYN-SENT階段。 第2次返回給客戶端TCP報文(ACK)。
    • 標誌位爲ACK,表示“確認收到服務器端同意連接的信號”(即告訴服務器,我知道你收到我發的數據了)
    • 序號爲seq=x+1,表示收到服務器端的確認號Ack,並將其值作爲自己的序號值
    • 確認號爲ack=y+1,表示收到服務器端序號Seq,並將其值加1作爲自己的確認號Ack的值;隨後客戶端進入ESTABLISHED階段。
      生動的三次握手

3.建立連接後HTTP請求和響應

3.1 請求格式

POST /adduser HTTP/1.1   //請求方法 URI 協議/版本
Host: localhost:8030	//請求頭開始
Connection: keep-alive
Content-Length: 16
Pragma: no-cache
Cache-Control: no-cache
Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9	//請求頭結束

name=name&age=11				//正文...


3.2 響應格式

HTTP/1.1 200 OK					// 協議/版本 狀態碼 狀態碼描述
Date: Fri, 22 May 2009 06:07:21 GMT		//響應頭
Content-Type: text/html; charset=UTF-8

<html>										//信息主體
      <head></head>
      <body>
            <!--body goes here-->
      </body>
</html>

關於響應首行的3位數字狀態碼,可以直接查表找到對應信息。分爲如下5大類。

  • 1xx:客戶端請求已經被接受,需繼續執行;
  • 2xx:請求已成功被服務器接收、理解、並接受。
    • 200:OK
  • 3xx:需要客戶端採取進一步的操作才能完成請求(重定向);
  • 4xx:請求錯誤;
    • 400:Bad Request:語義有誤/請求參數有誤
    • 404:請求失敗,請求所希望得到的資源未被在服務器上發現。
    • 403:服務器已經理解請求,但是拒絕執行它。
  • 5xx/6xx:服務器在處理請求的過程中有錯誤或者異常狀態發生
    • 500:服務器端的源代碼出現錯誤時出現。(服務器崩了)
    • 503:維護/過載

4.客戶端操作

接收到服務器的返回值,解析並進行操作。

5.斷開連接-4次揮手

目的是終止終止TCP連接。四次揮手就是客戶端和服務端之間,總共發送4個包用來確認並完成斷開連接。

  1. TCP客戶端發送一個FIN=x,請求關閉。客戶端進入FIN_WAIT_1
  2. 服務器收到FIN報文,返回ACK=x+1。客戶端進入FIN_WAIT_1
  3. 服務器關閉客戶端的連接,發送FIN=y給客戶端。服務器端進入LAST_ACK
  4. 客戶端收到併發回報文ACK=y+1確認,並將確認序號設置爲收到序號加1。客戶端發送報文後進入TIME_WAIT,等待超時無回覆後關閉。
    發送FIN=y給客戶端。

吐槽

2020年5月20日00:53:16
我去,我用Typora編輯的.md,上傳到CSDN之後發現格式竟然有了變化,只能一點一點修改,醉了(本地圖片要重新上傳,連接格式不一樣,真的無力吐槽)。
努力可能會撒謊,但是努力一定不會白費!最近很喜歡這句話,朋友圈發出來了又刪掉了,感覺自己有點矯情。加油,向跟我一樣同樣在這個點奮鬥的碼農致敬~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章