date: 2017-01-16 21:35
全景回顧
部分業(yè)務數(shù)據(jù)打了馬賽克-_-
- 客服反饋 20170104xxx,供應商那邊掉單了叫潦,并且供應商那邊訂單狀態(tài)是取消狀態(tài)五续,無法退款
- 數(shù)據(jù)庫查詢發(fā)現(xiàn) 訂單
fund_status
為request_success
弟断,訂單已請款成功
- 繼續(xù)查詢異步通知結果(見下圖):其中
recevie_time
為空、sent_count
為 6 次趴生,表示異步通知多次但沒有成功
- 繼續(xù)查詢交易信息和商戶信息:獲取到到商戶號阀趴、異步回調(diào)地址
- 繼續(xù)查詢這家商戶是否有正常交易:表明 12 點左右的訂單異步通知成功,但是 17點的這一單失敗
- 查詢線上日志(使用
grep
):可以查詢到發(fā)送到的內(nèi)容
- 對接群中尋找對方技術一起聯(lián)查:6 點提出問題苍匆,8點才有回復刘急;對方日志顯示并沒有收到請求
- 嘗試使用 curl 直接請求(詳細見下面):成功
// 根據(jù)日志,用 php 處理出 query string
$url ='http://xxx'; // 上面步驟中查詢到的異步通知地址
$data = '{"version":"2.0","charset":"UTF-8","merchant_code":xxxx,"timestamp":1483527837,"biz_content":"OtdYKBKmHg3Fz23DTVQbWQg1ZZ%2BanZf3fA3o02KpyFS5tevLHyu8E6uMQNyeRtpUBucmhbAwqfQZYTLrm5msyiBF0UcvP1hmlxv5RIEHzFSWG4s33c%2Bbq53jyuRylDKLVtn3f6xxxF2aYCiJNkWEW%2B","method":"trade.create","sign":"a96598b014xxx22801c"}';
$arr = json_decode($data, true);
$str = http_build_query($arr);
curl -d $str $url # bash 中使用 curl浸踩,用上面 php 變量替換
- 使用 tcpdump 抓包來定位問題:
nohup tcpdump -iany -Xn -s0 host 218.xx.xx.44 -w xx.pcap &
叔汁,由于量比較小,使用 nohup 放入后臺,計劃抓取一天的數(shù)據(jù)先看看 - 第二天使用 wireshark(win平臺)查看文件据块,提示文件不完整(nohup 意外終止了)码邻,根據(jù)片段可以大致判斷出 我們發(fā)送的 http post 請求沒有正常獲得應答
- 修改異步通知重發(fā)請求進行抓包,這次請求成功另假,但是對方返回
fail
(對方設置了去重或者超時邏輯)
- 由于還是無法確定問題究竟是我們沒有成功發(fā)送異步回調(diào)還是對方無法成功接收(鍋到底在誰那邊-_-)像屋,繼續(xù)執(zhí)行
nohup tcpdump -iany -Xn -s0 host 218.xx.xx.44 -w xx.pcap &
基礎 TCP/IP 知識
基礎 TCP/IP 知識請大家多閱讀文檔,形成知識體系边篮,以下只選取部分內(nèi)容
OSI 七層:應用層 表示層 會話層 | 傳輸層 | 網(wǎng)絡層 | 鏈路層 物理層
tcp/ip 4層:應用層 | 傳輸層 | 網(wǎng)絡層 | 鏈路層
- 應用層:用戶進程(nginx己莺、php-fpm等)
- 傳輸層:tcp / udp
- 網(wǎng)絡層:ip / icmp(ping) / igmp
- 鏈路層:arp / rarp / 硬件接口
tcp 連接 3 次握手,4 次揮手
ip地址: 網(wǎng)絡號(A-C)+ 主機號 + 子網(wǎng)號
域名 MAC地址 端口號
MTU: netstat -in
路由表:route -n
arp 緩存表:arp -a
ICMP 協(xié)議:ping / traceroute
tcpdump -vvv -X udp port 7777 # udp
tcpdump -vvv -X -i lo tcp prot 7777 # tcp
抓包神器 tcpdump 簡明教程
《Linux 高性能服務器》- 第17章 - 系統(tǒng)檢測工具 - tcpdump
tcpdump 被稱作抓包神器不是浪得虛名戈轿,各種數(shù)據(jù)報類型都可以:鏈路層(arp)凌受、網(wǎng)絡層(icmp)、傳輸層(tcp思杯、udp)胜蛉、應用層(http 等)
常用參數(shù)
man tcpdump # 查看 tcpdump 的幫助文檔
# 監(jiān)視指定網(wǎng)絡接口
tcpdump -i eth1 # 默認 eth0,可以使用 ifconfig 命令查看網(wǎng)絡接口
# 監(jiān)視指定主機的數(shù)據(jù)包
tcpdump host baidu.com # 也可以使用 ip智蝠,還可以限定通信雙方的 ip 地址
# 監(jiān)視指定主機和端口的數(shù)據(jù)包
tcpdump tcp port 23 and 127.0.0.1
# 監(jiān)視指定協(xié)議
tcpdump tcp # 這里還限定了 tcp 數(shù)據(jù)包腾么,arp、icmp杈湾、tcp解虱、udp 都可以
實用場景
# 抓取指定 ip 數(shù)據(jù)包并保存到文件
nohup tcpdump -iany -Xn -s0 host xxx -w ceair.pcap &
保存的 pcap 文件使用 wireshark(win平臺)查看,可以通過 菜單 - view - time display fromat
修改時間格式漆撞,可以精確到微秒級殴泰。上面的截圖中已經(jīng)展示過 wireshark 的抓包結果,這里不再演示
推薦抓取自建服務器的方式(比如 nginx)浮驳,測試一下 tcpdump 抓包 + wirshark 查看
寫在最后
本文使用的截圖工具:snipaste
馬賽克使用的工具:2345看圖王
通過全景回顧可以發(fā)現(xiàn)悍汛,在解決 ‘http 異步通知失敗’ 時,配合業(yè)務與技術做了全方位的探索至会,查數(shù)據(jù)庫离咐、查日志直到最后使用 tcpdump 抓包。希望整個全景回顧過程奉件,能對大家以后處理線上問題有幫助宵蛀。
補充幾點常見的線上問題排查思路:
- 查詢相關的數(shù)據(jù)庫記錄
- 查詢相關的日志記錄:業(yè)務相關的各種 log、nginx access log / error log 等(其他服務器類似)
- 服務器程序的問題县貌,最終都可以通過 tcpdump 完整抓取整個鏈路的數(shù)據(jù)包定位問題
最后再補充幾點學習建議:
- 基礎的網(wǎng)絡知識還是要有的术陶,tcp/ip 只是其中一部分,有空當然是看看《計算機網(wǎng)絡》 這樣的教材煤痕,形成完整的知識體系梧宫,沒空可以看看視頻教程接谨,一般都是提煉過的
- tcpdump 命令參數(shù)特別多,不用完整的了解塘匣,只需要積累幾個 ‘實用場景’ 即可