网络编程中的网络调试
ifconfig中的MTU是最大传输单元的意思,表示的是链路层包的大小。1500表示的是字节的大小。Metric就是用来确定多块网卡的优先级的,数值越小,优先级越高,1为最高级
time_wait表示访问积压
在平时的工作中,最常碰到的问题就是某某进程对应的网络状况如何?是不是连接被打爆了,还是有大量的time_wait连接
1.netstat指令:
最大的好处就是可以清楚的看到一条TCP连接的四元组(源地址、源端口、目的地址和目的端口)
-a:列出所有连接
-t:表示tcp的连接
-p:表示查看进程信息
-ep:同时查看进程名和用户名
netstat -ltep | grep ESTA 查看连接的tcp连接
不熟netstat后面的参数的话,可以通过 netstat -help查找
2.lsof命令:常见的用途之一就是帮助我们找出在指定的IP地址或者端口上打开套接字的进程,而netstat则告诉我们ip地址和端口的使用情况,以及各个TCP连接的状态,lsof和netstat可以结合起来一起使用
lsof 还有一个非常常见的用途。如果我们启动了一个服务器程序,发现这个服务器需要绑定的端口地址已经被占用,内核报出“该地址已在使用”的出错信息,我们可以使用 lsof 找出正在使用该端口的那个进程。比如下面这个代码,就帮我们找到了使用 8080 端口的那个进程,从而帮助我们定位问题。
如: lsof -i :7185
3. tcpdump:抓包利器:tcpdump具有非常强大的过滤和匹配功能
比如说指定网卡:
tcpdump -i eth0
|
再比如说指定来源:
tcpdump src host hostname
|
我们再来一个复杂一点的例子。这里抓的包是 TCP,且端口是 80,包来自 IP 地址为 192.168.1.25 的主机地址。
tcpdump 'tcp and port 80 and src host 192.168.1.25'
|
如果我们对 TCP 协议非常熟悉,还可以写出这样的 tcpdump 命令:
tcpdump 'tcp and port 80 and tcp[13:1]&2 != 0'
|
这里 tcp[13:1] 表示的是 TCP 头部开始处偏移为 13 的字节,如果这个值为 2,说明设置了 SYN 分节,当然,我们也可以设置成其他值来获取希望类型的分节。
tcpdump 在开启抓包的时候,会自动创建一个类型为 AF_PACKET 的网络套接口,并向系统内核注册。当网卡接收到一个网络报文之后,它会遍历系统中所有已经被注册的网络协议,包括其中已经注册了的 AF_PACKET 网络协议。系统内核接下来就会将网卡收到的报文发送给该协议的回调函数进行一次处理,回调函数可以把接收到的报文完完整整地复制一份,假装是自己接收到的报文,然后交给 tcpdump 程序,进行各种条件的过滤和判断,再对报文进行解析输出。
下面这张图显示的是 tcpdump 的输出格式:
首先我们看到的是时间戳,之后类似 192.168.33.11.41388 > 192.168.33.11.6443 这样的,显示的是源地址(192.168.33.11.41388)到目的地址(192.168.33.11.6443);然后 Flags [ ] 是包的标志,[P] 表示是数据推送,比较常见的包格式如下:
- [S]:SYN,表示开始连接
- [.]:没有标记,一般是确认
- [P]:PSH,表示数据推送
- [F]:FIN,表示结束连接
- [R] :RST,表示重启连接
我们可以看到最后有几个数据,它们代表的含义如下:
- seq:包序号,就是 TCP 的确认分组
- cksum:校验码
- win:滑动窗口大小
- length:承载的数据(payload)长度 length,如果没有数据则为 0
此外,tcpdump 还可以对每条 TCP 报文的细节进行显示,让我们可以看到每条报文的详细字节信息。这在对报文进行排查的时候很有用。
tcpdump -i eth2 port 8080 :指定网卡,并且监督这个网卡上的8080端口
tcpdump指令可参考:https://www.cnblogs.com/chyingp/p/linux-command-tcpdump.html
tcpdump 可以结合 wireshark,也就是把抓到的协议包保存成 cap 格式的,然后在 windows 上点击查看更加形象
tcpdump host 10.1.11.133 and udp port 5060 -v -w gw.cap【写成 wireshark 可读取的】