一、TCP三次握手過稱
1. 第一次握手的數據包
客戶端發送一個TCP,標志位為SYN,序列號為0, 代表客戶端請求建立連接。 如下圖:
2. 第二次握手的數據包
服務器發回確認包, 標志位為 SYN,ACK. 將確認序號(Acknowledgement Number)設置為客戶的I S N加1以.即0+1=1, 如下圖:
3. 第三次握手的數據包
客戶端再次發送確認包(ACK) SYN標志位為0,ACK標志位為1.並且把服務器發來ACK的序號字段+1,放在確定字段中發送給對方.並且在數據段放寫ISN的+1,如圖:
二、TCP頭部中幾種常用的標記位
l SYN:用來表示打開連接;
l FIN:用來表示拆除連接;
l ACK:用來確認(通過TCP連接)收到的數據;
l RST:用來表示立刻拆除連接;
l PSH:用來表示應將數據提交給末端應用程序(進程)處理。
三、Wireshark提示
- [packet size limited during capture] 標記這個包沒有抓全
- [tcp previous segment not captured]網絡包沒有抓到:一種是真的丟包了,一種是抓包工具沒有抓到。看對方回復的確認ack就能判斷
- [tcp asked unseen segment] 幾乎可以忽略,只抓到了后面的ack,沒有抓到前面的數據包
- [tcp out-of-order]亂序
- [tcp dup ack]發生亂序或丟包了
- [tcp fast retransmission] 發送方收到3個或以上tcp dup ack,進入快速重傳
- [tcp retransmission]發生丟包,又沒有后續包觸發dup ack
- [tcp zerowindow] win= 表示發送方當前還有多少緩沖區可以接收數據
- [tcp window full] 發送方已經把接收方的窗口耗盡了,不能再發送數據了
- [tcp segment of a reassembled pdu] 這是啟用了 edit—>preferences—>protocols—>tcp 菜單里的allow sub dissector to reassemble tcp streams,在最后一個包把所有的包虛擬的集中起來,方便復制整個應用層的edu (copy—>bytes—>printable text only)
- [continuation to #]則是上面選項沒啟用
- [time-to-live exceeded]未收全包 無法組裝
四、性能問題分析
- statistics->summary (查看統計信息,比如平均流量)
- statistics->service Response Time->ONC-RPC->program:NFS Version:3—>create stat(衡量服務器性能)
- analyze—>expert info composite (查看重傳統計、連接的建立、重置統計等等)
- statistics->tcp stream graph->tcp sequence graph (生成統計圖,考慮選擇時間的長度)
五、分析命令
tcp.analysis.ack_rtt > 0.2 and tcp.len == 0 過濾是否存在延遲包
握手失敗一般分兩種類型,要么被拒絕,要么是丟包了。
表達式1:flags.reset ==1) && (tcp.seq ==1)
表達式2:(tcp.flags.syn ==1) && (tcp.analysis.retransmission)
六、重傳
當發現網絡包重傳時,需要先檢查重傳出現的時間,即Wireshark抓包文件顯示的發生TCP重傳的時間點,與受監控服務器(生成的)日志顯示的發生應用程序報告的時間點吻合,則可以判斷TCP重傳是服務器程序報錯有關,與網絡無關。