零 tcpdump入门
Linux作为网络服务器,特别是作为路由器和网关时,数据的采集和分析是不可少的。TcpDump是Linux中强大的网络数据采集分析工具之一。
tcpdump可以根据使用者需求对网络上传输的数据包进行捕获的抓包工具,windows平台有wireshark等工具,tcpdump可以将网络中传输的数据包的“包头”全部捕获过来进行分析,其支持网络层、特定的传输协议、数据发送和接收的主机、网卡和端口的过滤,并提供and、or、not等语句进行逻辑组合捕获数据包或去掉不用的信息。
————————————————
版权声明:本文为CSDN博主「IT.cat」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_57377057/article/details/125987315
# 理解tcpdump的输出
超详细的网络抓包神器 tcpdump 使用指南 - 知乎 (zhihu.com)
21:27:06.995846 IP (tos 0x0, ttl 64, id 45646, offset 0, flags [DF], proto TCP (6), length 64) 192.168.1.106.56166 > 124.192.132.54.80: Flags [S], cksum 0xa730 (correct), seq 992042666, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 663433143 ecr 0,sackOK,eol], length 0 21:27:07.030487 IP (tos 0x0, ttl 51, id 0, offset 0, flags [DF], proto TCP (6), length 44) 124.192.132.54.80 > 192.168.1.106.56166: Flags [S.], cksum 0xedc0 (correct), seq 2147006684, ack 992042667, win 14600, options [mss 1440], length 0 21:27:07.030527 IP (tos 0x0, ttl 64, id 59119, offset 0, flags [DF], proto TCP (6), length 40) 192.168.1.106.56166 > 124.192.132.54.80: Flags [.], cksum 0x3e72 (correct), ack 2147006685, win 65535, length 0
最基本也是最重要的信息就是数据报的源地址/端口和目的地址/端口,上面的例子第一条数据报中,源地址 ip 是 192.168.1.106
,源端口是 56166
,目的地址是 124.192.132.54
,目的端口是 80
。 >
符号代表数据的方向。
此外,上面的三条数据还是 tcp 协议的三次握手过程,第一条就是 SYN
报文,这个可以通过 Flags [S]
看出。下面是常见的 TCP 报文的 Flags:
[S]
: SYN(开始连接)[.]
: 没有 Flag[P]
: PSH(推送数据)[F]
: FIN (结束连接)[R]
: RST(重置连接)
而第二条数据的 [S.]
表示 SYN-ACK
,就是 SYN
报文的应答报文。
一 排错思路
1 curl 网址+toke (具体curl命令见附录)
教训:问题描述不要加上个人判断!
2 修改/etc/hosts curl 网址+token nslook up网址 排除 dns问题
ndots 腾讯给的是2 也就是说 只要两个点以上就不走 search 域 直接走 容器外部dns(宿主机dns)
3 去sso9200服务端抓包(见下方)
抓包 TCP Spurious Retransmission和TCP Retransmission 原理理解:
TCP Retransmission的理解_彼岸大洋的博客-CSDN博客
tcp retransmission 出现的原因_TCP重传问题排查思路与实践_weixin_39583623的博客-CSDN博客
4 排除内核参数 tcp_timestamp和tcp_tw_recycle的值
参考文章:网络优化之net.ipv4.tcp_tw_recycle参数_天府云创的博客-CSDN博客
5 排除 网络带宽压力
查看内网cvm带宽和监控带宽
6 研究uaa和sso调用关系
暂时还没具体定位问题~~ 不过预估fan这个调用他自己也迷糊着
或许跟这个问题很类似:
https://www.cnblogs.com/pyng/p/9698723.html
# 二 容器抓包实践
#!/bin/bash
dockerid=$(docker ps | grep gateway | grep prod-image | awk '{print $1}') # 获取容器id
pidname=$(docker inspect -f {{.State.Pid}} $dockerid) # 获取容器的pid
nsenter --target -n $pidname # 进入容器网络
ip a # 确认是否进入容器网络
tcpdump -i any port 9920 -lnxx -w /tmp/file1.pcap # 抓取9200进出?
# linux 使用wireshark
yum install wireshark* -y
wireshark file1.pcap
# 推荐深入实践文章:Kubernetes 问题定位技巧:容器内抓包 - 知乎
三附录
# 单个curl
curl http://sso.hi-ins.com.cn/api-user/menus/findAlls?access_token=91ad9530-d6c5-44dc-b7f3-896c7e574dbd
# curl 100次
for i in {1..100}; do curl http://sso.hi-ins.com.cn/api-user/users/current?access_token=6598fe2f-3132-41d0-ae49-49fcf4b4e015; done;
# curl 显示时间消耗
curl -o /dev/null -s -w "time_namelookup:%{time_namelookup}\ntime_connect: %{time_connect}\ntime_starttransfer: %{time_starttransfer}\ntime_total: %{time_total}\n" "http://sso.hi-ins.com.cn"
四 抓包实战 - 知乎
一文教会实战网络抓包和分析包 知乎