tcpdump 基础
https://ipcmen.com/tcpdump

-a 尝试将网络和广播地址转换成名称。
-c<数据包数目> 收到指定的数据包数目后,就停止进行倾倒操作。
-d 把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出。
-dd 把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出。
-ddd 把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出。
-e 在每列倾倒资料上显示连接层级的文件头。
-f 用数字显示网际网络地址。
-F<表达文件> 指定内含表达方式的文件。
-i<网络界面> 使用指定的网络截面送出数据包。
-l 使用标准输出列的缓冲区。
-n 不把主机的网络地址转换成名字。
-N 不列出域名。
-O 不将数据包编码最佳化。
-p 不让网络界面进入混杂模式。
-q 快速输出,仅列出少数的传输协议信息。
-r<数据包文件> 从指定的文件读取数据包数据。
-s<数据包大小> 设置每个数据包的大小。
-S 用绝对而非相对数值列出TCP关联数。
-t 在每列倾倒资料上不显示时间戳记。
-tt 在每列倾倒资料上显示未经格式化的时间戳记。
-T<数据包类型> 强制将表达方式所指定的数据包转译成设置的数据包类型。
-v 详细显示指令执行过程。
-vv 更详细显示指令执行过程。
-x 用十六进制字码列出数据包资料。
-w<数据包文件> 把数据包数据写入指定的文件。
1002 ifconfig --查看网卡
1003 tcpdump -w b.cap ---抓包写到 b.cap 文件
1004 tcpdump -r a.cap --读
1008 tcpdump -A -r a.cap --读 以 ASCII 码显示
1009 tcpdump -X -r a.cap --读 以 16 进制显示
1111 tcpdump -D --显示当前主机所有网卡
1111 tcpdump -i eth0 --读 eth0 网卡上面的数据
1010 tcpdump -i eth0 port 20 -- 抓包 eth0 网卡 port 20 上面的数据
1011 tcpdump -i eth0 tcp port 20 -- 抓包 eth0 网卡 tcp port 20 上面的数据
1018 tcpdump -i eth0 -w b.cap -- 抓包 eth0 网卡数据写入 b.cap
1019 tcpdump -r b.cap -- 读b.cap 包数据(默认68的字节)
1019 tcpdump -r -s 0 b.cap -- 读b.cap 包所有数据
1019 tcpdump -n -r b.cap -- 读b.cap 包数据 主机名用ip替换
1020 tcpdump -n -r b.cap | awk '{print $3}' -- ** | 打印第三列数据
1021 tcpdump -n -r b.cap | awk '{print $3}' | sort -u -- * |* | 去重
1024 tcpdump -n src host 203.107.6.88 -r b.cap -- 读取源地址203开头的数据
1025 tcpdump -n dst host 172.31.119.200 -r b.cap -- 读取目的地址172开头的数据
1026 tcpdump -n port 47105 -r b.cap -- 读取端口号 47105的数据
1027 tcpdump -n tcp port 47105 -r b.cap -- 读取tcp端口号47105的数据
1028 tcpdump -n udp port 47105 -r b.cap -- 读取udp端口号47105的数据
1029 tcpdump -n -X udp port 47105 -r b.cap -- 以16进制读取udp端口号47105的数据
1029 tcpdump -n -A udp port 47105 -r b.cap -- 以ASCII读取udp端口号47105的数据
1030 tcpdump -A -n 'tcp[13]=24' -r b.cap --高级筛选
11 TCPDUMP-抓包、筛选、高级筛选
https://www.bilibili.com/video/BV17J411t7BW?from=search&seid=12306874621624259258



CWR
ECE
URG
ACK
PSH----P
RST
SYN
FIN
Flags [P.] 是tcp包header部分的第14个字节的P位。这个字节所包含的几个flag很重要。这里P位表示接受方需要马上将包push到应用层。

三次握手四次挥手

09:34:42.303336 IP 218.3.247.226.35331 > 10.90.1.127.commplex-main: Flags [S], seq 2763421765, win 64240, options [mss 1200,nop,wscale 8,nop,nop,sackOK], length 0
E..4}6@.r.......
Z........xE........................
09:34:42.303526 IP 10.90.1.127.commplex-main > 218.3.247.226.35331: Flags [S.], seq 2873373130, ack 2763421766, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
E..4..@.?.^.
Z...........D1...xF..r.................
09:34:42.304098 IP 218.3.247.226.dnc-port > 10.90.1.127.commplex-main: Flags [S], seq 1207803319, win 64240, options [mss 1200,nop,wscale 8,nop,nop,sackOK], length 0
E..4}7@.r.......
Z...x..G...........................
09:34:42.304206 IP 10.90.1.127.commplex-main > 218.3.247.226.dnc-port: Flags [S.], seq 3623389605, ack 1207803320, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
E..4..@.?.^.
Z.........x....G.....r.................
09:34:42.316515 IP 218.3.247.226.50829 > 10.90.1.127.commplex-main: Flags [S], seq 446887968, win 64240, options [mss 1200,nop,wscale 8,nop,nop,sackOK], length 0
E..4}8@.r.......
Z......... ........................
09:34:42.316683 IP 10.90.1.127.commplex-main > 218.3.247.226.50829: Flags [S.], seq 1396788719, ack 446887969, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
E..4..@.?.^.
Z..........SAM....!..r.................

简书 tcpdump 使用
https://www.jianshu.com/p/df62ac76ec5b

图中红色方框内的部分是一个ip包的详细记录,类似的纪录还有好几条。这里我们着重分析第一条的各部分字段含义。
14:37:41.615018 很简单,是该包接收到的时间。
17.143.164.37.5223 是发送方的ip地址及端口号(5223是端口号)。
10.29.44.140.58036 是我iphone的ip地址及端口号。
Flags [P.] 是tcp包header部分的第14个字节的P位。这个字节所包含的几个flag很重要,后面我会单独详细讲解。这里P位表示接受方需要马上将包push到应用层。
seq 1:54 tcp包的seq号,1是起始值,54结束值。tcp之所以被认为是流,是因为tcp包所携带的每一个字节都有标号(seq号)。1:54表明总共有54个字节被接受,其中一个字节是三次握手阶段所使用,所以一共发送的长度是53字节。
ack 101 tcp包的ack号,ack 101表明seq号为100的字节已被确认收到,下一个期望接收的seq号从101开始。
win 255 win表示的是tcp包发送方,作为接受方还可以接受的字节数。这里win 255表明ip为17.143.164.37的主机还可以接受255个字节。
options [nop,nop,…] options[…]表示的是该tcp包的options区域,nop是no opertion的缩写,没什么实际用途,主要是用做padding,因为options区域按协议规定必须是4字节的倍数。
options[… TS val 2381386761] ts val这个值是tcp包的时间戳,不过这个时间戳和设备的系统时间没啥关系,刚开始是随机值,后面随着系统时钟自增长。这个时间戳主要用处是seq序列号越界从0重新开始后,可以确认包的顺序。
options[… ecr 427050796] ts ecr这个值主要用来计算RTT。比如A发送一个tcp包给B,A会在包里带上TS val,B收到之后在ack包里再把这个值原样返回,A收到B的ack包之后再根据本地时钟就可以计算出RTT了。这个值只在ack包里有效,非ack包ecr的值就为0.
length 53 这个length是应用层传过来的数据大小,不包括tcp的header。这个值和我们上面分析的seq 1:54是一致的。
以上就是一个基本的tcp包结构,大家可以按照上面的分析再把其他几个包理解下。我们在做应用的时候面对的更多是http协议,但对一个http请求是怎么通过tcp/ip分解成一个个的packet,然后怎么在网络上稳定可靠的传输,要有个基本的印象。下面我们再看下tcpdump更多的功能,这些功能都是基于对tcp/ip协议的理解,遇到不理解的建议多google下相关的技术概念。
tcpdump知识拓展
再继续深入tcpdump之前,先贴上一张tcp header格式图,常看常新。

3.1 TCP Flags(tcp header第十四个字节)
我们再仔细看下上面提到的flags概念,flags位于tcp header的第十四个字节,包含8个比特位,也就是上图的CWR到FIN。这8个比特位都有特定的功能用途,分别是:CWR,ECE,URG,ACK,PSH,RST,SYN,FIN。
CWR ,ECE 两个flag是用来配合做congestion control的,一般情况下和应用层关系不大。发送方的包ECE(ECN-Echo)为0的时候表示出现了congestion,接收方回的包里CWR(Congestion Window Reduced)为1表明收到congestion信息并做了处理。我们重点看其他六个flag。
URG URG代表Urgent,表明包的优先级高,需要优先传送对方并处理。像我们平时使用terminal的时候经常ctrl+c来结束某个任务,这种命令产生的网络数据包就需要urgent。
ACK 也就是我们所熟悉的ack包,用来告诉对方上一个数据包已经成功收到。不过一般不会为了ack单独发送一个包,都是在下一个要发送的packet里设置ack位,这属于tcp的优化机制,参见delayed ack。
PSH Push我们上面解释过,接收方接收到P位的flag包需要马上将包交给应用层处理,一般我们在http request的最后一个包里都能看到P位被设置。
RST Reset位,表明packet的发送方马上就要断开当前连接了。在http请求结束的时候一般可以看到一个数据包设置了RST位。
SYN SYN位在发送建立连接请求的时候会设置,我们所熟悉的tcp三次握手就是syn和ack位的配合:syn->syn+ack->ack。
FIN Finish位设置了就表示发送方没有更多的数据要发送了,之后就要单向关闭连接了,接收方一般会回一个ack包。接收方再同理发送一个FIN就可以双向关闭连接了。
这8个flag首字母分别是:C E U A P R S F。初看难以记忆,我脑洞了下,把它们组合成 supr cafe,当然少了super少了个e,我可以将就下。我们在使用tcpdump的时候会经常看到这几个flag,[S],[P],[R],[F],[.]。其他几个都好理解,[.]特殊点,是个占位符,没有其他flag被设置的时候就显示这个占位符,一般表示ack。
tcpdump 更多使用参数
这部分我们来看下tcpdump常用的一些命令参数。文章最开始部分的tcpdump命令是这样的:sudo tcpdump -i rvi0 -AAl。 -i rvi0 -AAl都是属于参数部分。常见的有这些:
-i, 要监听的网卡名称,-i rvi0监听虚拟网卡。不设置的时候默认监听所有网卡流量。
-A, 用ASCII码展示所截取的流量,一般用于网页或者app里http请求。-AA可以获取更多的信息。
-X,用ASCII码和hex来展示包的内容,和上面的-A比较像。-XX可以展示更多的信息(比如link layer的header)。
-n,不解析hostname,tcpdump会优先暂时主机的名字。-nn则不展示主机名和端口名(比如443端口会被展示成https)。
-s,截取的包字节长度,默认情况下tcpdump会展示96字节的长度,要获取完整的长度可以用-s0或者-s1600。
-c,只截取指定数目的包,然后退出。
-v,展示更多的有用信息,还可以用-vv -vvv增加信息的展示量。
src,指明ip包的发送方地址。
dst,指明ip包的接收方地址。
port,指明tcp包发送方或者接收方的端口号。
and,or,not,操作法,字面意思。
上面几个是我个人比较常用的,更多的参数可以参考这个详细文档。有兴趣的可以分析下面几个例子练习下:
tcpdump ‘tcp[13] & 16!=0’
tcpdump src port 80 and tcp
tcpdump -vv src baidu and not dst port 23
tcpdump -nnvvS src 192.0.1.100 and dst port 443
用tcpdump分析http完整请求
说了这么多,我们再来实战下,看一个完整的http请求流程。 下面截图里的流量是我监听的 知乎App点赞之后发送的一个https请求。我之前先分析过server的ip地址了,tcpdump命令是:
sudo tcpdump -i rvi0 -AAl src 60.28.215.123 or dst 60.28.215.123

图中列出了6个前面的packet,10.29.44.240是我iphone的ip地址,60.28.215.123是知乎server的ip地址,红色方框内是iphone发出的packet,白色方框内是server发出的packet。packet1是iphone三次握手的第一个syn包,packet2是server ack+syn的包,packet3是iphone ack的包。这3个packet之后tcp的三次握手就完成了。
packet4是iphone发出的http request。长度只有240个字节,所以一个packet就发过去了,当然还设置了flags的P位,request需要马上被应用层处理。包里面出现了spdy,点赞。
packet5是server ack刚收到的包,长度位0,所以这仅仅是一个ack包。
packet6是server返回http的response了,1388个字节。packet5和packet6都ack了seq为241的包,当然是为了增加ack的成功率。
中间还有好几个packet就不仔细分析了,最后再看下请求完成的最后几个包

最后两个packet比较简单,iphone发送个FIN+ACK的包就断开连接了,server直接发送了一个RST包后也断开连接了。
这篇教程到这里就结束了,建议大家自己多练习下,遇到不懂的参数或关键字多google。最好能系统的学习下tcp/ip协议
作者:布衣Alpha
链接:https://www.jianshu.com/p/df62ac76ec5b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
实际代码解读
----------10.90.1.127--------服务端
------218.3.247.226--------客户端(本机浏览器)
服务器响应客户端请求
Flags [.], ----------------------- ack
seq 24993:27393, ----------tcp包的seq号,24993是起始值,27393结束值 ,其中一个字节是三次握手阶段所使用,所以后面的length 2400 .
ack 4011, --------------------tcp包的ack号,ack 4011表明seq号为4010的字节已被确认收到,下一个期望接收的seq号从4011开始
win 319, ---------------------表示的是tcp包发送方(10.90.1.127),作为接受方还可以接受的字节数,表示10.90.1.127的主机还可以接受319个字节。
length 2400 ----------------应用层传过来的数据大小,不包括tcp的header
09:34:42.295639 IP 10.90.1.127.commplex-main > 218.3.247.226.58896: Flags [.], seq 24993:27393, ack 4011, win 319, length 2400
<script type="text/javascript" src="/js/select2-4.0.3/i18n/zh-CN.js"></script>
<script type="text/javascript">
var errTipsMap = {};
$.validator.defaults.showErrors = function (errorMap, errorList) {
//clear tooltip
$.each(this.validElements(), function (index, element) {
var $element = $(element);
$element.removeClass('error')
09:34:42.295668 IP 10.90.1.127.commplex-main > 218.3.247.226.58896: Flags [.], seq 27393:29793, ack 4011, win 319, length 2400
}
else if(zoom >= cityZoom && zoom < districtZoom){
return 4;//......
}
后面会有 ack 29793
09:34:42.325083 IP 218.3.247.226.58896 > 10.90.1.127.commplex-main: Flags [.], ack 29793, win 1026, length 0
E..(}=@.r.......
Z........K.....P.......
09:34:42.321005 IP 10.90.1.127.commplex-main > 218.3.247.226.58896: Flags [.], seq 29793:32193, ack 4011, win 319, length 2400
else if (8 <= map.getZoom() && map.getZoom() < 11) {//..........................................
map.setCenter(marker.getPosition());
map.setZoom(12);
09:34:42.347814 IP 218.3.247.226.58896 > 10.90.1.127.commplex-main: Flags [.], ack 32193, win 1026, length 0
E..(}B@.r.......
Z........K....'P.......
1 seq 2763421765,
2 ack 2763421766,
3 seq 1207803319,
4 ack 1207803320,
5 seq 446887968,
6 ack 446887969,
09:34:42.303336 IP 218.3.247.226.35331 > 10.90.1.127.commplex-main: Flags [S], seq 2763421765, win 64240, options [mss 1200,nop,wscale 8,nop,nop,sackOK], length 0
E..4}6@.r.......
Z........xE........................
09:34:42.303526 IP 10.90.1.127.commplex-main > 218.3.247.226.35331: Flags [S.], seq 2873373130, ack 2763421766, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
E..4..@.?.^.
Z...........D1...xF..r.................
09:34:42.304098 IP 218.3.247.226.dnc-port > 10.90.1.127.commplex-main: Flags [S], seq 1207803319, win 64240, options [mss 1200,nop,wscale 8,nop,nop,sackOK], length 0
E..4}7@.r.......
Z...x..G...........................
09:34:42.304206 IP 10.90.1.127.commplex-main > 218.3.247.226.dnc-port: Flags [S.], seq 3623389605, ack 1207803320, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
E..4..@.?.^.
Z.........x....G.....r.................
09:34:42.316515 IP 218.3.247.226.50829 > 10.90.1.127.commplex-main: Flags [S], seq 446887968, win 64240, options [mss 1200,nop,wscale 8,nop,nop,sackOK], length 0
E..4}8@.r.......
Z......... ........................
09:34:42.316683 IP 10.90.1.127.commplex-main > 218.3.247.226.50829: Flags [S.], seq 1396788719, ack 446887969, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
E..4..@.?.^.
[P.] ------- PSH Push我们上面解释过,接收方接收到P位的flag包需要马上将包交给应用层处理,一般我们在http request的最后一个包里都能看到P位被设置。
09:34:42.347922 IP 10.90.1.127.commplex-main > 218.3.247.226.58896: Flags [P.], seq 39393:41663, ack 4011, win 319, length 2270
$("#map_right_close").on("click", function (e) {
$("#map_right_close").hide();
$("div.maprightbot").show();
$("#map_right_show").show();
})
});
</script>
</body>
</html>
0
09:34:42.348241 IP 218.3.247.226.58896 > 10.90.1.127.commplex-main: Flags [.], ack 36993, win 1026, length 0
E..(}C@.r.......
Z........K.....P.......
[.] -----ack
表示客户端接收到服务器(10.90.1.127)发来的seq 41663 的包,向服务器表示接收成功。
09:34:42.372487 IP 218.3.247.226.58896 > 10.90.1.127.commplex-main: Flags [.], ack 41663, win 1026, length 0
E..(}E@.r.......
Z........K....%P...{...
09:34:42.729443 IP 218.3.247.226.48621 > 10.90.1.127.commplex-main: Flags [.], seq 1:1201, ack 1, win 1026, length 1200
- 客户端向服务端请求
09:34:42.729678 IP 218.3.247.226.48621 > 10.90.1.127.commplex-main: Flags [P.], seq 1201:1475, ack 1, win 1026, length 274
2. 客户端向服务端请求并要求服务端立即执行 (seq 1475)
09:34:42.729731 IP 10.90.1.127.commplex-main > 218.3.247.226.48621: Flags [.], ack 1475, win 266, length 0
3. 服务端收到客户请求,并作出相应 (ack 1475)
09:34:42.729443 IP 218.3.247.226.48621 > 10.90.1.127.commplex-main: Flags [.], seq 1:1201, ack 1, win 1026, length 1200
E...}F@.r.......
Z.......,.....YP.......GET /Vehicle/GetVehiclesCountByStatus HTTP/1.1
Host: 120.195.166.245:5000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
Connection: keep-alive
Referer: http://120.195.166.245:5000/Vehicle/MapDistribution
Cookie: ASP.NET_SessionId=paoe0uhndvvtzgassuyz4gwh; .AspNetCore.Antiforgery.EfALfYy1toA=CfDJ8KaQo3HvI95BkHOnzyEfJ0g-_M0xdh-bBZyfw4BGmOYnObGa1J7xgaWRCmgQMS2JaaedkSfVbYKseAgLhliRntBOdARLT6i-xywqKYGnuQgpOyQLpU7v_IRGQUCIg6aYNeo-si6vmt6ZinboC_M2vvY; .AspNetCore.Cookie=CfDJ8KaQo3HvI95BkHOnzyEfJ0gJX_mGrEeUCsA7buWyi4B-MHcjH5BDwZSQBY2Tt322c0tcuPu1NEhSHFbhTKL5ZmdcAw68lVcuTQuOreiQ6N-7-_Y1WV4wsqovIwsHaeAmyBmtnfr3106Ss-8utQl5xMvbMKWKwgoxiNhNdQoSZkawEohVNueGBY0AUDsqYt7N-O0gt5ExAuiqwlYO7cKmkBuokAXCVkPKUiTZ0DiFptaQMeqfCRsxpIXhKfghlIFIetuqq4Hb9k237PoLGb7QUsIMmUH9AGjmNDqsMn2n1roSP7GRH7esJVf4fqOSbXdAouV5xjF6I_YBhoDxjG3YT89P71SyKcZCYgyxPMf2XTq6jvOynOrke6OBE9c7MpbbA4C-eqzrrua2TtZqSAal81h0PINBTDr9LAhM8pbLJeRtiDvpco790bDIf3F6hu3AHbvMP_3z6BEc69fmBNh9j6lNcrtitzz5tIdOGs_tEa5oTgW7ydqxSUOonvt3fQoiT77qOSO_C
09:34:42.729490 IP 10.90.1.127.commplex-main > 218.3.247.226.48621: Flags [.], ack 1201, win 247, length 0
E..(T.@.?. Z
Z.............Y.,.8P.......
09:34:42.729678 IP 218.3.247.226.48621 > 10.90.1.127.commplex-main: Flags [P.], seq 1201:1475, ack 1, win 1026, length 274
E..:}G@.r.......
Z.......,.8...YP.......8MwJ92fXYmC3Xm6Cu8AR7nbsf2ywVzcfr5AhUizP9Ta1MRnqixUF7TzNJCh28IVWgA_86hhaht-T5CGFYUgPt1MHMxSvDg-1PLYQtVSAgbVfK_jl6OLmxhry24Wr73gJ4Q2WPK_JF_gCufrFe831iH4DG9VhcQt9BXLF54WtjeQPbkgqBoxstk6Zq6bZPXuyQ2vkTNP7jQuxc_j7PIDgvJ6oHBn-o5mO7R5GlGjrjB-kOMzpa7Y9QWxP2jCQxhxG4f7zfsrKDOmcVY
09:34:42.729731 IP 10.90.1.127.commplex-main > 218.3.247.226.48621: Flags [.], ack 1475, win 266, length 0
E..(T.@.?. Y
Z.............Y.,.JP..
....
本文详细介绍了TCPDump的基础知识,包括TCP包头的各个字段,如Flags中的P位,以及三次握手四次挥手过程。通过实例分析了TCP包的结构,如seq、ack、win等字段的含义。此外,还提供了TCPDump的常用参数和实际代码解读,帮助读者更好地理解和使用TCPDump进行网络抓包和分析。

1万+

被折叠的 条评论
为什么被折叠?



