tcpdump工具
tcpdump命令:
选项字段:
过滤表达式:
实用命令:
TCP三次握手抓包命令:
#客户端执行tcpdump 抓取数据包
tcpdump -i etho tcp and host 192.168.12.36 and port 80 -W timeout.pcap
netstat命令
netstat -a 命令可以显⽰所有⽹络连接
-t:TCP -u:UDP
-l :哪些端口正在监听连接
-p :显⽰与每个⽹络连接关联的进程ID和进程名
netstat -anp | grep
端口号 ⽤于查看指定端口的占⽤情况
-a:所有socket
-n:直接显⽰数字类型的IP和端口
-p:显⽰正在使⽤连接的进程ID和进程名称
查看TCP连接状态
netstat -napt | grep 192.168.12.37
查看TCP半连接队列的大小
netstat -napt | grep SYN_RECV | wc -l
netstat -s
观察半连接队列溢出的情况:
netstat -s | grep "SYNS to LISTEN"
隔几秒执行几次,如果有上升的趋势,说明当前存在半连接队列溢出的现象。
查看TCP全连接队列溢出情况
netstat -s | grep overflowed
ss命令:主要⽤于获取socket统计信息,它可以显⽰和 netstat 命令类似的输出内容。但ss命令的优势在于它能够显⽰更多更详细的有关TCP和UDP连接状态的信息,而且⽐netstat更快速更高效
查看服务端进程accept队列的长度
ss -ltn
Wireshark 工具
命令: 把抓取的数据包保存到 ping.pcap 文件
tcpdump -i eth1 icmp and host 183.232.231.174 -W ping. pcap
将跑ping.pcap文件用wireshark打开
iptable防火墙配置规则
#客户端配置的防火墙规则
iptables -I INPUT -S 192.168.12.36 -j DROP
在服务端配置防火墙,屏蔽客户端 TCP 报文中标志位是 ACK 的包,也就是当服务端收到客户端的 TCP ACK 的报文时就会丢弃。
iptables -I INPUT -s 192.168.12.37 -p tcp --tcp-flag ACK ACK -j DROP
客户端设置了防火墙,屏蔽了服务端的网络包,为什么 tcpdump 还能抓到服务端的网络包?
添加 iptables 限制后, tcpdump 是否能抓到包 ,这要看添加的 iptables 限制条件:
- 如果添加的是
INPUT
规则,则可以抓得到包 - 如果添加的是
OUTPUT
规则,则抓不到包
网络包进入主机后的顺序如下:
- 进来的顺序 Wire -> NIC -> tcpdump -> netfilter/iptables
- 出去的顺序 iptables -> tcpdump -> NIC -> Wire
TCP内核参数以及优化策略
优化三次握手的参数
策略 | TCP内核参数 |
---|---|
调整SYN报文重传次数 | tcp_syn_retries |
调整SYN半连接队列的长度 | tcp_max_syn_backlog somaxconn backlog (非内核参数,NGINX配置参数) |
调整SYN+ACK报文的重传次数 | tcp_synack_retries |
调整accept队列的长度 | m i n ( b a c k l o g , s o m a x c o n n ) min(backlog, somaxconn) min(backlog,somaxconn) |
绕过三次握手(类似于长连接) | tcp_fastopen |
backlog
参数:也就是listen(int sockfd, int backlog)
的参数,也就是NGINX/Tomcat的参数
优化四次挥手的参数
策略 | TCP内核参数 |
---|---|
调整FIN报文重传次数 | tcp_orphan_retries |
调整FIN_WAIT2状态的时间 (只适用 close 函数关闭的连接) | tcp_fin_timeout |
调整孤儿连接的上限个数 (只适用 close 函数关闭的连接) | tcp_max_orphans |
调整TIME_WAIT状态的上限个数 | tcp_max_tw_buckets |
复用TIME_WAIT状态的连接 | tcp_tw_reuse (只适用客户端)tcp_timestamps |
数据传输的优化
策略 | TCP内核参数 |
---|---|
扩大窗口大小 | tcp_window_scaling |
调整发送缓冲区范围 | tcp_wmem |
调整接收缓冲区的范围 | tcp_rmem |
打开接收缓冲区动态调节 | tcp_moderate_rcvbuf |
调整内存范围 | tcp_mem |
TCP接收和发送缓冲区和Ring Buffer是一个东西吗?
数据流从网卡到用户空间的过程
一次数据流从网卡到用户空间的过程:
- 数据到达网卡:数据包通过网络到达网卡,网卡硬件将数据包放入环形缓冲区中。
- 硬件中断:网卡生成一个硬件中断通知CPU有新数据包到达。
- 中断处理程序:CPU执行网卡驱动程序的中断处理程序,读取环形缓冲区中的数据包并将其传递给内核网络栈。
- 网络协议栈处理:内核网络栈处理数据包,将其存放到对应的TCP接收缓冲区(受
tcp_rmem
参数限制)。 - 传递到用户空间:用户空间应用程序通过系统调用(如
recv
或read
)从TCP接收缓冲区读取数据。
sk_buff和发送缓冲区也不是一个东西
发送网络数据的时候,涉及的内存拷贝操作:
- 调用发送数据的系统调用的时候,内核会申请一个内核态的 sk_buff 内存,将用户待发送的数据拷贝到 sk_buff 内存,并将其加入到发送缓冲区。这里的发送缓冲区其实就是
tcp_wmem
控制的缓冲区。- TCP协议需要将sk_buff拷贝出一份保证收到ACK
- IP层发现sk_buff大于MTU时也需要进行拆分拷贝
- DMA从内核缓冲区将数据拷贝到网卡的Ring Buffer中。等待网卡发送。
参考:
- https://blog.csdn.net/weixin_36338224/article/details/107035214
- 小林coding-图解网络