前言

在我印象中,抓包是任何自称做信息安全的人,或装逼或干事儿都跳不过的一部分。但是为了说明什么是包,我觉得我应该先简单说一下,什么是网络分层

网络分层

为什么要分层

按照模块化程序设计的理念,一个下层的模块,应该向上层提供服务。上层可以从下层中找到所有需要的组件,然后做他自己的事情。举例来说,如果我需要造一辆汽车,我就需要发动机,需要座椅等等。自己把所有的东西从头到尾造出来显然是不现实的。所以就出现了发动机厂,座椅厂这些下层的服务商。品牌车需要跟这些厂商采购,对于主打音响的汽车,就弄好点的音响,座椅就可以差点。面对奢华车,那什么都得是最好的。这种分层结构可以高效的满足各种不同的需求。这种社会中的分层结构,在网络世界也是类似的。

网络世界也十分复杂。你可以用网络来聊天,看视频,看博客等等。不同的需求面对的网络结构是不一样的。比方说聊天需要的是准确的送达数据,慢点就慢点吧;看视频则需要快速送达数据,中间丢几帧也无所谓。显然这些不同的需求不能用同一套网络协议解决,但是他们的底层都是一样的,都是用网线,路由器等等连接在一起。这种不一样又一样的需求,决定了我们需要对网络进行分层。这样既可以在底层提供传送信息的基本功能,又可以在上层满足不同的需求。

一共分了几层

OSI模型

目前来说,最为广泛接受的分层结构叫做“Open Systems Interconnection model (OSI model)”,翻译成中文就是开放系统互连模型。这个结构中一共分为7层。正是这种从上往下的7层,让我们享受到了现在丰富多彩又完备的网络。其实在历史上,分层不是最开始就是7层的。在最开始的70年代,网络的定义是很杂乱无章的。其中很多商业行为会直接影响网络结构的设计。在1978年的时候,美国华盛顿特区设计了第一版的网络分层标准。但是这个标准还在不断变化。比方说在80年带交换机和路由器大规模使用后,第三层网络转发层才开始出现。
总之,到了现在,我们的网络结构被定义成了7层,他们分别是:

  • Application layer 应用层
  • Presentation layer 表示层
  • Session layer 会话层
  • Transport layer 传输层
  • Network layer 网络层
  • Data link layer 数据链路层
  • Physical layer 物理层

五层模型

相对于比较复杂的7层模型来说,人们熟知的是五层模型。在这个模型中,我们没有传输层,会话层和表示层。只有剩下的应用层,传输层,网络层,数据链路层和物理层。接下来的部分中,我会详细针对五层模型进行进一步的直觉性解释。

分层细节

  1. 物理层就是最基本的物理特性。比方说光缆,电缆等等。但是光缆和电缆怎么传输数据的呢?其实任何物理特性都可以被用作数据传输。比方说光缆吧。他可以通过一明一暗来表示1或者0两个状态。比方说你拿着一个手电筒,打开表示1,关闭表示0。你就可以通过这打开关闭向我传递一个bit的信息。光缆也是类似的工作原理。其实多数的数据传输也都类似。这就是最底层的物理层。

  2. 数据链路层就是在物理的基础上,建立数据链路。同时在这一层要确保数据传送准确无误。也就是在这一层,有了MAC地址的概念。MAC地址是一个网卡的物理地址,比方说一间屋子就在东经xxx,北纬xxx,他不能变了。(当然也存在虚拟MAC,这个以后再说)。比方说在物理层来来回回的通电,打光。物理信号是有了,但是这个是什么意思呢?就需要数据链路层把物理信号按照数据帧的形式解析出来。同时要是接收的时候受到干扰,或者电线不好使了等等,接收的时候就会有差错。数据链路层还需要进行差错控制,流量控制等等的工作。

  3. 网络层主要是把数据链路层的数据通路,用网络包的形式表示。也就是在这一层,出现了你常见的IP的概念。在数据链路的基础上,给网卡一个IP地址来标识这个计算机在网络中的代号。和MAC的物理地址,东经北纬不一样的是,IP地址相当于逻辑地址,相当于门牌号。就好像你写信,就会用xxx街xxx号一样,你发包也是要用IP的。他是可能会变化,但是更加灵活的。一旦有了IP,你说发某个包到xxxIP,那么网络层就会通过这个IP找到对应的通路,给某个物理地址(MAC)发过去,那么就可以让数据包在各个电脑之间稳定传送,而不是纯粹的0或者1的数据了。在这一层,出现了数据的分发,拥塞控制等等。

  4. 传输层作用是用具体的方式传送数据。听起来和网络层很像,但是在网络层的基础上做了很多事情。比方说我们聊天的时候,我发送一个数据包过去。你怎么知道是不是发送完整了呢?网络层有没有丢包呢?有没有因为网络拥塞一部分聊天内容被抛弃了没有传过来呢?为了保证这一点,传输层就出现了。最常见的传输层协议包括TCP和UDP。简单理解,UDP就是无脑发包。不管有没有丢失,只要你按顺序播放就行。这种格式一般用来做网络通话啦,看视频啦等等。因为丢一两个包也无所谓,顶多通话的时候滋滋啦啦一阵子,看视频的时候跳一跳。但是TCP就不同了。TCP要保证每一个数据包都准确无误的传送到位。比方说发电子邮件,必须要求完整。所以TCP出现了三次握手,丢包重发等等这些东西保证无误且有序。与此相关的很多方面经常被脚本小子们用来DOS攻击,其实是很无聊而且不好对付的一种攻击手段。

  5. 应用层一般就认为是最高层了。这一层就很杂乱了。日常上网的HTTP协议,加密的HTTPS协议,传送文件的FTP协议,甚至你可以自己定义一个传送协议。这都没问题。因为在下层的传输层已经可以保证快速或者准确的传送数据了。怎么用这个数据那就自己来定义了。

直觉来说,发包就像寄快递。物理层就是汽车,飞机等等;数据链路层就是东经北纬等物理信息,以及快递员亲手送东西的过程(MAC);网络层就是门牌号和快递包在各个省市转发的过程(IP);传输层就是这个快递是必须签收,还是房门口就行,是到付还是拒付退回(TCP/UDP);应用层就是你可以用这套体系寄送信件,或者送一个手办等等。(HTTP/FTP)

好了。这些东西知道就好,不用背,但是一定要理解。我已经一句多余的知识都没提到了。这些网络基础的东西对于以后还有大用。