简要记录下tcpdump用法
监控某个ip上的某个端口的流量
tcpdump -i enp0s25 tcp port 5432 -nn -S
各个参数作用
-i enp0s25 指定抓包的网卡是enp0s25
-nn 显示ip地址和数字端口 ,如果只 -n 则显示ip,但是端口为services文件中的服务名
如果一个n也不指定,则显示域名以及服务名
port 抓取该端口中的信息
-S TCP的seq以及ack显示绝对值
更详细的参数信息可以参考
https://www.cnblogs.com/wongbingming/p/13212306.html
客户端telnet 192.186.100.138 命令下,服务器端显示如下
- tcp三步握手
-
- SYN=1 seq=3967800135
- 客户端处于SYN_SEND状态
- 16:38:20.116860 IP 192.168.100.182.7109 > 192.168.100.51.5432: Flags [S], seq 3967800135, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
-
- SYN=1 ACK=1 seq=504220911(随机值) ack=3967800136(上一步seq+1), 服务器端处于SYN_RCVD,这步完成后客户端的状态为ESTABLISHED
- 16:38:20.116915 IP 192.168.100.51.5432 > 192.168.100.182.7109: Flags [S.], seq 504220911, ack 3967800136, win 65535, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
-
-
- ACK=1 ack=504220912(上一步的seq+1),完成这步后服务器端状态也变成了ESTABLISHED
-
- 16:38:20.117243 IP 192.168.100.182.7109 > 192.168.100.51.5432: Flags [.], ack 504220912, win 8212, length 0
-
-
- tcp结束链接,由于tcp属于全双工通讯,所以关闭实际上分为4步骤,此例子由于使用telnet链接的5432端口的pg服务,因此服务器端超时后,服务器端主动关闭链接,因此前两步为关闭服务器
- 服务器发起断开链接FIN=1 ACK=1 seq=504220912 完成后服务器状态为FIN_WAIT_1,客户端状态为CLOSE_WAIT
- 16:39:20.118195 IP 192.168.100.51.5432 > 192.168.100.182.7109: Flags [F.], seq 504220912, ack 3967800136, win 1024, length 0
-
- 客户端回复ACK=1 ack=504220913(上一步seq+1),完成后服务器的状态为FIN_WAIT_2, 客户端状态为LAST_ACK
- 16:39:20.118419 IP 192.168.100.182.7109 > 192.168.100.51.5432: Flags [.], ack 504220913, win 8212, length 0
- 此时服务器端已经不能再发送应用数据给客户端了,但是客户端是可以发送数据给服务器端的,因此现在的状态处于半双工状态
-
- 后两步是关闭客户端
-
- 客户端发送断开链接请求FIN=1 ACK=1 ack=504220913(上一步的ack) seq=3967800136(随机),此时服务器端状态为TIME_WAIT
- 16:39:20.118551 IP 192.168.100.182.7109 > 192.168.100.51.5432: Flags [F.], seq 3967800136, ack 504220913, win 8212, length 0
-
- 服务器端回复请求ACK=1 ack=3967800137 (上一步seq+1), 此时客户端的状态为CLOSED,服务器的状态TIME_WAIT等待2MSL时间后变成CLOSED
- 16:39:20.118575 IP 192.168.100.51.5432 > 192.168.100.182.7109: Flags [.], ack 3967800137, win 1024, length 0
借用网络上的两个图

图1 ,三次握手连接图

图2 四次挥手关闭连接图
当然这个图是客户端先发起关闭链接请求,跟实际测试例子不同,因此仅仅为了参考使用。
当然上述过程也可以使用cisco packet tracer等网络模拟工具查看,具体如何在cisco packet tracer上模拟http协议,进行抓包,可以查看网络,本文中不在介绍,抓取完成内容如下:
1. 完成界面

2-4步为三次握手链接,对应图一的三个步骤
2. 客户端发起链接,发送SYN,SYN置位以及syn和ack给服务器

3. 服务器接收到SYN后的回复信息
ACK=上一步seq+1, 同时随机生成seq, SYN+ACK置位

4. 服务器回复客户端
ack=seq(上一步)+1
同时只有ACK置位

后续5-7步骤为四次挥手断开链接
5.
对应图2 中的第一步

6. 对应上面图2的第2,3步
服务器把ACK和FIN合并一步发送了,所以ACK和FIN都置位了

7. 对应上图2中的第四步

RST位
关于tcp标志位可以参考
telnet服务器上一个没有监听进程的端口(服务器正常状态)
服务器上抓取置位RST的包
tcpdump -i enp0s25 "tcp[tcpflags] & tcp-rst != 0" -nn
- telnet 192.168.100.138 5433
-
- 服务器回复给客户端的都是RST标志
- 13:38:39.291773 IP 192.168.100.138.5433 > 192.168.100.182.13288: Flags [R.], seq 0, ack 739931968, win 0, length 0
- 13:38:39.799136 IP 192.168.100.138.5433 > 192.168.100.182.13288: Flags [R.], seq 0, ack 739931968, win 0, length 0
- 13:38:40.307957 IP 192.168.100.138.5433 > 192.168.100.182.13288: Flags [R.], seq 0, ack 739931968, win 0, length 0
- 13:38:40.817424 IP 192.168.100.138.5433 > 192.168.100.182.13288: Flags [R.], seq 0, ack 739931968, win 0, length 0
- 13:38:41.326290 IP 192.168.100.138.5433 > 192.168.100.182.13288: Flags [R.], seq 0, ack 739931968, win 0, length