0×01 前言
在平时和其他大佬交流时,总会出现这么些话,“抓个包看看就知道哪出问题了”,“抓流量啊,payload都在里面”,“这数据流怎么这么奇怪”。这里出现的名词,都是差不多的意思吗?packet,frame,flow,session区别是什么,你真的分的清楚吗?
平时关系还不大,这几个名词随便用,大家也都知道指什么,这段时间在分析协议类型的漏洞,终于意识到基础知识的浅薄,才知道自己根本没分清这几个基础概念,看国外一些技术文档不明所以,于是查了大量资料,写出了本文。
0×02 区分control plane和data plane
control plane, data plane是实现网络设备所需要理解的两个基本的概念。data plane一般用于快速转发,而control plane是为快速转发准备必要的信息。control plane包括路由协议,设备管理,命令行,ARP,IGMP等;而data plane一般是转发包。这样的划分,目的是把系统的主要工作和次要工作分离开,避免不同类型的处理相互干扰。在一个网络设备里面,转发无疑是最主要的工作,它具有最高的优先级,而路由协议,由于并不需要在短时间内处理大量的包,所以可以把它放到次一级的优先级里面。data plane可以借助asic或者NP等优化,可以达到很高的速度,而control plane,则可以借助于通用的库,或者系统,以达到更好的保护。
control plane的os和data plane的os,作用完全不同。data plane的os需要实时响应,并且需要更快速,高效的内存管理,队列管理,定时器管理等;而control plane的os则倾向于更好的保护,更简便的编程方式,以及快速移植等。当然,哪些任务放到control plane,哪些任务放到data plane,是需要在实践中去选择。举个例子,由于arp学习和应答的时间是不确定的,而mac learning则是立即生效的。所以arp学习和应答一般放在control plane;而mac learning则放在data plane。
就data plane来说,又可分control path和data path。control path同样是为data path准备必要的信息。有时为了更快的速度,避免control plane和data plane过多的交互,把control plane的某些工作拿到data plane上来做,比如ICMP的应答等。
0×03 区分session和flow
flow是发送方和接收方之间的数据包中的data plane stream,其共享关键IP报头信息。例如,10.1.1.1端口12398处的客户端与用于SSH的192.168.1.1端口22处的服务器通信是specific stream,可以在关键字段不更改时捕获该特定stream。
session是发送方和接收方之间的control plane通信。TCP 3次握手创建会话,在发送方的源端口和接收方的目标侦听端口之间建立连接。TCP窗口大小,初始序列和确认值以及keepalive是作为构建session的一部分进行协商的。
简单地说,flow代表了data plane,而session代表了control plane。
0×04 区分datagram和stream
stream是我们通常认为的通信渠道。比如远程登录,文件传输,邮件传递 ,这个都是使用stream。Strean就像管道一样。它有两个端点。数据从一端放入,另一端出来。没有任何数据以任何方式被复制,丢弃或重组。两个流可以组合在一起形成全双工连接。
datagram(通常称为packet)本质上更具原子性。它是一小段数据,通常要求小于最大长度(通常在256到2000字节范围内)。datagram是完全自包含的,有源和目的地,但不能被称为connection。数据报与之前或之后的任何其他数据都没有任何关系。
很难理解吗?
我们再打个比方。
datagram就像在班级里传小纸条。如果你和想要拿到小纸条的人不坐在一起,这个小纸条将在其他人之间传递过去。小纸条可能无法到达目的地,并且可能会在到达目的地时被修改过。另一种两款,如果将两个小纸条传递给同一个人,两个小纸条可能不会按照我们需要的顺序到达,因为小纸条们通过教室的路线可能不一样,一个人可能不会像另一个那样快速传递小纸条,等等会有很多因素影响到小纸条的传递。
尽管大多数网络通信都使用stream,但所有Internet传输都采用datagram的形式,实际上是通过TCP协议使用datagram来模拟Internet stream。而为了诊断因特网故障,可以使用诸如TCPdump这类packet decoder来查看各个packet。
0×05 区别Packet和frame
为了简化问题,我们将frame和packet想象为将要从一个人发送到另一个人的信息的信封。frame和packet之间的关键区别在于它们如何封装信息,而这取决于信息在哪儿被发送。
想象一下,一家公司有跨部门邮件,一个人可以将文档发送给其本地组织中的另一个人。内容放在内部信封中,发送者在“发件人”字段中写下他们的姓名和部门,然后在“收件人”字段中写下收件人的姓名和部门。发送信封时,邮件室识别内部使用信封,读取目的地名称和部门,使用目录将该信息转换为物理位置(办公室)并将其传递给收件人。信封永远不会离开本地组织,信封的所有传递行为都由本地处理。
交换机将frame转发到由MAC表确定的物理端口。如果电缆直接连接到目的设备,传输就完成了。如果电缆连接到另一台交换机,下一台交换机将重复查找和转发过程,直到frame到达预期目的地。
很像部门间信封需要放在邮政信封内发送到不同的办公室的例子,Ethernet frame用附加信息封装,以创建一个IPpacket。
0×06 区分packet capture和flow capture(抓包和抓流量)
Packet capture可以让我们在网络数据包通过网络时拿到镜像。而flow data通常包含在网络上设置的连接的摘要。它们都是非常有用的故障排除技术,可以找出网络上发生的故障。那么这两种技术有什么区别呢?
Flow capture:在OSI模型的第3层运行的大多数路由器和交换机都具有flow导出选项。有许多flow标准,包括NetFlow,sFlow和IPFIX。只需安装一个flow连接器,它可以处理网络设备使用的任何flow标准。基于flow的分析可以很好地找出网络中某些部分的通信状况。它的优点是:
1.易于在第3层设备上设置操作;
2.不需要布线;终端用户系统不需要软件客户端或代理。
缺点是:
1.某些交换机上没有flow选项;
2.想要解决问题时缺少详细信息;
3.当应用程序依赖其他协议时,不适合在网络边缘进行监控
Packet capture: 抓包能够捕获在网络中传输的网络数据包的镜像。大多数交换机允许在不影响网络性能的情况下设置镜像端口。通常,深度数据包检测(DPI)应用程序连接到镜像端口,并从数据包中提取某些信息,以便我们可以发现网络上发生了什么。优点是:
1.更好地分析应用程序和用户行为,非常适合监控重要应用程序,服务器或至关重要的Internet连接;
2.会得到更多的信息,如应用程序,文件,网站和主机名;
3.终端用户系统上不需要软件客户端或代理。
缺点是:
1.需要在镜像端口和DPI应用程序之间连接物理线路;
2.需要确保镜像端口在繁忙的网络上不会过载。
在不清楚区别之前,我们可能会将两者混为一谈,现在应该已经明确区别了。那我们应该使用哪种技术?在一般情况下,两者都需要用到。如果有大量的WAN链接并且需要一种简单的方法来获得最大程度的可见性,抓流量可能更好。而抓包可以为我们提供网络上某些节点的更多详细信息。两者的结合意味着我们可以更轻松地检测诸如带宽占用,以及查看正在使用的应用程序等情况。
0×07 结语
需要区分的点都很多,我在文中已经比较好的安排,一步步引出来,从control plane,data plane的区别开始讨论,因为这是区分0×03 flow和session的基础,在0×03中提到了stream的概念,于是在0×04中讨论stream和datagram的区别,在0×04最后提到了用于解码分析packet的tcpdump,引出了packet,于是自然在0×05中讨论packet和frame。以上基础概念和去都明确之后,最后讨论了抓包(packet capture)和抓流量(flow capture)的区别及各自优缺点。