工具:Wireshark(Windows或Linux),tcpdump(Linux)
要求:使用過濾器捕獲特定分組;用腳本分析大量流量數據(建議用perl)。
內容:Web流量分析
清除本機DNS緩存(ipconfig /flushdns),訪問某一網站主頁,捕獲訪問過程當中的全部分組,分析並回答下列問題:
(1)簡述訪問web頁面的過程。php
(2)找出DNS解析請求、應答相關分組,傳輸層使用了何種協議,端口號是多少?所請求域名的IP地址是什麼? html
(3)統計訪問該頁面共有多少請求IP分組,多少響應IP分組?(提示:用腳本編程實現)web
(4)找到TCP鏈接創建的三次握手過程,並結合數據,繪出TCP鏈接創建的完整過程,註明每一個TCP報文段的序號、確認號、以及SYN\ACK的設置。chrome
(5)針對(4))中的TCP鏈接,該TCP鏈接的四元組是什麼?雙方協商的起始序號是什麼?TCP鏈接創建的過程當中,第三次握手是否帶有數據?是否消耗了一個序號?編程
(6)找到TCP鏈接的釋放過程,繪出TCP鏈接釋放的完整過程,註明每一個TCP報文段的序號、確認號、以及FIN\ACK的設置。windows
(7)針對(6)中的TCP鏈接釋放,請問釋放請求由服務器仍是客戶發起?FIN報文段是否攜帶數據,是否消耗一個序號?FIN報文段的序號是什麼?爲何是這個值?瀏覽器
(8)在該TCP鏈接的數據傳輸過程當中,找出每個ACK報文段與相應數據報文段的對應關係,計算這些數據報文段的往返時延RTT(即RTT樣本值)。根據課本200頁5.6.2節內容,給每個數據報文段估算超時時間RTO。(提示:用腳本編程實現)緩存
(9)分別找出一個HTTP請求和響應分組,分析其報文格式。參照課本243頁圖6-12,在截圖中標明各個字段。
安全
(11)請描述
HTTP協議的持續鏈接的兩種工做方式。訪問這些頁面(同一網站的不一樣頁面)的過程當中,採用了哪一種方式?
wireshark簡介
什麼是Wireshark
Wireshark是網絡包分析工具。網絡包分析工具的主要做用是嘗試捕獲網絡包,並嘗試顯示包的儘量詳細的狀況。
你能夠把網絡包分析工具當成是一種用來測量有什麼東西從網線上進出的測量工具,就好像使電工用來測量進入電信的電量的電度表同樣。(固然比那個更高級)過去的此類工具要麼是過於昂貴,要麼是屬於某人私有,或者是兩者兼顧。Wireshark出現之後,這種現狀得以改變。
Wireshark可能算得上是今天能使用的最好的開源網絡分析軟件。
主要應用
下面是Wireshark一些應用的舉例:
• 網絡管理員用來解決網絡問題
• 網絡安全工程師用來檢測安全隱患
• 開發人員用來測試協議執行狀況
• 用來學習網絡協議
除了上面提到的,Wireshark還能夠用在其它許多場合。
wireshark界面以下所示:
![](http://static.javashuo.com/static/loading.gif)
在capture部分選擇網卡,而後點擊start就開始捕獲數據,而後打開瀏覽器訪問某個網頁,便可得到大量數據包。 也能夠經過菜單欄Capture——Interfaces對話框開始。
兩個不錯的教程下載地址:http://down.51cto.com/data/626380
http://down.51cto.com/data/626381
設計與實現過程
(1)簡述訪問web頁面的過程,以西郵主頁爲例:
a)瀏覽器向DNS請求解析www.xupt.edu.cn的IP地址服務器
b)域名系統DNS解析出郵電大學的IP地址202.117.128.8
c)瀏覽器與服務器創建TCP鏈接
d)瀏覽器發出取文件命令
e)服務器端給出響應,把首頁文件發送給瀏覽器
f)釋放TCP鏈接
g)瀏覽器顯示西安郵電大學首頁中的全部文本
(2)wireshark中DNS分組默認使用淺藍色
![](http://static.javashuo.com/static/loading.gif)
DNS解析請求分組,由下圖能夠看出DNS是基於UDP的,源端口號1051,目的端口號53:
DNS應答分組,源端口號53,目的端口號1051:
![](http://static.javashuo.com/static/loading.gif)
如上所示,傳輸層使用了UDP(User Datagram protocol)協議。
請求域名的IP地址爲:202.117.128.8
(
3)應用以下顯示過濾規則,對包進行過濾:
![](http://static.javashuo.com/static/loading.gif)
而後點擊菜單欄的statics,接着點擊summary選項,而後就能看到過濾後顯示的包的各項統計數據:
![](http://static.javashuo.com/static/loading.gif)
由上圖知63個IP請求分組(Display部分traffic,共捕獲155個包,顯示的爲63個)
腳本實現:
- #!/usr/bin/perl
- $i=0;
- while(<>){
- if(/Frame/){
- $i++;
- }
- }
- print "The number of IP request packets is:",$i,"\n";
![](http://static.javashuo.com/static/loading.gif)
(
4)比較重要的TCP三次握手問題,首先按下圖方法(edit——find packet)查找到請求鏈接的包,(捕獲的包少的話,直接觀察查找就行)
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
第一次握手:序號:seq=0;無確認號;ACK=0(not set);SYN=1
![](http://static.javashuo.com/static/loading.gif)
第二次握手:序號:
seq=0;確認號:ack=1;ACK=1;SYN=1
![](http://static.javashuo.com/static/loading.gif)
第三次握手:序號
seq=1;確認號:ack=1;ACK=1;SYN=0(not set);
還有一張畫的略挫的圖:
![](http://static.javashuo.com/static/loading.gif)
(
5)四元組:源IP地址:192.168.1.12二、源端口號:1115;
目的
IP地址:202.117.128.八、目的端口號:80
由上題知,雙方協商的起始序號是
0。
![](http://static.javashuo.com/static/loading.gif)
由上圖,第三次握手後的報文段。序號
seq:=1和第三次握手報文中的序號相同,由此能夠看出第三次報文沒有消耗序號,沒有帶數據。
(
6)比較重要的TCP四次揮手釋放連接
![](http://static.javashuo.com/static/loading.gif)
使用顯示過濾規則選擇一個客戶端端口(打開一個網頁其實會創建許多TCP鏈接,選擇一個端口也是選擇一個特定的TCP鏈接):tcp.port == 2088 獲得下面這些報文
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
第一次揮手。序號:
seq=520三、確認號:ack=91九、FIN=一、ACK=1
![](http://static.javashuo.com/static/loading.gif)
第二次揮手。序號:
seq=91九、確認號:ack=520四、FIN=0、ACK=1
![](http://static.javashuo.com/static/loading.gif)
第三次揮手。序號:
seq=91九、確認號:ack=520四、ACK=一、FIN=1
![](http://static.javashuo.com/static/loading.gif)
第四次揮手。序號:
seq=520四、確認號:ack=920、FIN=0、ACK=1
(7)1. 釋放請求由服務器端(
121.194.7.251)發起的。
2. FIN報文段不攜帶數據,消耗一個序號。根據
TCP規定,FIN報文段即便不攜帶數據,也消耗 掉一個序號。根據第二次揮手報文,確認號爲5204,說明沒有攜帶數據。
3. FIN報文段的序號是
5203。
4. 由下圖能夠看出此報文前的一個報文的確認號爲:
ack=5203,確認號是指望對方下一個報文段的第一個數據字節的序號。即它等於前面已經傳送過的數據的最後一個字節的序號加1。
![](http://static.javashuo.com/static/loading.gif)
(8)報文段的往返時間
RTT(Round-Trip Time)
新的
RTTs =(1-a)*(舊的RTTs)+ a*(新的RTT樣本值)
新的RTTD = (1-b)*(舊的RTTD) + b*|RTTs – 新的RTT樣本|
超時重傳時間RTO = RTTs + 4 * RTTD;
以「tcp.srcport==1715」顯示過濾規則過濾對應一個
tcp端口的tcp鏈接。
而後保存爲純文本格式,並拷到
Linux虛擬機中(爲了使用perl環境):
![](http://static.javashuo.com/static/loading.gif)
perl腳本以下:
- #!/usr/bin/perl
- $i=0;
- @RTT;
- while(<>){
- if(/RTT/){
- @words = split(/ +/,$_);
- $RTT[$i++]=$words[8];
- }
- }
- $i=0;
- $RTTs=0;
- $a=0.125;
- $b=0.25;
- while($RTT[$i]){
- $RTTs *= (1-$a);
- $RTTs += $a*$RTT[$i];
- if($i==0){
- $RTTd=$RTT[$i]/2;
- }else{
- $RTTd *= (1-$b);
- $RTTd += $b * abs($RTTs-$RTT[$i]);
- }
- $RTO = $RTTs + 4*$RTTd;
- print "RTTs=",$RTTs,"\t";
- print "RTTd=",$RTTd,"\t";
- print "RTO=",$RTO,"\n";
- $i++;
- }
在終端執行:
perl 3.plx tcplink
執行結果以下:
(
9)如下是HTTP請求分組:
![](http://static.javashuo.com/static/loading.gif)
請求行:
Request Method:GET(請求的方法)
Request URL:/go/act/sale/qq320x330.php?pid=mm_26051537……(URL)
Request Version:HTTP/1.1(http版本)
首部行:
Host:www.taobao.com\r\n(主機的域名)
Connection:keep-alive\r\n(告訴服務器發送完請求文檔後哦不釋放連接)
User-Agent:Mozilla/5.0(windows NT 5.1) AppleWebkit/537.6(KHTML,like Gecko) chrome/23.0.1243.2 Safari/537.6(用戶代理使用的基於Mozilla內核的瀏覽器)
Accept:text/html(但願接受的文檔格式)
如下是
HTTP響應分組:
![](http://static.javashuo.com/static/loading.gif)
開始行:
Request version:
HTTP/1.1(版本)
Status code:200(狀態碼,
2xx表示成功)
Reponse Phrase:OK
首部行:
Server:
Tengine(web服務器是Tengine)
Date:
Thu,06 Dec 2012 02:57:57 GMT
Connection:keep-alive
Vary:Accept-Encoding
(11)HTTP/1.1協議的持續鏈接有兩種工做方式,即非流水線方式(
without pipelining)和流水線方式(with pipelining)
非流水線方式的特色,是客戶端在收到前一個響應後才能發出下一個請求。
流水線方式的特色,是客戶端在收到
HTTP的響應報文以前就可以接着發送新的值來請求報文。因而一個接一個的請求報文到達服務器後,服務器就可連續發回響應報文。流水線工做方式使TCP鏈接中的空閒時間減小。
![](http://static.javashuo.com/static/loading.gif)
由上圖可知,訪問同一網站的不一樣頁面採用了流水線方式。
如發現錯誤,歡迎給予指正。