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

TCP/IP网络分层模型

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

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

基本概念

  • IP地址

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

  • 子网

    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的网卡信息为例:curl


网络诊断助手

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

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

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用法说明

相关文章
相关标签/搜索