《網絡分析技術之葵花寶典》要點:
本文介紹了網絡分析技術之葵花寶典,希望對您有用。如果有疑問,可以聯系我們。
請及時關注“高效運維(微信ID:greatops)”公眾號,并置頂公眾號,以免錯過各種干貨滿滿的原創文章.
作者介紹:
胥峰
盛大游戲高級研究員 高級信息系統項目管理師
《Linux運維最佳實踐》(在版)作者2006年畢業于南京大學,2011年加入盛大游戲.十年運維經驗,曾參與盛大游戲多款大型端游和手游的上線運維,主導統一運維平臺的產品功能設計和實施.擁有工信部認證高級信息系統項目管理師資格.
引言:在游戲運維過程中,我們經常會遇到各種看起來與網絡有關的故障.如何快速定位和排除故障,是我們需要面對的挑戰.
本文主要分享一些使用網絡分析技術tcpdump來解決實際問題的案例,傳遞網絡分析的思想、最佳實踐,和大家一起探討學習.
分享的內容由五部分組成:
1. 背景
2. 案例
3. 技巧
4. 原理
5. 總結
其實,我們可以多做一步:先用常見網絡分析技術如tcpdump,判斷下問題,然后再決定下一步行動.
說明:如下案例都通過tcpdump抓包并用Wireshark進行分析.關于這兩個利器的使用技巧詳見后文.
現象:2012年11月1日~11月7日某游戲技術封測,部分玩家更新失敗
從這個圖里,我們可以看到,玩家下載更新時,被引導到一個非我司的IP地址上.下面我們來看看,在底層的網絡層面,發生了什么.
通過上述網絡抓包,可以更清晰地看到來龍去脈,并可作為證據留存.
在本例中,帶寬最小值和最大值都是100Mb/s,這明顯是有問題的.
我們抓包看看情況.
由圖可見,在TCP的SYN包中,被攜帶了數據.這說明,該主機對外DOS攻擊(原因是什么?各種啊..).
在目前的TCP協議實現中,SYN包中并不攜帶數據
注意: 有興趣的同學可以關注下TCP Fast Open技術,在最新的內核中已經支持.這個技術允許在TCP SYN包中攜帶數據,以減少對端連續建立多個TCP通道的消耗.
有你,是盛大推出的一款網絡短信工具,有類似“朋友圈”的功能.
問題現象:在“有你”這款工具的運營中,發現Nginx日志中存在499狀態碼的訪問,且較多.
499狀態碼為Nginx特有,意思是“客戶端已經關閉連接”
通過分析,我們發現存在2個問題:
1)紅色圈中的2個packet,可以看出從NetScaler收到syn包到轉發給后端web時間delay達54秒.
2) 黃色圈中的3個packet,可以看出客戶端在發了HTTP Request的0.6秒后,立即發送了一個[FIN,ACK]的包.
因此,也可以進行下一步排查了.
這是該情況下的網絡抓包截圖.
通過對游戲的網絡行為分析,總結如下3點:
1)中國移動對HTTP協議有串聯設備分析請求與響應,可能過濾了我們的請求.(后續工作:可以向中國移動某分公司投訴)
2)游戲客戶端發送的請求有需要優化的地方:User-Agent頭部可以考慮完善補充(構造),對于HTTP協議來說,User-Agent在rfc2616(HTTP標準)中用的是SHOULD(即建議),但是事實上必須的.以下是某款知名手游的HTTP頭部截圖
3)游戲客戶端發送的請求有需要優化的地方:POST請求把所有數據都放在了http header里面,導致post內容本身字段長度為0.這個使得“看起來不是那么正常”.建議嘗試優化.
1)禁用解析
2)使用絕對序列號
3)自定義HTTP端口號
有時,我們的HTTP應用(以手游為多見)并不是開放在80的知名端口,而是使用了例如10001這樣的高端口.為了使Wireshark能夠主動以HTTP協議解析這些非知名端口的通信內容,我們需要自定義HTTP解析的端口.
4)使用追蹤數據流功能
5)一招制敵:使用過濾器找出可能有問題的網絡行為
tcp.analysis.retransmission or
tcp.analysis.fast_retransmission or
tcp.flags.reset == 1 or
icmp
初次使用tcpdump時,使用tcpdump -h命令可以看到它有數十個參數.
根據我們在運維工作中的經驗,掌握tcpdump以下5個參數即可滿足大部分的工作需要了.
tcpdump提供了豐富的過濾器,以支持抓包時的精細化控制,達到減少無效信息干擾的效果.我們常用的過濾器規則有下面幾個:
以上幾種過濾器規則,可以使用and或者or進行組合,例如:
host a.b.c.d and tcp port x
則只抓取本機和某主機a.b.c.d之間基于TCP的目的端口或者源端口為x的數據通信.
tcp port x or icmp
則抓取TCP協議目的端口或者源端口為x的數據通信或者ICMP協議的數據通信.
隨著移動應用的增加,移動設備訪問系統應用的情況越來越多,我們經常會遇到有用戶抱怨說使用移動設備訪問網站等業務慢的問題.在這種情況下,如果能夠同時在移動設備和服務器上同時抓包,那么對于分析問題將會有很大的幫助.
Android版本的tcpdump下載地址是:
http://www.androidtcpdump.com/android-tcpdump/downloads
另外,在Android系統抓包時,需要使用adb這個工具,下載地址是
http://developer.android.com
我們把下載后的tcpdump和adb工具及其依賴的dll放在c:\adb目錄下
我們先回顧下一般網絡程序的調用圖.
再看一下tcpdump程序調用模型.
可見,tcpdump這一類的應用程序完全不同,它依賴的是libpcap.
libpcap使用的是一種稱為設備層的包接口(packet interface on device level)技術.
使用這種技術,應用程序可以直接讀寫內核驅動層面的數據,而不經過完整的Linux網絡協議棧.
在C語言中,調用設備層的包接口使用如下的方法:
#include <sys/socket.h> #include <netpacket/packet.h> #include <net/ethernet.h> /* the L2 protocols */ packet_socket = socket(PF_PACKET, int socket_type, int protocol);
PF_PACKET套接口:被用于接收和發送在設備驅動層(OSI Layer 2)的數據包.
在以上的函數調用中,socket_type可以是:
protocol:是指IEEE 802.3協議號.
特別的,如果是htons(ETH_P_ALL)則所有協議的數據包都被接收.
可能會有疑問,如果一種輸入的網絡通信(INPUT)被iptables給禁止了,那么tcpdump還可以抓取到嗎?
答案是肯定的.
因此:
tcpdump和iptables的關系,總結下來就是:
在遇到網絡問題時,記得使用tcpdump抓包看看,肯定有不一樣的收獲!
更多內容,請關注本人即將出版的《Linux運維最佳實踐》一書.
對網絡分析技術有興趣的同學,可以加“運維技術實踐”公眾,或我個人微信號(xufengnju)一起探討.
據說,本文作者@胥峰同學將攜新作《Linux運維最佳實踐》,親臨GOPS2016全球運維大會·上海站,并做精彩演講.
約么??
運維發展至今,早已不是刀耕火種的時代,不應該仍然是“背黑鍋俠”,“背服務器俠”.運維可以更高逼格、更高價值,運維明天可以更美好!
“重新定義運維”讓這些成為可能
匯聚整個行業的力量,集合海內外專家的智慧,我們在路上!
將于9月23日-24日舉行的GOPS2016上海大會,已開始報名,可掃描下方二維碼或點擊”閱讀原文”鏈接,以了解詳情:
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/4512.html