使用WireShark瞭解瀏覽器訪問網絡的整個過程

瀏覽器訪問網絡的整個過程有如下幾步:

比如訪問:http://com.test.com/pms/action/mobile/carParkMobileRedirect

  1. DNS域名解析
  2. TCP三次握手
  3. 請求與應答
  4. 關閉連接

HTTP1.1的長連接

HTTP1.1開始默認建立的是長連接,即一旦瀏覽器發起HTTP請求,建立的連接不會請求應答之後立刻斷掉。HTTP1.0當應答結束後,web瀏覽器與web服務器必須四次握手斷開連接。
Connection:請求:close(告訴WEB服務器或者代理服務器,在完成本次請求的響應後,斷開連接,不要等待本次連接的後續請求了)。
keepalive(告訴WEB服務器或者代理服務器,在完成本次請求的響應後,保持連接,等待本次連接的後續請求)。
響應:close(連接已經關閉)。
keepalive(連接保持着,在等待本次連接的後續請求)。
Keep-Alive:如果瀏覽器請求保持連接,則該頭部表明希望 WEB 服務器保持連接多長時間(秒)。例如:Keep-Alive:300

心跳機制:
心跳機制的原理很簡單:客戶端每隔N秒向服務端發送一個心跳消息,服務端收到心跳消息後,回覆同樣的心跳消息給客戶端。如果服務端或客戶端在M秒(M>N)內都沒有收到包括心跳消息在內的任何消息,即心跳超時,我們就認爲目標TCP連接已經斷開了。

短輪詢:
瀏覽器發起一個“詢問”請求,服務器無論有無新數據,都立即響應(有就返回新數據,沒有就返回一個表示’空’的自定義數據格式),一個HTTP連接結束。

長輪詢:
長輪詢的經典實現 —— Comet:基於 HTTP 長連接的“服務器推”技術
瀏覽器發起一個“詢問”請求,當沒有新數據時,服務器端並不立即響應,而是等待數據,當有新數據產生時,才向瀏覽器響應,一個HTTP連接結束。

長連接:
服務器端發送完新數據也不斷開連接,繼續等待下一份新數據,除非超過了一定時限(即自定義的最大連接空閒時長,瀏覽器可以超時重連)

第一個:DNS域名解析

將域名解析成IP,如果url不包含端口號,則會使用該協議的默認端口號,HTTP協議的默認端口號爲80。首先我們知道我們本地的機器上在配置網絡時都會填寫DNS,這樣本機就會把這個url發給這個配置的DNS服務器,如果能夠找到相應的url則返回其ip,否則該DNS將繼續將該解析請求發送給上級DNS,整個DNS可以看做是一個樹狀結構,該請求將一直髮送到根直到得到結果。DNS域名解析時使用的UDP協議。

DNS的過程如下:

  1. 瀏覽器先檢查自身緩存中有沒有被解析過的這個域名對應的IP地址,如果有解析結束,同時域名被緩存的時間也可通過TTL屬性來設置;
  2. 如果瀏覽器緩存中沒有命中(沒有),瀏覽器會檢查操作系統緩存中有沒有對應的已解析的結果。而操作系統也有一個域名解析的過程,在windows中可通過C盤裏面一個叫做hosts的文件來設置,如果你在這裏指定一個域名對應的IP地址,那瀏覽器會首先使用這個IP地址。但是這種操作系統級別的域名解析過程也被很多黑客利用,通過修改你的hosts文件裏的內容吧特定的域名解析到他指定的IP地址還是那個,造成所有的域名劫持。所以在window7中將hosts文件設置成了readonly,防止惡意篡改;
  3. 如果還沒有命中域名,纔會真正的請求本地域名服務器(LDNS)來解析和這個域名,這個服務器一般在你的城市的某個角落,距離不是很遠,而且這臺服務器的性能很好,一般都會緩存域名解析結果,大約80%的域名解析到這裏就完成了。瀏覽器(主機)向其本地域名服務器進行的是遞歸查詢;
  4. 本地域名服務器採用迭代查詢,它先向下一個根域名服務器查詢;
  5. 根域名服務器如果有查詢的IP的值則返回,沒有命中,則告訴本地域名服務器,下一次查詢的頂級域名服務器的IP的值
  6. 本地域名服務器向收到的頂級域名服務器進行查詢;
  7. 頂級域名服務器如果有查詢的IP地址則返回,沒有命中,則告訴本地域名服務,下一次查詢的權限域名服務器的IP的地址
  8. 本地域名服務器向權限域名服務器進行查詢;
  9. 權限域名服務器告訴本地域名服務器,所查詢的IP地址;
  10. 本地域名服務器最後把查詢的結果告訴瀏覽器(主機)

請求:

響應:

WireShark分析DNS報文格式:https://blog.csdn.net/ahafg/article/details/51035691

第二個:TCP三次握手

該過程是爲了建立連接;TCP用 位碼 來作爲標誌位,表示連接的狀態;有如下6種表示:

SYN(synchronous建立連接)
ACK(acknowledgement 確認連接)
PSH(push傳送數據)
FIN(finish結束連接)
RST(reset重置連接)
URG(urgent緊急情況)

TCP報文格式如下:

  • 16位源端口號:16位的源端口中包含初始化通信的端口。源端口和源IP地址的作用是標識報文的返回地址。
  • 16位目的端口號:16位的目的端口域定義傳輸的目的。這個端口指明報文接收計算機上的應用程序地址接口。
  • 32位序號:32位的序列號由接收端計算機使用,重新分段的報文成最初形式。當SYN出現,序列碼實際上是初始序列碼(Initial Sequence Number,ISN),而第一個數據字節是ISN+1。這個序列號(序列碼)可用來補償傳輸中的不一致。
  • 32位確認序號:32位的序列號由接收端計算機使用,重組分段的報文成最初形式。如果設置了ACK控制位,這個值表示一個準備接收的包的序列碼。
  • 4位首部長度:4位包括TCP頭大小,指示何處數據開始。
  • 保留(6位):6位值域,這些位必須是0。爲了將來定義新的用途而保留。
  • 標誌:6位標誌域。表示爲:緊急標誌、有意義的應答標誌、推、重置連接標誌、同步序列號標誌、完成發送數據標誌。按照順序排列是:URG、ACK、PSH、RST、SYN、FIN。
  • 16位窗口大小:用來表示想收到的每個TCP數據段的大小。TCP的流量控制由連接的每一端通過聲明的窗口大小來提供。窗口大小爲字節數,起始於確認序號字段指明的值,這個值是接收端正期望接收的字節。窗口大小是一個16字節字段,因而窗口大小最大爲65535字節。
  • 16位校驗和:16位TCP頭。源機器基於數據內容計算一個數值,收信息機要與源機器數值 結果完全一樣,從而證明數據的有效性。檢驗和覆蓋了整個的TCP報文段:這是一個強制性的字段,一定是由發送端計算和存儲,並由接收端進行驗證的。
  • 16位緊急指針:指向後面是優先數據的字節,在URG標誌設置了時纔有效。如果URG標誌沒有被設置,緊急域作爲填充。加快處理標示爲緊急的數據段。
  • 選項:長度不定,但長度必須爲1個字節。如果沒有選項就表示這個1字節的域等於0。
  • 數據:該TCP協議包負載的數據。

三次握手過程如下:

  1. 第一次握手:Client將標誌位SYN置爲1,隨機產生一個值seq=J,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。
  2. 第二次握手:Server收到數據包後由標誌位SYN=1知道Client請求建立連接,Server將標誌位SYN和ACK都置爲1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。
  3. 第三次握手:Client收到確認後,檢查ack是否爲J+1,ACK是否爲1,如果正確則將標誌位ACK置爲1,ack=K+1,並將該數據包發送給Server,Server檢查ack是否爲K+1,ACK是否爲1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間可以開始傳輸數據了。

    SYN攻擊:

在三次握手過程中,Server發送SYN-ACK之後,收到Client的ACK之前的TCP連接稱爲半連接(half-open connect),此時Server處於SYN_RCVD狀態,當收到ACK後,Server轉入ESTABLISHED狀態。SYN攻擊就是Client在短時間內僞造大量不存在的IP地址,並向Server不斷地發送SYN包,Server回覆確認包,並等待Client的確認,由於源地址是不存在的,因此,Server需要不斷重發直至超時,這些僞造的SYN包將產時間佔用未連接隊列,導致正常的SYN請求因爲隊列滿而被丟棄,從而引起網絡堵塞甚至系統癱瘓。SYN攻擊時一種典型的DDOS攻擊,檢測SYN攻擊的方式非常簡單,即當Server上有大量半連接狀態且源IP地址是隨機的,則可以斷定遭到SYN攻擊了,使用如下命令可以讓之現行:

#netstat -nap | grep SYN_RECV

找到建立的開始跟蹤整個流:

第三個:請求與應答

數據傳輸:

只有成功建立連接後才能進行數據的傳輸:

  1. 瀏覽器向域名發出HTTP請求;
  2. 通過TCP->IP(DNS)->MAC(ARP)->網關->目的主機;
  3. 目的主機收到數據幀,通過IP->TCP->HTTP,HTTP協議單元會迴應HTTP協議格式封裝好的HTML形式數據(HTTP響應);
  4. 該HTML數據通過TCP->IP(DNS)->MAC(ARP)->網關->我的主機;
  5. 我的主機收到數據幀,通過IP->TCP->HTTP->瀏覽器,瀏覽器以網頁形式顯示HTML內容。

HTTP請求由三部分組成:請求行,消息報文,請求正文;格式爲:Method Request-URI HTTP-Version CRLF;Method表示請求方法;Request-URI是一個統一資源標識符;HTTP-Version表示請求的HTTP協議版本;CRLF表示回車和換行。
HTTP響應由三部分組成:狀態行,消息報頭,響應正文;格式爲:HTTP-Version Status-Code Reason-Phrase CRLF;HTTP-Version表示服務器HTTP協議的版本,Status-Code表示服務器發回的響應狀態代碼,Reason-Phrase表示狀態代碼的文本描述。

Method:表示請求方法,HTTP的請求方法如下:
GET:請求或者Request-URI所標識的資源,資源的目錄或者信息放在請求的URL上面;
POST:在Request - URI所標識的資源後面附加新的數據;
HEAD:請求獲取由Request-URI所標識的資源的響應消息報頭;
PUT:請求服務器存儲一個資源,並用Request-URI作爲其標識;
DELETE:請求服務器刪除Request-URI所標識的資源;
TRACE:請求服務器回送收到的請求信息,主要用於測試或診斷;
CONNECT:保留將來使用;
OPTIONS:請求查詢服務器的性能,或者查詢與資源相關的選項和需求速度。

Status-Code:表示狀態碼,由三位數字組成,第一個數字定義了響應的類別,如下:
1xx:指示信息,表示請求已接收,繼續處理;
2xx:成功,表示請求已被成功接收、理解、接受;
3xx:重定向,要完成請求必須進行更進一步的操作;
4xx:客戶端錯誤,請求有語法錯誤或請求無法實現;
5xx:服務器端錯誤,服務器未能實現合法的請求。

常見狀態碼:
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden //服務器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常

狀態碼詳解:http://tool.oschina.net/commons?type=5

常見的請求報頭如下:
Accept:指定客戶端接受那些類型的信息,如:Accept:image/gif,表明希望接受GIF圖像格式的資源;
Accept-Charset:指定客戶端接受的字符集,如:Accept-Charset:iso-8859-1,gb2312.如果在請求消息中沒有設置這個域,缺省是任何字符集都可以接受。
Host:指定被請求資源的Internet主機和端口號;發送請求時,該報頭域是必需的;
User-Agent:請求報頭域允許客戶端將它的操作系統、瀏覽器和其它屬性告訴服務器。

請求頭:https://www.cnblogs.com/skynet/archive/2010/12/11/1903347.html

常見的響應報頭如下:
Location:用於重定向接受者到一個新的位置;
Server:包含了服務器用來處理請求的軟件信息。與User-Agent請求報頭域是相對應的。

第四個:關閉連接

(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狀態,完成四次揮手。


TCP連接釋放的過程:

  1. 瀏覽器向目的主機發出TCP連接結束請求報文,此時進入FIN WAIT狀態;
  2. 該報文FIN標誌位設爲1,表示結束請求;
  3. TCP結束請求報文通過IP(DNS)->MAC(ARP)->網關->目的主機;
  4. 目的主機收到數據幀,通過IP->TCP,TCP協議單元迴應結束應答報文;
  5. 當前只是進行迴應,因爲目的主機可能還有數據要傳,並不急着斷開連接;
  6. 該報文中ACK標誌位設爲1,表示收到結束請求;
  7. 目的數據發送完所有數據後,向我的主機發出TCP連接結束請求報文;
  8. 該報文FIN標誌位設爲1,表示結束請求;
  9. TCP結束請求報文通過IP(DNS)->MAC(ARP)->網關->我的主機;
  10. 我的主機收到數據幀,通過IP->TCP,TCP協議單元迴應結束應答報文,此時進入TIME WAIT狀態,因爲不相信網絡是不靠的,如果目的主機沒收到還可以重發;
  11. 該報文中的FIN標誌位均設爲1,表示結束應答;
  12. 該TCP迴應報文通過IP(DNS)->MAC(ARP)->網關->目的主機;
  13. 目的主機關閉連接;
  14. TIME WAIT等待結束後,沒有收到回覆,說明目的正常關閉了,我的主機也關閉連接。

參考文章:
https://blog.csdn.net/u012862311/article/details/78753232
https://blog.csdn.net/qq_37288477/article/details/86582130
https://blog.csdn.net/Dream_Weave/article/details/85406700
https://www.cnblogs.com/buxiangxin/p/8336022.html

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