1. 程式人生 > >從wireshark中學網路分析(一)

從wireshark中學網路分析(一)

網路是很抽象的,但是在wireshark裡面卻又是相對直觀的。這裡我們列舉了5個問題來進一步直觀地學習TCP協議,並且從中瞭解分析網路效能的一般方法。

問題一:關於子網掩碼和閘道器

伺服器A和B的網路配置如下:
A:
IP address: 192.168.26.129
Subnet mask: 255.255.255.0
Default gateway: 192.168.26.2
B:
IP address: 192.168.26.3
Subnet mask: 255.255.255.224
Default gateway: 192.168.26.2
B的子網掩碼本應該是255.255
.255.0,被不小心配成了255.255.255.224,它們還能正常通訊嗎?

運用我們學過的網路知識,子網掩碼是用來判斷任意兩臺計算機的IP地址是否屬於同一子網路的依據。最為簡單的理解就是兩臺計算機各自的IP地址與子網掩碼進行“與”運算後,如果得出的結果是相同的,則說明這兩臺計算機是處於同一個子網路上的,可以進行直接的通訊,就這麼簡單。

在B上ping A,由於在B看來B_IP&B_mask的結果和A_IP&B_mask的結果不一致,也就是A和B不屬於同一個子網。因為跨子網通訊需要預設閘道器的轉發,所以B要先通過ARP廣播查詢預設閘道器192.168.26.2的MAC地址,之後預設閘道器再把包轉發給A。由於在A看來A_IP&A_mask和B_IP&A_mask的結果一致,也就是A和B屬於同一個子網,所以B可以直接收到A發出的ARP廣播,不需要預設閘道器的參與。之後由於A和B都已經知道對方的MAC地址,不必再發送ARP廣播,直接就是ping請求和ping回覆了。

通訊過程如下圖:
這裡寫圖片描述

問題二:關於MTU

我們都知道網路分層的基本概念,如果我們現在有一個比較大的寫操作,比如8192位元組,那麼TCP層是不是簡單的加上TCP頭就可以交給網路層了呢?很顯然答案是否定的,因為網路對包的大小有限制,其最大稱為MTU,即“最大傳輸單元”。大多數網路的MTU是1500位元組,但也有些網路啟用了巨幀(Jumbo Frame),能達到9000位元組,一個8192位元組的包進入巨幀網路不會有問題,但到了1500位元組的網路中就會被丟棄或者切分。被丟棄意味著傳輸徹底失敗,因為重傳的包還會被丟棄,而被切分則意味著傳輸效率降低。

由於這個原因,TCP不想簡單的將8192位元組的資料一口氣傳給網路層,而是根據雙方的MTU決定每次傳多少。知道自己的MTU容易,那麼對方的MTU是如何獲取的呢?如圖,TCP三次握手的時候,雙方都會把自己的MSS告訴對方,MSS+TCP頭和IP頭的長度,就得到MTU了。而且發包的大小是由MTU較小的一方決定的。

這裡寫圖片描述

另外,如果網路路徑上存在著一個MTU小於1500的裝置,這個包還是可能被丟棄或者切分,所以這個方案並不完美,但是至今沒有更好的辦法。

在這裡我還要說一個我實習時候遇到的關於MTU的一個問題,兩臺主機通過OVS網橋使用vxlan協議傳輸資料,但是傳輸大資料時速度很慢,不到正常值的1/10。後來發現vxlan會對所有經過OVS網橋的資料包進行一個封包操作,也就是會在頭部增加幾個位元組。這樣資料包在經過設定為MTU 1500的裝置時就會發生丟棄或者切分,從而導致這個問題。將裝置的MTU 適當調小之後恢復正常。如果沒有深入地瞭解MTU並且使用wireshark或者tcpdump抓包的話,是很難發現這個問題的。

問題三:經常聽說“TCP Window Scale”這個概念,他究竟和接收視窗有何關係?

TCP剛發明的時候,全世界的網路頻寬都很小,所以最大接收視窗被定義為65535位元組。隨著硬體的革命性進步,65535位元組已經成為效能瓶頸了。1992年的RFC中提出了一個解決方案,就是在三次握手的時候,把自己的Window Scale資訊告知對方,作用就是向對方宣告一個Shift count,我們把它作為2的指數,再乘以TCP頭中定義的接收視窗,就得到真正的TCP接收視窗了。

如下圖:192.168.1.108告訴14.215.177.37說它的Shift count是8。2的8次方是256,這就意味著以後192.168.1.108宣告的接收視窗要乘以256才是真正的視窗值。
這裡寫圖片描述

如下,192.168.1.108宣告自己的接收視窗是183,183*256=66048,所以wireshark就顯示Win=66048了。注意:如果抓包的時候沒有抓到三次握手,那麼wireshark就不知道如何計算,所以有時候我們會很莫名的看到一些極小的接收視窗值。還有些時候是防火牆識別不了Window Scale,因此對方無法獲得Shift count,最終導致嚴重的效能問題。

這裡寫圖片描述

問題四:關於TCP重傳

想必大家都看過計算機網路方面的教材,但是捫心自問,除了記住概念,你又是否真的瞭解TCP滑動視窗和重傳的設計呢?

先說一個誤區,很多人把window size(也就是win=)誤認為是傳送視窗,其實這不是傳送視窗,而是在向對方宣告自己的接收視窗。如果接收方處理資料的速度跟不上接收資料的速度,快取就會被佔滿,從而導致接收視窗為0,對方接收到win=0的資訊後,就會將自己的傳送視窗限制為0,不會再發送資料。

另外,傳送視窗除了受接收方的接收視窗影響之外,還受到網路的影響(也就是我們常說的擁塞視窗),其中限制的更嚴的因素起到決定作用。
網路之所以能限制傳送視窗,是因為他一口氣收到太多資料時就會擁塞,擁塞的結果是丟包,這是傳送方最忌憚的。

接下來我們開看看擁塞視窗如何維護:
1. 連線剛建立的時候,傳送方對網路狀況一無所知,TCP採用慢啟動(指數增長)+擁塞避免(線性增長)的方式來試探擁塞點。如果之前發生過擁塞,就把該擁塞點作為參考依據,如果從來沒有擁塞過就可以取相對較大的值,比如和最大接收視窗相等。
2. 那麼擁塞之後會發生什麼情況呢?
對傳送方來說,就是發出去的包不像往常一樣得到確認了。不過收不到確認也可能是網路延遲所致,所以傳送方決定等待一小段時間再去判斷,如果遲遲收不到,就認定包已經丟失了,需要重傳,這個過程稱為超時重傳。從發出原始包到重傳該包的這段時間稱為RTO。那麼重傳之後的擁塞視窗是否需要調整呢?很顯然是非常有必要的,為了不給擁塞的網路雪上加霜,RFC建議把擁塞視窗降到1個MSS,然後再次進入慢啟動。那麼這一次從慢啟動過渡到擁塞避免的臨界視窗值就有參考依據了。RFC 5681認為應該是發生擁塞時沒被確認的資料量的1/2,但是不能小於2個MSS。不難想象,超時重傳對傳輸效能有嚴重影響。原因之一是在RTO階段不能傳資料,相當於浪費了一段時間;原因之二是擁塞視窗的急劇減小,使得傳輸速率受到影響。所以,即使是萬分之一的超時重傳對效能的影響也非同小可
這裡寫圖片描述

有時候擁塞很輕微,只有少量的包丟失,還有些偶然因素,比如校驗碼不對的時候會導致單個丟包。這兩種丟包的症狀和嚴重擁塞時的不一樣,因為後續有包能夠正常到達。當後續的包到達接收方時,接收方會發現其Seq號比期望的大,所以它每收到一個包就Ack一次期望的Seq號,以此提醒傳送方重傳。當傳送方收到3個或以上重複確認(Dup Ack)時,就意識到響應的包已經丟了,從而立即重傳它,這個過程稱為快速重傳
為什麼要規定湊滿3個呢?這是因為網路包有時候會亂序,亂序的包一樣會觸發重複的Ack,但是為了亂序而重傳沒有必要。由於一般亂序的距離不會相差太大,比如2號包也許會跑到4號包後面,但是不太可能跑到6號包後面,所以限定成3個或以上可以在很大程度上避免因亂序而觸發快速重傳。

那麼快重傳情況下的臨界視窗值如何設定呢?RFC 5681認為臨界視窗值應該設為發生發生擁塞時還沒被確認的資料量的1/2(但是不能小於2個MSS)。然後將擁塞視窗設定為臨界視窗值加3個MSS,繼續保留在擁塞避免階段。這個過程成為快速恢復。
這裡寫圖片描述

問題五:延遲確認與Nagle演算法

傳送視窗一般隻影響大塊的資料傳輸,比如讀寫大檔案。而頻繁互動的小塊資料不太在乎傳送視窗的大小,因為發包量本來就小。日常場景中比如用ssh客戶端連線linux伺服器,隨便輸入一些字元,在網路上就互動了很多小塊的資料了。其實這種方式是很低效的,因為TCP頭和IP頭至少40位元組,而攜帶的資料卻只有幾個字元。

延遲確認就是處理這種互動式場景的一種策略。原理是這樣的:如果收到一個包之後暫時沒有資料要發給對方,那就延遲一段時間(windows上預設200ms)再確認。這樣在這段時間內如果恰好有資料要傳送,那就可以在一個包裡傳送了。它減少了部分確認包,減輕了網路負擔。

還是ssh客戶端的場景,一個RTT內傳送的字元仍然會被逐個打成小包傳送,能不能把在一個RTT內生成的小資料收集起來,合併成一個大包呢?Nagle演算法實現的就是這個功能。原理是:在發出去的資料還沒有被確認之前,假如又有小資料生成,那就把小資料收集起來,湊滿一個MSS或者等收到確認後再發送。

注意:在某些場合,延遲確認和Nagle演算法一起使用甚至會降低效能。具體的案例會在下一篇文章中介紹。

參考資料

《wireshark網路分析就是這麼簡單》
《計算機網路》謝希仁
RFC文件

相關推薦

wireshark中學網路分析()

網路是很抽象的,但是在wireshark裡面卻又是相對直觀的。這裡我們列舉了5個問題來進一步直觀地學習TCP協議,並且從中瞭解分析網路效能的一般方法。 問題一:關於子網掩碼和閘道器 伺服器A和B的網路配置如下: A: IP address:

wireshark中學網路分析(二)

在上一篇文章中提到了TCP的延遲確認,延遲確認並不一定能提高效能,在某些場景下,開啟延遲確認甚至會嚴重降低網路傳輸效能。 (一)下面列出幾個開啟延遲確認降低網路效能的場景: 場景一: 想象這樣一個場景,服務端開啟了延遲確認,客戶端在同一時刻傳送了9個T

wireshark抓包分析rtmp協議,並提取出H264視頻流

tmp mage idt 進制 tro shark src 技術 wid 利用wireshark抓取rtmp流數據, 分析到rtmp流後,寫入過濾條件,如 tcp.stream eq 6導出tcp流保存16進制的數據為純文本格式一定要選擇 Hex轉儲,然後點擊 “Sava

wireshark網路分析

首先感謝偉大程式設計師Ark Zhang提供這些乾貨資料,我只是稍為整理一下而已網路程式除錯中最常用的工具就是wireshark,下面為如何通過抓包分析網路情況:1.客戶端連結伺服器三次握手成功連結後,6秒後傳送5個位元組 HELLO資料後主動傳送FIN包斷開連結,正常的一次

【ArcGIS|空間分析|網路分析】7 使用支車隊服務組停靠點

參考ArcGIS幫助文件 文章目錄 要求 車輛配送 1 建立車輛配送 (VRP) 分析圖層 2 新增停靠點 3 新增站點 4 新增路徑 5 設定車輛配送 (VRP) 分析的屬性 6 執行這一

計算機網路實驗(二)之Wireshark抓包分析獲取URL列表(去重、排序、統計)

實驗要求 本試驗要求基於第一次實驗中訪問某官網主頁時所抓取到的資料包,用Python 3語言、Jupyter Notebook和Pyshark編寫程式碼進行協議分析所需的開發環境,編寫程式碼,以輸出的方式列出首頁以及其所包含的所有資源(至少包含如下型別

使用tcpdump+wireshark抓包分析網路資料包

最近和學弟在除錯一個GPRS通訊模組,需求是通過GPRS模組通過http協議傳送資料到伺服器,但是http協議一直失敗,伺服器返回400,通過查詢http狀態碼得知,http400錯誤是請求無效,因為GPRS模組沒有實現http協議的封裝,需要在TCP協議的基礎上,手動拼裝http格式的報文.所以初步猜測是h

dubbo原始碼分析()-xml到我們認識的Java物件

  專案中用的dubbo的挺多的,然後隨著自己對dubbo的慢慢深入,自己也希望能夠了解dubbo的底層實現,這半年來一直在看dubbo的原始碼,有點斷斷續續的,於是準備寫一個dubbo原始碼系列的分析文章,一來方便自己總結,二來也能夠讓自己的學習有輸出分享。  整個系列會從dubbo的xml到bean到生

挺過最艱難的2018,我終將長大 沉澱年,我想推薦這些書給你 dubbo原始碼分析()-xml到我們認識的Java物件

    2017年結束之後一直沒有更新部落格,2017年的年終總結也沒有寫,一直覺的自己欠自己一個2017。這一年沒有繼續寫部落格,一個原因是自己一整年在瞎忙,忙的暈頭轉向且感覺也沒有收穫多少,同事家裡也發生變故;二是感覺個人沉澱的不夠,需要靜下心沉澱技術與人生。終於渾渾噩噩的2018的過去了,要迎來嶄新的2

SpringMVC(4.x) 搭建到放棄(含原始碼分析)——

1. Spring MVC處理流程 DispatcherServlet -> 處理器對映 -(找到處理器)-> DispatcherServlet -> 控制器 -(邏輯檢視名+Model)-> DispatcherServlet -

【spring】原始碼分析 ContextLoaderListener開始·

原始碼環境 : idea + spring 4.3.4 +tomcat7 + gradle附 : 基於 java  註解的 配置元資料 的 web.xml 配置做參考(spring 3.0 後支援)<?xml version="1.0" encoding="UTF-8"

ECMAScript規範深度分析JavaScript():執行期上下文

本文譯自Dmitry Soshnikov的《ECMA-262-3 in detail》系列教程。其中會加入一些個人見解以及配圖舉例等等,來幫助讀者更好的理解JavaScript。 前言 談到javascript不得不說執行期上下文——Execution context,執行期上下

案例分析:如何0到1對款產品遊戲化

作者:青谷全文共 5369 字 12 圖,閱讀需要 12 分鐘———— / BEGIN / ——

Wireshark網路分析例項集錦(大學霸內部資料)

Wireshark網路分析例項集錦 試讀文件下載 前  言 由於網路廣泛廣泛,與網路相關的安全問題也就變的非常重要。為了更好的分析整個網路的情況,人們開始使用各種專業的資料包分析工具。Wireshark是一款最知名的開源網路封包分析軟體。它可以抓取

Wireshark網路分析的藝術》《Wireshark網路分析就這麼簡單》書評

這兩本書是應該算是同一個作者寫的兩個版本吧。兩本書獨立看,都是沒有問題的。書籍內容這兩本書基本就是講述作者如何使用wireshark解決在工作,生活中遇到的網路問題。每一個小節都是一個獨立的網路問題,涉及面非常廣,幾個tcp協議效能調優案例,幾個ssh登陸延遲原因分析,幾個防

Wireshark網路分析就這麼簡單 -- 目錄

這不僅僅是一本講解 Wireshark 的書,更重要的,理解:從巨集觀層面看微觀,用工具的手段看協議。 Wireshark 是強大的協議分析工具,有 Window、Mac、Linux 等多種版本,依靠它,可以洞悉各種協議的巨集觀和微觀,可以更快的學習協議。相比較 Char

WireShark資料包分析實戰》二、讓網路不再卡

TCP的錯誤恢復我是我們定位、診斷、並最終修復網路高延遲的最好工具。1.TCP重傳      重傳資料包是TCP最基本的錯誤恢復特性之一,它被設計用來對付資料包丟失。     資料包丟失可能有很多原因,包括出故障的應用程式、流量負載沉重的路由器,或者臨時性的服務中斷。資料包層

卷積神經網路入門種全卷積神經網路(LeNet),左至右依次為卷積→子取樣→卷積→子取樣→全連線→全連線→高斯連線測試 最後,為了檢驗 CNN 能否工作,我們準備不同的另組圖片與標記集(不能在訓練

轉載來自:http://blog.csdn.net/maweifei/article/details/52443995 第一層——數學部分 CNN 的第一層通常是卷積層(Convolutional Layer)。輸入內容為一個 32 x 32 x 3 的畫素值陣列。現在

wireshark+共享網路抓包分析手機APP

Wireshark使用說明Wireshark 是網路包分析工具。網路包分析工具的主要作用是嘗試捕獲網路包, 並嘗試顯示包的儘可能詳細的情況。你可以把網路包分析工具當成是一種用來測量有什麼東西從網線上進出的測量工具,就好像使電工用來測量進入電信的電量的電度表一樣。(當然比那個更

(計算機網路課程實驗)學習使用Wireshark進行網路捕獲與分析

一、實驗目的 學習使用Wireshark進行網路捕獲與分析 二、實驗內容 使用Wireshark捕獲TCP、UDP,ARP,HTTP等協議幀,並參照對應協議的幀格式進行閱讀。 三、實驗過程及結果 1,TCP協議幀: 對應的IP協議幀: 對應的TCP協議幀: