如何通过命令行工具去理解网络协议

TCP/IP网络分层模型

  • TCP/IP五层模型将网络功能五层。
  • 每一层实现各自的功能。

    • 应用层:为应用程序提供服务。
    • 传输输层:解决进程间的通信。
    • 网络层:解决跨网络的主机通信问题。
    • 数据链路层:解决相邻网络节点通信问题。
    • 物理层:透明地传输比特流。
  • 每一层都有对应的具体协议。
  • 每一层通过接口为上层提供服务。
  • 收发两端的对等层通过协议进行通信。

基本概念

  • IP地址

    在Internet上的给主机统一编址的地址格式,也称为网络协议(IP协议)地址。它为互联网上的每一个网络和每一台主机分配一个逻辑地址,常见的IP地址,分为IPv4与IPv6两大类。

  • 子网

    IP地址是以网络号和主机号来标示网络上的主机的,比如172.16.10.0/24所表示的一个子网前24个bits表示网络号,后8bits表示主机号,该子网的IP地址的范围是172.16.10.0-172.16.10.255。网络号为相同子网,同子网的主机可以直接相互通信;不同子网须通过本地网关(Gateway)经由路由器来转发数据。

  • MAC地址

    称为物理地址,也叫硬件地址,用来定义网络设备的位置,MAC地址是网卡出厂时设定的。采用十六进制数表示,长度是6个字节(48位)。

  • 路由器

    工作在网络层,根据IP地址,将数据包从一个子网传递转发到另外一个子网上。

  • 交换机

    工作在数据链路层,根据MAC地址,将一个数据帧从一个节点传送到相同链路的另一个节点上。


测试场景

以上ECS网卡的IP地址以及MAC地址可以通过ifconfig命令查询到。以查询ecs1的网卡信息为例:


网络诊断助手

命令工具
  • ping
ping命令采用的协议ICMP

ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP 工作在IP层,报文作为 IP 层数据报的数据,加上IP数据报的首部,组成 IP 数据报发送出去。

ping命令的基本作用
  • 目的主机是否可达
  • 报文往返主机的时延

ping命令选项
  • -c 限定发包的个数
  • -i 控制发包的时间间隔
  • -s 设定包的大小,通常用于验证大包是否可以正常传输

解析主机间通信过程

命令工具
  • arp arp相关操作
  • route 路由相关操作
通过route命令区分通信的类型

通过route -n查看ecs1的路由信息:

​ ecs2的IP为172.16.10.20,匹配最后一条路由信息,属于172.16.10.0/24网段,说明两者同属一个子网。同属于一个子网的主机间通信通过二层交换机即可完成,属于子网通内通信。

​ ecs3的ip 172.16.30.30会匹配第一条路由,从ecs1发给ecs3的报文会从网卡eth0发送到网关172.16.10.1,该网关配置的路由器的一个端口上。凡是需要通过子网网关转发到目的主机的通信过程都属于子网间通信。

子网内通信

ecs1和ecs2同属一个子网,我们通过从ecs1去ping ecs2来观察子网内的通信过程。

子网内通信发送数据帧过程:

接下来我们通过命令行观察通信过程是如何完成的。

​ 在子网内通信中,数据帧是通过MAC地址去找到目标主机然后完成传输。首先我们通过arp -n命令查看ecs1的arp缓存表:

可以看到网关172.16.10.1的MAC地址是fa:16:3e:12:00:7d,但是ecs1并没有esc2的MAC地址,需要ARP协议去获得目标主机ecs2的MAC地址。

​ 通过抓包发现,在正式进行通信之前,ecs1会先发送ARP广播,在ecs2收到报文之后,因为自身的IP是arp请求的IP,所以会回复自己的MAC地址,这样ecs1就获得ecs2的MAC地址。同时ecs2也会学习到ecs1的MAC地址。

这个过程之后再分别查看ecs1和ecs2的arp缓存表,收发两端都获取到了对端主机的MAC信息:

在接下来的过程中,两者可以拿着学习到的MAC地址完成通信。

跨子网通信

ecs1和ecs3属于不同子网,我们通过从ecs1去ping ecs3来观察跨子网的通信过程。

三层报文的数据转发路径:

​ 报文首先会从ecs1发送到网关172.16.10.0/24网关172.16.10.1,然后路由器会查询路由表从子网172.16.30.0/24网关172.16.30.1接口发出去达到ecs3。

结束ping之后查看ecs1和ecs3的arp缓存,发现并没有对端IP的arp缓存记录。

在ecs1抓包,可以发现ecs1发送给ecs3的报文的目的MAC地址正是172.16.10.0/24网关172.16.10.1的MAC地址。

在ecs3上抓包,ecs1发送给ecs3的报文的可以发现源MAC地址是子网172.16.30.0/24网关172.16.30.1的MAC地址。

VPC网络理解

​ 目前各大公有云厂商基本都提供了虚拟私有云(Virtual Private Cloud,简称VPC)这个网络产品,为用户提供了一个安全隔离,管理配置便捷的虚拟网络环境。前面的讲解的通信模型可以构成一个最简单的VPC,每个VPC由一个虚拟路由器和一个或多个虚拟交换机组成,每个虚拟交换机对应了一个子网,用户可以在不同的子网去创建虚拟机。子网内主机的通信通过对应的交换机去完成,跨子网的主机通信需要通过路由器路跳转到目的子网再到目的主机。

​ 阿里云的经典网络也同样可以理解为是一个独立的网络平面,但是与VPC不同的是,VPC里的IP地址是每个租户单独使用的,租户可以使用一整段的IP地址进行网络规划,并配置相应的安全规则和路由规则。而经典网络的IP资源是所有用户共享的,分配到的IP也是随机获取的,这样就会造成每个租户的IP是离散的,就无法灵活地去配置安全规则和路由规则。另外,每个经典网络的虚拟机都需要一个IP获得公网访问能力,而在VPC中只要给一个VPC配置一个NAT网关让VPC内所有虚拟机都获得公网访问能力。以上是VPC优于经典网络的地方。

虚拟私有云这个名称容易对刚接触云计算的同学造成困扰,可能会与公有云、私有云等概念造成混淆,实际上虚拟私有云就是一个隔离的虚拟网络环境,这样了理解会更加清晰点。

传输层基本功能

​ 当源主机的信息通过网络层传送到目的主机的网卡之后,传输层通过端口将报文信息送到对应的端口。传输层实现了应用进程间的端到端(end-to-end)通信 。

命令工具
  • netstat 查看本地端口连接状态
  • telnet 判断目的主机端口是否可以访问
tcp连接中的连接释放过程与状态变化

传输层网络状态查看

​ 通过python的SimpleHTTPServer命令在ecs3的8000端口上起一个http服务 python -m SimpleHTTPServer ,然后通过命令netstat -nat可以查看ecs3上所有tcp的端口连接状态。可以看到8000端口处于LISTEN状态。

​ 在ecs1上telnet ecs3的8000端口 telnet 172.16.30.30 8000,可以看到ecs3的8000端口与ecs1de 57498端口建立了连接,进入了TCP连接中的ESTABLISHED状态。

​ 最后在ecs1终止telnet,再次观察ecs3的8000端口的端口连接状态,可以发现收发两端的连接状态进入了TIME_WAIT的状态。

再经过一段时间,TIME_WAIT状态的连接会消失,回到只有一个LISTEN状态的网络端口状态信息。

telnet端口探测结果

​ 在ecs1上对ecs3的8000端口进行端口探测,如果可以正常的进行连接ecs1是如下图的结果:

​ 如果此时,停掉ecs3上对应的进程,使其不再对8000端口进行监听,可以发现telnet的结果是直接反馈Connection refused。

还有种情况是,对8000端口进行探测一直处于trying状态,这种情况一般是发起请求的报文未到达目的端,请求报文在传输过程中被drop掉,源端一直会等待到超时。

netstat命令常用选项
  • -a 显示所有连线中的Socket
  • -n 直接使用ip地址,而不通过域名服务器
  • -t 显示TCP传输协议的连线状况
  • -u 显示UDP传输协议的连线状况
  • -p 显示正在使用Socket的程序识别码和程序名称
  • -l 显示监控中的服务器的Socket

应用层的报文

命令工具
  • curl 利用URL语法在命令行下工作的文件传输工具

    在ecs1上通过curl命令访问ecs3在8000端口的服务,可以返回ecs3上的网页资源:

通过抓包发现可以清楚地看到发起请求过程中TCP三次握手的报文以及HTTP请求报文

同样的在完成请求后,会有HTTP响应报文以及TCP四次挥手的报文

curl命令常用选项
  • -v/--verbose 用于打印更多信息,包括发送的请求信息
  • -m/--max-time <seconds> 指定处理的最大时长
  • -H/--header <header> 指定请求头参数
  • -s/--slient 减少输出的信息,比如进度
  • -o/--output <file> 指定输出文件名称
  • -d/--data/--data-ascii <data> 指定POST的内容
  • -I/--head 仅返回头部信息,使用HEAD请求

抓包小贴士

命令工具
  • tcpdump 采用命令行方式对接口的数据包进行筛选抓取
抓包基本格式

重要抓包选项

-c 指定要抓取的包数量。
-i 指定tcpdump需要监听的接口。可以使用'any'关键字表示所有网络接口。
-n 对地址以数字方式显式,否则显式为主机名。
-nn 除了-n的作用外,还把端口显示为数值,否则显示端口服务名。
-e 输出的每行中都将包括数据链路层头部信息,例如源MAC和目标MAC。
-w 将抓包数据输出到文件中而不是标准输出

举例

抓取经过eth0的ecs1与ecs3在8000端口的tcp报文,抓取数量为1000,并存到文件中。

tcpdump -i eth0  host 172.16.10.10 and 172.16.30.30 and tcp port 8000 -nne -w packet.pcap
如果抓包要存入到文件中,最好指定抓取报文的数量,否则持续抓包而忘记停止会导致文件一直增大,挤爆服务器的存储空间,导致影响业务。

参考资料

OSI七层模型与TCP/IP五层模型

IP地址和子网划分学习笔记

netstat 命令详解

Linux之curl命令详解

抓包工具tcpdump用法说明

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章