(6) 网络工具

必备工具:ping

“ping”这个命名来自于声呐探测,在网络上用来完成对网络连通性的探测
$ ping www.sina.com.cn
PING www.sina.com.cn (202.102.94.124) 56(84) bytes of data.
64 bytes from www.sina.com.cn (202.102.94.124): icmp_seq=1 ttl=63 time=8.64 ms
64 bytes from www.sina.com.cn (202.102.94.124): icmp_seq=2 ttl=63 time=11.3 ms
64 bytes from www.sina.com.cn (202.102.94.124): icmp_seq=3 ttl=63 time=8.66 ms
64 bytes from www.sina.com.cn (202.102.94.124): icmp_seq=4 ttl=63 time=13.7 ms
64 bytes from www.sina.com.cn (202.102.94.124): icmp_seq=5 ttl=63 time=8.22 ms
64 bytes from www.sina.com.cn (202.102.94.124): icmp_seq=6 ttl=63 time=7.99 ms
^C
--- www.sina.com.cn ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5006ms
rtt min/avg/max/mdev = 7.997/9.782/13.795/2.112 ms
在上面的例子中,使用 ping 命令探测了和新浪网的网络连通性。可以看到,每次显示是按照 sequence 序列号排序显示的,一并显示的,也包括 TTL(time to live),反映了两个 IP 地址之间传输的时间。最后还显示了 ping 命令的统计信息,如最小时间平均时间等。

ping 是基于 ICMP 的协议开发的ICMP 又是一种基于 IP 协议的控制协议,翻译为网际控制协议,其报文格式如下图:

ICMP 在 IP 报文后加入了新的内容,这些内容包括:
  • 类型    即 ICMP 的类型, 其中 ping 的请求类型为 8,应答为 0。
  • 代码    进一步划分 ICMP 的类型, 用来查找产生错误的原因。
  • 校验和用于检查错误的数据。
  • 标识符:通过标识符来确认是谁发送的控制协议,可以是进程 ID。
  • 序列号:唯一确定的一个报文,前面 ping 名字执行后显示的 icmp_seq 就是这个值。

基本命令:ifconfig

用来显示当前系统中的所有网络设备,通俗一点的说,就是网卡列表。
vagrant@ubuntu-xenial-01:~$ ifconfig
cni0      Link encap:Ethernet  HWaddr 0a:58:0a:f4:00:01
          inet addr:10.244.0.1  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::401:b4ff:fe51:bcf9/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:2133 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2216 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:139381 (139.3 KB)  TX bytes:853302 (853.3 KB)


docker0   Link encap:Ethernet  HWaddr 02:42:93:0f:f7:11
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:93ff:fe0f:f711/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:653 errors:0 dropped:0 overruns:0 frame:0
          TX packets:685 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:49542 (49.5 KB)  TX bytes:430826 (430.8 KB)


enp0s3    Link encap:Ethernet  HWaddr 02:54:ad:ea:60:2e
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::54:adff:feea:602e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7951 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4123 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:5081047 (5.0 MB)  TX bytes:385600 (385.6 KB)
(1) 这段表明这是一个以太网设备,MAC 地址为 02:54:ad:ea:60:2e。
Link encap:Ethernet  HWaddr 02:54:ad:ea:60:2e
(2) 这里显示的是网卡的 IPv4 和 IPv6 地址,其中 IPv4 还显示了该网络的子网掩码以及广播地址。
inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
inet6 addr: fe80::54:adff:feea:602e/64 Scope:Link
注:在每个 IPv4 子网中,有一个特殊地址被保留作为 子网广播地址,比如这里的 10.0.2.255 就是这个子网的广播地址。当向这个地址发送请求时,就会向以太网网络上的一组主机发送请求。
(3) 这里显示的是网卡的状态,MTU 是最大传输单元的意思,表示的是链路层包的大小。1500 表示的是字节大小。
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
注:Linux 在一台主机上可以有多个网卡设备,很可能有这么一种情况,多个网卡可以路由到目的地。Metric 就是用来确定多块网卡的优先级的,数值越小,优先级越高,1 为最高级。

对网络状况了如指掌netstat 和 lsof

netstat 可以帮助我们了解当前的网络连接状况,比如我想知道当前所有的连接详情,就可以使用下面这行命令:
netstat -alepn

netstat 会把所有 IPv4 形态的 TCP,IPV6 形态的 TCP、UDP 以及 UNIX 域的套接字都显示出来。

也可以只对 UNIX 套接字进行筛查:
netstat Socket -x -alepn

UNIX 套接字的结果稍有不同,最关键的信息是 Path,这个信息显示了本地套接字监听的文件路径

lsof 的常见用途之一是帮助找出 在指定的IP地址或者端口上 打开套接字的进程,而 netstat 则告诉我们 IP 地址和端口使用的情况,以及各个 TCP 连接的状态。Isof 和 netstst 可以结合起来一起使用。
可以通过 lsof 查看到底是谁打开了这个文件:
lsof /var/run/docker.sock

显示了是 dockerd 打开了这个本地文件套接字。

lsof 还有一个非常常见的用途。可以使用lsof找出 正在使用某个端口的那个进程。
lsof -i :8080

抓包利器: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[13:1]表示的是 TCP 头部开始处偏移为 13 的字节,如果这个值为 2,说明设置了 SYN 分节: (注:这里的偏移是从0开始算起的,tcp[13]其实是报文里的第 14 个字节。)
tcpdump 'tcp and port 80 and tcp[13:1]&2 != 0'

工作原理:
(1) tcpdump 在开启抓包的时候,会自动创建一个类型为 AF_PACKET 的网络套接口,并向系统内核注册。
(2) 当网卡接收到一个网络报文之后,它会遍历系统中所有已经被注册的网络协议,包括其中已经注册了的 AF_PACKET 网络协议。
(3) 系统内核接下来就会将网卡收到的报文 发送给该协议的回调函数进行一次处理,回调函数可以把接收到的报文完完整整地复制一份,假装是自己接收到的报文,然后交给 tcpdump 程序。
(4) tcpdump程序再进行 各种条件的过滤和判断,再对报文进行解析输出。

tcpdump 的输出格式:

首先看到的是时间戳,之后类似 192.168.33.11.41388 > 192.168.33.11.6443 这样的,显示的是源地址(192.168.33.11.41388)到目的地址(192.168.33.11.6443)
Flags[ ]是包的标志,比较常见的包格式如下:
  • [S]:SYN,表示开始连接
  • [.]: 没有标记,一般是确认
  • [P]:PSH,表示数据推送
  • [F]:FIN,表示结束连接
  • [R]:RST,表示重启连接
seq:     包序号,就是 TCP 的确认分组
cksum:校验码
win:     滑动窗口大小
length:承载的数据(payload)长度,如果没有数据则为 0

思考题

1. tcpdump这个工具还可以对 UDP 包进行抓包处理吗?
tcpdump可以抓UDP包,指定端口就可以了。
tcpdump还可以导出文件pcap,放到wireshark中进一步分析。
2. netstat 输出时,监听状态的套接字所对应的 Foreign Address 显示的 *.* 表示的是什么意思呢?
这个套接字正在监听端口等待连接进来,允许任何地址、任何端口来建立连接。



网络编程实战 文章被收录于专栏

网络编程与常见问题

全部评论

相关推荐

缓解焦虑的最好方法是回家。鼠鼠昨天上午考完了本科阶段的最后一场考试,大概率考得稀烂,但是没多想,考完立马收拾行李,坐上了提前约好的顺风车飞奔回家。虽然家和学校很近,只有一百多公里的路程,但距离上次回家也已经有三四个月了。每次想回家,期间总有考试、毕业设计、面试、实习等等各种各样的原因,没办法回去,待在学校和公司的每一天也都充斥着无形的压力和焦虑。现在终于完成了答辩,考完了试,公司那边也请了假,是时候回去一趟了。没有提前通知爸妈,想给他们一个惊喜。下午提前到了家,他俩还在上班,只好让外公外婆来给我开门。因为我的回家,晚上外婆在厨房格外忙碌,做了满满一大桌子菜,填饱了我天天吃外卖的肚子。晚上也没空...
梦想是成为七海千秋:取决于家庭吧?其实回家更焦虑了,每天起床父母都问实习找好了没简历投递了没今天有没有面试,但是又没有什么结果,玩两下手机父母就会说你看你啥也没找到为什么天天就知道刷手机,怎么不去学习…我现在就希望我能永远在外面实习,报喜不报忧,等拿到一个好offer再回家
点赞 评论 收藏
分享
真烦好烦真烦:牛友太有实力了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务