在平时和其他大佬交流时,总会出现这么些话,“抓个包看看就知道哪出问题了”,“抓流量啊,payload都在里面”,“这数据流怎么这么奇怪”。这里出现的名词,都是差不多的意思吗?packet,frame,flow,session区别是什么,你真的分的清楚吗?
平时关系还不大,这几个名词随便用,大家也都知道指什么,这段时间在分析协议类型的漏洞,终于意识到基础知识的浅薄,才知道自己根本没分清这几个基础概念,看国外一些技术文档不明所以,于是查了大量资料,写出了本文。
区分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的应答等。
区分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。
区分datagram和stream
stream是我们通常认为的通信渠道。比如远程登录,文件传输,邮件传递 ,这个都是使用stream。 Strean就像管道一样。它有两个端点。数据从一端放入,另一端出来。没有任何数据以任何方式被复制,丢弃或重组。两个流可以组合在一起形成全双工连接。
datagram(通常称为packet)本质上更具原子性。它是一小段数据,通常要求小于***长度(通常在256到2000字节范围内)。datagram是完全自包含的,有源和目的地,但不能被称为connection。数据报与之前或之后的任何其他数据都没有任何关系。
很难理解吗?
我们再打个比方。
stream就像打电话- 一方拨打电话,另一方接听,你们互相打招呼(TCP中的SYN / ACK),然后交换信息。一旦完成,你就说再见(TCP中的FIN / ACK)。 如果一方没有听到再见,他们通常会打电话给另一方,因为这是一个意想不到的事件; 也就是说通常客户端将重新连接到服务器。这样可以保证数据不会以与我们发送的顺序不同的顺序到达,并且可以保证数据不会被损坏。
datagram就像在班级里传小纸条。如果你和想要拿到小纸条的人不坐在一起,这个小纸条将在其他人之间传递过去。小纸条可能无法到达目的地,并且可能会在到达目的地时被修改过。另一种两款,如果将两个小纸条传递给同一个人,两个小纸条可能不会按照我们需要的顺序到达,因为小纸条们通过教室的路线可能不一样,一个人可能不会像另一个那样快速传递小纸条,等等会有很多因素影响到小纸条的传递。
尽管大多数网络通信都使用stream,但所有Internet传输都采用datagram的形式,实际上是通过TCP协议使用datagram来模拟Internet stream。而为了诊断因特网故障,可以使用诸如TCPdump这类packet decoder来查看各个packet。
区别Packet和frame
为了简化问题,我们将frame和packet想象为将要从一个人发送到另一个人的信息的信封。 frame和packet之间的关键区别在于它们如何封装信息,而这取决于信息在哪儿被发送。
想象一下,一家公司有跨部门邮件,一个人可以将文档发送给其本地组织中的另一个人。内容放在内部信封中,发送者在“发件人”字段中写下他们的姓名和部门,然后在“收件人”字段中写下收件人的姓名和部门。发送信封时,邮件室识别内部使用信封,读取目的地名称和部门,使用目录将该信息转换为物理位置(办公室)并将其传递给收件人。信封永远不会离开本地组织,信封的所有传递行为都由本地处理。
部门间信封不能发送到公司外部,因为信封上没有邮寄地址。要将内容发送到本地以外的办公室,需要将办公室间信封放在邮政信封内,并贴上适当的邮政地址标签。
Frame以类似的方式工作。 它是具有源和目标地址的数据的容器,用于在同一网络上的两个位置之间传递称为payload的信息。Frame的源和目标地址不是名称和部门,而是计算机,平板电脑,IP电话,物联网设备等的MAC地址,这是每个以太网设备在这个世界上唯一的ID号。
frame由网络接口设备在TCP/IP协议栈的第2层生成,payload大小取决于传输的数据类型。frame被发送到网络上,以太网交换机根据其存储器中的MAC表检查frame的目的地址。MAC表告诉交换机哪个物理端口(RJ45端口)与设备相关联,该设备的MAC地址与帧的目的地址相匹配。
交换机将frame转发到由MAC表确定的物理端口。如果电缆直接连接到目的设备,传输就完成了。如果电缆连接到另一台交换机,下一台交换机将重复查找和转发过程,直到frame到达预期目的地。
这一切都发生在LAN中的第2层交换机上。与部门间邮件一样,frame不能在本地/专用网络之外发送到因特网上,因为它没有正确的地址。要将数据发送到不同网络或互联网服务器上的设备,必须在packet中构建一个frame。
很像部门间信封需要放在邮政信封内发送到不同的办公室的例子,Ethernet frame用附加信息封装,以创建一个IPpacket。
虽然网络设备的MAC地址是唯一,***的,但IP地址通常会临时分配给网络设备,并随着设备连接到不同的网络而改变。例如,平板电脑每次连接到不同的无线网络时,其IP地址都会发生变化。packet在网络的第3层创建,允许不同局域网之间交换信息,通常是通过路由器。路由器将小型网络互连在一起,允许使用IP地址而不是MAC地址进行更大规模的信息交换。
第3层packet允许路由器使用标识网络的IP地址和网络上设备的临时地址来提供网络间的数据传输(互联网)。一旦进入网络,网络内(局域网)数据转发由二层交换机处理,它读取frame的MAC地址,并将其转发到目的设备,在那里以太网控制器提取payload,完成不同网络上设备之间的信息传输过程。
区分packet capture和flow capture(抓包和抓流量)
Packet capture可以让我们在网络数据包通过网络时拿到镜像。而flow data通常包含在网络上设置的连接的摘要。它们都是非常有用的故障排除技术,可以找出网络上发生的故障。那么这两种技术有什么区别呢?
Flow capture:在OSI模型的第3层运行的大多数路由器和交换机都具有flow导出选项。有许多flow标准,包括NetFlow,sFlow和IPFIX。 只需安装一个flow连接器,它可以处理网络设备使用的任何flow标准。基于flow的分析可以很好地找出网络中某些部分的通信状况。它的优点是:
- 易于在第3层设备上设置操作;
- 不需要布线;终端用户系统不需要软件客户端或代理。
缺点是:
- 某些交换机上没有flow选项;
- 想要解决问题时缺少详细信息;
- 当应用程序依赖其他协议时,不适合在网络边缘进行监控
Packet capture: 抓包能够捕获在网络中传输的网络数据包的镜像。大多数交换机允许在不影响网络性能的情况下设置镜像端口。通常,深度数据包检测(DPI)应用程序连接到镜像端口,并从数据包中提取某些信息,以便我们可以发现网络上发生了什么。优点是:
- 更好地分析应用程序和用户行为,非常适合监控重要应用程序,服务器或至关重要的Internet连接;
- 会得到更多的信息,如应用程序,文件,网站和主机名;
- 终端用户系统上不需要软件客户端或代理。
缺点是:
- 需要在镜像端口和DPI应用程序之间连接物理线路;
- 需要确保镜像端口在繁忙的网络上不会过载。
在不清楚区别之前,我们可能会将两者混为一谈,现在应该已经明确区别了。那我们应该使用哪种技术?在一般情况下,两者都需要用到。如果有大量的WAN链接并且需要一种简单的方法来获得***程度的可见性,抓流量可能更好。而抓包可以为我们提供网络上某些节点的更多详细信息。两者的结合意味着我们可以更轻松地检测诸如带宽占用,以及查看正在使用的应用程序等情况。
结语
需要区分的点都很多,我在文中已经比较好的安排,一步步引出来,从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)的区别及各自优缺点。
大部分做安全的小伙伴应该都不是网络工程出身,所以本文或多或少还是有些参考价值的。希望各位师傅能从中获益。