精华内容
下载资源
问答
  • Linux网络防火墙Netfilter的数据包传输过滤原理.pdf
  • 网络数据包传输过程总结

    万次阅读 多人点赞 2016-03-01 13:39:17
    一、数据包是如何在网络传输的 我们电脑上的数据,是如何“走”到远端的另一台电脑的呢?这是个最基础的问题,可能很多人回答不上来,尽管我们每天都在使用网络。这里我们以一个最简单的“ping”命令,来解释一...

    一、数据包是如何在网络中传输的

    我们电脑上的数据,是如何“走”到远端的另一台电脑的呢?这是个最基础的问题,可能很多人回答不上来,尽管我们每天都在使用网络。这里我们以一个最简单的“ping”命令,来解释一个数据包“旅程”。

        假设:我的电脑A,向远在外地的朋友电脑B传输数据,最简单的就是“ping”一下,看看这个家伙的那一端网络通不通。A与B之间只有一台路由器。(路由器可能放在学校,社区或者电信机房,无所谓,基本原理是一样的)

    具体过程如下------
        1.“ping”命令所产生的数据包,我们归类为ICMP协议。说白了就是向目的地发送一个数据包,然后等待回应,如果回应正常则目的地的网络就是通的。当我们输入了“ping”命令之后,我们的机器(电脑A)就生成了一个包含ICMP协议域的数据包,姑且称之为“小德”吧~~~~

        2.“小德”已经将ICMP协议打包到数据段里了,可是还不能发送,因为一个数据要想向外面传送,还得经过“有关部门”的批准------IP协议。IP要将你的“写信人地址”和“收信人地址”写到数据段上面,即:将数据的源IP地址和目的IP地址分别打包在“小德”的头部和尾部,这样一来,大家才知道你的数据是要送到哪里。

        3.准备工作还没有完。接下来还有部门要审核------ARP。ARP属于数据链路层协议,主要负责把IP地址对应到硬件地址。直接说吧,都怪交换机太“傻”,不能根据IP地址直接找到相应的计算机,只能根据硬件地址来找。于是,交换机就经常保留一张IP地址与硬件地址的对应表以便其查找目的地。而ARP就是用来生成这张表的。比如:当“小德”被送到ARP手里之后,ARP就要在表里面查找,看看“小德”的IP地址与交换机的哪个端口对应,然后转发过去。如果没找到,则发一个广播给所有其他的交换机端口,问这是谁的IP地址,如果有人回答,就转发给它。

        4.经过一番折腾,“小德”终于要走出这个倒霉的局域网了。可在此之前,它们还没忘给“小德”屁股后面盖个“戳”,说是什么CRC校验值,怕“小德”在旅行途中缺胳膊少腿,还得麻烦它们重新发送。。。。。我靠~~~~注:很多人弄不清FCS和CRC。所谓的CRC是一种校验方法,用来确保数据在传输过程中不会丢包,损坏等等,FCS是数据包(准确的说是frame)里的一个区域,用来存放CRC的计算结果的。到了目的地之后,目的计算机要检查FCS里的CRC值,如果与原来的相同,则说明数据在途中没有损坏。

        5.在走出去之前,那些家伙最后折磨了一次“小德”------把小德身上众多的0和1,弄成了什么“高电压”“低电压”,在双绞线上传送了出去。晕~~出趟门就这么麻烦吗?

        6.坐着双绞线旅游,爽!可当看到很多人坐着同轴电缆,还有坐光纤的时候,小德又感觉不是那么爽了。就在这时,来到了旅途的中转站------路由器。这地方可是高级场所,人家直接查看IP地址!剩下的一概不管,交给下面的人去做。够牛吧?路由器的内部也有一张表,叫做路由表,里面标识着哪一个网络的IP对应着路由器的哪一个端口。这个表也不是天生就有的,而是靠路由器之间互相“学习”之后生成的,当然也可以由管理员手工设定。这个“学习”的过程是依靠路由协议来完成的,比如RIP,EIGRP,OSPF等等。

        7.当路由器查看了“小德”的IP地址以后,根据路由表知道了小德要去的网络,接着就把小德转到了相应的端口了。至此,路由器的主要工作完成,下面又是打包,封装成frame,转换成电压信号等一系列“折腾”的活,就由数据链路层和物理层的模块去干吧。

        8.小德从路由器的出口出来,便来到了目的地----电脑B----所属的网络的默认网关。默认网关可以是路由器的一个端口,也可以是局域网里的各种服务器。不管怎样,下面的过程还是一样的:到交换机里的ARP表查询“小德”的IP地址,看看属于哪个局域网段或端口,然后就转发到B了。

        9.进了B的网卡之后,还要层层“剥皮”,基本上和从A出来的程序是一样的------电脑B先校验一下CRC值,看看数据是否完整;然后检查一下frame的封装,看到是IP协议之后,就把“小德”交给IP“部门”了;IP协议一看目的地址,正确,再看看应用协议,是ICMP。于是知道了该怎么做了------产生一个回应数据包,(可以命名为“回应小德”),并准备以同样的顺序向远端的A发送。。至于刚刚收到的那个数据包就丢弃了。

        10.“回应小德”这个数据包又开始了上述同样的循环,只不过这次发送者是B而接收者是A了。

        以上是一个最简单的路由过程,任何复杂的网络都是在次基础之上实现的。

     

    网络数据包大小      

        用UDP协议发送时,用sendto函数最大能发送数据的长度为:65535-20-8=65507字节,其中20字节为IP包头长度,8字节为UDP包头长度。用sendto函数发送数据时,如果指的的数据长度大于该值,则函数会返回错误。

        用TCP协议发送时,由于TCP是数据流协议,因此不存在包大小的限制(暂不考虑缓冲区的大小),这是指在用send函数时,数据长度参数不受限制。而实际上,所指定的这段数据并不一定会一次性发送出去,如果这段数据比较长,可能会被分段发送,如果比较短,可能会等待和下一次数据一起发送。我在测试的时候,发现长度一般会被切成16384(16K)或49152(48K),不知道这两个值有什么意义。



    二、网络中 IP数据报传输的过程伪代码【有助于理解】

    IP数据报需从主机A上传送到主机B上,主机A首先查找路由表;
    if(目的主机是与自己在同一个网段内)
    {
        主机A查询自己的ARP表;
        if(有该目的IP地址对应的MAC地址的记录)
        {
    将该MAC地址作为目的MAC地址,封装数据帧,传送给主机B;
        }
        else
        {
              发送一个ARP请求广播给网段内的所有主机,来查询该目的IP地址的MAC地址;
    收到ARP请求报文的各个主机如果发现该IP地址是自己的IP地址,则返回一个ARP应答报文告诉主机A自己的MAC地址;
    如果发现不是自己的IP地址,则丢弃该报文。
    主机A收到这个应答报文后,就按照返回的MAC地址,将IP数据包封装成帧,然后发送到主机B上;
    (补充:一般为了减少网络中的报文量,通信双方会维护一个各自的ARP表,把一次通信中获得IP MAC地址对保存在缓冲的ARP表中,但是ARP有一个老化机制,删除一段时间内不用的IP MAC地址对。)
        }
    }
    else if(发现了能与目的网络号相匹配的表目)
    {
    则把报文发给改表目指定的下一站的路由器或直接连接的网络接口;
    报文发送到下一站时,数据帧的目的MAC地址是下一个站路由器或者网络接口的MAC地址,而IP头部的目的IP地址是主机B的IP地址;
    这里要指出的是:ARP请求报文以下一站路由器或网络接口的IP地址为目的IP地址,寻找真的目的MAC地址。换句话,ARP请求报文只负责IP据报传输过程中每一跳中的目的MAC地址查询。
    }
    else
    {
    寻找标为“默认”的表目,把报文发送给该表目指定的下一站路由器;
    报文发送到下一站时,数据帧的目的MAC地址是下一个站路由器的MAC地址,而IP头部的目的IP地址是主机B的IP地址。
    }
    数据帧在每两个网络设备间传递时,是转换成bit流在传输媒体上传输。链路层提供了如停止等待协议等机制,控制了bit流在传输媒体上的无措传输。


    三、ARP协议详解

    前言:ARP协议的作用:

    1. 什么是ARP?   
    ARP (Address Resolution Protocol) 是个地址解析协议。最直白的说法是:在IP以太网中,当一个上层协议要发包时,有了该节点的IP地址,ARP就能提供该节点的MAC地址。  
    2为什么要有ARP?
    OSI 模式把网络工作分为七层,彼此不直接打交道,只通过接口(layre interface). IP地址在第三层, MAC地址在第二层。
    协议在发生数据包时,首先要封装第三层 (IP地址)和第二层 (MAC地址)的报头, 但协议只知道目的节点的IP地址,不知道其物理地址,又不能跨第二、三层,所以得用ARP的服务。
    详细说明:
    Ø 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址, 而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃因此在通讯前必须获得目的主机的硬件地址。ARP协议就起到这个作用
    Ø 当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据 48位的以太网地址来确定目的接口的,设备驱动程序从不检查 IP数据报中的目的IP地址。ARP(地址解析)模块的功能为这两种不同的地址形式提供映射:32位的 IP地址和 48位的以太网地址

    (一)ARP报文各字段含义:

    ARP报文字段总共有28个字节
    1.硬件类型:占2个字节,表明ARP实现在何种类型的网络上。
    Ø 值为1:表示以太网。
    2.协议类型:占2个字节表示要映射的协议地址类型。
    Ø IP:0800
    3.硬件地址长度:占1个字节,表示 MAC地址长度,其值为6个字节。
    4.协议地址长度:占1个字节,表示IP地址长度,此处值4个字节
    5.操作类型 :占2个字节,表示ARP数据包类型。
    Ø 值为1表示ARP请求。
    Ø 值2表示ARP应答。
    6.源MAC地址:占6个字节,表示发送端MAC地址
    7.源IP地址:占4个字节,表示发送端IP地址
    8.目的以太网地址:占6个字节,表示目标设备的MAC物理地址
    9.目的IP地址:占4个字节,表示目标设备的IP地址.
    注意:在ARP操作中,有效数据的长度为28个字节,不足以太网的最小长度46字节长度,需要填充字节,填充字节最小长度为18个字节

    (二)ARP请求分组或应答分组

    以太网首部总共有14字节数据,arp请求报文总共有28字节。所以一个ARP请求分组或应答分组总共有46字节数据。
    而以太网数据包的最小数据为60字节。所以,要对其进行填充。
    这里有一些重复信息
    1. 在以太网的数据帧报头中和ARP请求数据帧中都有发送端的MAC物理地址。
    2. 在发送ARP请求时,以太网帧头中的目的MAC物理地址为FF-FF-FF-FF-FF-FF,而在ARP帧中的目的MAC处此时为空。
    3. 对一个ARP请求来说,除ARP中目的端MAC硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本地的ARP请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为2,最后发送出去。

    (三)ARP协议工作过程:

    1. 原理:(ARP协议只使用于局域网中)
    1> 在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。
    2> 在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。
    3> ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。
    4> 点对点的连接是不需要ARP协议的
    2. 工作过程:
    1> 当主机A向本局域网上的某个主机B发送IP数据报时,就先在自己的ARP缓冲表中查看有无主机B的IP地址。
    2> 如果有,就可以查出其对应的硬件地址,再将此硬件地址写入MAC帧,然后通过以太网将数据包发送到目的主机中。
    3> 如果查不到主机B的IP地址的表项。可能是主机B才入网,也可能是主机A刚刚加电。其高速缓冲表还是空的。在这中情况下,主机A就自动运行ARP。
    (1)ARP进程在本局域网上广播一个ARP请求分组。ARP请求分组的主要内容是表明:我的IP地址是192.168.0.2,我的硬件地址是00-00-C0-15-AD-18.我想知道IP地址为192.168.0.4的主机的硬件地址。
    (2)在本局域网上的所有主机上运行的ARP进行都收到此ARP请求分组。
    (3)主机B在ARP请求分组中见到自己的IP地址,就向主机A发送ARP响应分组,并写入自己的硬件地址。其余的所有主机都不理睬这个ARP请求分组。ARP响应分组的主要内容是表明:“我的IP地址是192.168.0.4,我的硬件地址是08-00-2B-00-EE-AA”,请注意:虽然ARP请求分组是广播发送的,但ARP响应分组是普通的单播,即从一个源地址发送到一个目的地址。
    (4)主机A收到主机B的ARP响应分组后,就在其ARP高速缓冲表中写入主机B的IP地址到硬件地址的映射。
    3. 事例说明:用ping说明ARP工作的原理
    假设我们的计算机IP地址是192.168.1.1,要执行这个命令:ping192.168.1.2。该命令会通过ICMP协议发送ICMP(以太网控制报文协议)数据包
    该过程需要经过下面的步骤:  
    1> 应用程序构造数据包,该示例是产生ICMP包,被提交给内核(网络驱动程序);   
    2> 内核检查是否能够转化该IP地址为MAC地址,也就是在本地的ARP缓存中查看IP-MAC对应表;
    3> 如果存在该IP-MAC对应关系,那么跳到步骤<7;
    如果不存在该IP-MAC对应关系,那么接续下面的步骤;
    4> 内核进行ARP广播,目的MAC地址是FF-FF-FF-FF-FF-FF,ARP命令类型为REQUEST(1),其中包含有自己的MAC地址;   
    5> 当192.168.1.2主机接收到该ARP请求后,就发送一个ARP的REPLY(2)命令,其中包含自己的MAC地址;   
    6> 本地获得192.168.1.2主机的IP-MAC地址对应关系,并保存到ARP缓存中;   
    7> 内核将把IP转化为MAC地址,然后封装在以太网头结构中,再把数据发送出去;  
    4. 特殊情况:
    ARP是解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题。如果所要找的目标设备和源主机不在同一个局域网上。
    1>此时主机A就无法解析出主机B的硬件地址(实际上主机A也不需要知道远程主机B的硬件地址);
    2>此时主机A需要的是将路由器R1的IP地址解析出来,然后将该IP数据报发送给路由器R1.
    3>R1从路由表中找出下一跳路由器R2,同时使用ARP解析出R2的硬件地址。于是IP数据报按照路由器R2的硬件地址转发到路由器R2。
    4>路由器R2在转发这个IP数据报时用类似方法解析出目的主机B的硬件地址,使IP数据报最终交付给主机B.
    说明:
    Ø 如果你的数据包是发送到不同网段的目的地,那么就一定存在一条网关的IP-MAC地址对应的记录。   
    Ø 知道了ARP协议的作用,就能够很清楚地知道,数据包的向外传输很依靠ARP协议,当然,也就是依赖ARP缓存。要知道,ARP协议的所有操作都是内核自动完成的,同其他的应用程序没有任何关系。同时需要注意的是,ARP协议只使用于本网络。

    (四)ARP缓冲表和TTL

    1. ARP缓冲表
    1> ARP协议的本质是完成网络地址到物理地址的映射。从概念上将就是找到一个映射方法f,使得“物理地址 = f(网络地址)“。物理地址有两种基本类型:以太网类型和令牌环网类型。网络地址特指IP地址,对映射方法的要求就是高效。具体到以太网,它使用的是动态绑定转换的方法。一般是设置ARP高速缓存,通过学习,老化,更新,溢出算法处理ARP映射表来解决这些问题。
    Ø 学习指ARP收到任何指向本结点IP地址的ARP/IP包,从中提取出地址对,当ARP缓冲表中无对应项时,由ARP接收部分添加;
    Ø 老化指为每项设置寿命域,以便代谢掉陈旧的地址映射项;
    Ø 更新指ARP提取到新的地址对时,用其更新缓存里已有的对应项;
    Ø 溢出算法指当缓存慢时,采取何种方法替代旧有的地址对。
    2> ARP缓存表由状态,寿命,IP地址,MAC地址4个字段组成。状态字段指示地址对是否有效;寿命字段用于老化操作,初始存入最大值,以后由OS时间函数调用,每秒减1,直至为0清除;IP地址和MAC地址字段保存网络地址和物理地址的映射。围绕ARP缓存表,完成了4种操作:学习,老化,更新,表满处理。
    3> 当ARP被询问一个已只IP地址节点的MAC地址时,先在ARPcache 查看
    l 若存在,就直接返回MAC地址,
    l 若不存在,才发送ARP request向局域网查询。
    4> 当主机A向B发送数据报时,很可能以后不久主机B还要向A发送数据报,因而主机B可能要向A发送ARP请求分组。
    所以,为了减少网络上的通信量,主机A在发送其ARP请求分组时,就将自己的IP地址到硬件地址的写入主机B自己的ARP高速缓冲表中。这对主机B以后向A发送数据报时就更方便了。
    Tiger 说明:
    任何事物都有两面性,如果掌握的好它就是天使,如果掌握的不好它就是Satan,ARP中的缓冲表为计算机之间的通信效率和减少网络通信量之间作出了巨大的贡献,但是它同时为我们上网时留下了安全隐患;例如交换机嗅探(在下面会有介绍)
    2. ARP中的TTL(即上面所说的寿命域)
    ARP将保存在高速缓冲表中的每一个映射地址表项都设置了TTL(生存时间),只要TTL小于0的项目就从高速缓冲表中删除掉。
    (ARP的超时值一般为20分钟,对不完整的表项设置为20分钟,而对不完整的表项设置为2分钟《不完整的表项:即在以太网上对一个不存在的主机发出ARP请求》,当这些表项再次使用时,这些实现一般都把超时值重新设为20分钟。)
    好处:主机A和B通信。A的ARP高速缓冲表里保存有B的物理地址。但B的网卡突然坏了,B立即就更换了一块,因此B的硬件地址就改变了。A还要和B继续通信。A在其ARP缓冲表中查找到B原先的硬件地址,并使用该硬件地址向B发送数据帧。但B原先的硬件地址已经失效了。因此A无法找到主机B。但是过了一段时间,A的ARP高速缓冲表中已经删除了B原先的硬件地址(因为它的生存时间到了),于是A重新光播发送ARP请求分组,又找到了B。

    (五)ARP命令:

    1. 使用arp-a命令就可以查看本地的ARP缓存内容,所以,执行一个本地的PING命令后,ARP缓存就会存在一个目的IP的记录了。
    2. 使用arp –d来删除ARP高速缓存中的某一项内容
    3. 使用arp –s来增加高速缓冲表中的内容,这个命令需要主机名和以太网地址。新增加的内容是永久性的,除非在命令行的末尾加上关键字temp。
    arp –s 157.55.85.212 00-aa-aa-562-c6-09
    增加一个静态的ARP表项。
    4. arppub –s:使系统起着主机ARP代理功能。系统将回答与主机名对应的IP地址的ARP请求。

    (六)ARP其他方面

    1.交换网络的嗅探
    1>1.ARP协议并不只在发送了ARP请求才接收ARP应答
    当计算机接收到ARP应答数据包的时候,就会对本地的ARP缓存进行更新,将应答中的IP和MAC地址存储在ARP缓存中。
    因此,在上面的假设网络中,B向A发送一个自己伪造的ARP应答,而这个应答中的数据为发送方IP地址是192.168.10.3(C的IP地址),MAC地址是DD-DD-DD-DD-DD-DD(C的MAC地址本来应该是CC-CC-CC-CC-CC-CC,这里被伪造了)。当A接收到B伪造的ARP应答,就会更新本地的ARP缓存,将本地的IP-MAC对应表更换为接收到的数据格式,由于这一切都是A的系统内核自动完成的,A可不知道被伪造了。ARP欺骗的主要用途就是进行在交换网络中的嗅探。
    2.IP地址冲突
    1>如果网络中存在相同IP地址的主机时候,就会报告出IP地址冲突的警告。
    2>如何产生?
    Ø 比如某主机B规定IP地址为192.168.0.1,如果它处于开机状态,那么其他机器A更该IP地址为192.168.0.1就会造成IP地址冲突。
    Ø 其原理是:主机A在连接网路(或更改IP地址)的时候就会向网络发送ARP包广播自己的IP地址,也就是free arp(免费ARP).如果网络中存在相同IP地址的主机B,那么B就会通过ARP来reply该地址,当A接收到这个reply后,A就会跳出IP地址冲突的警告,当然B也会有警告。因此用ARP欺骗可以来伪造这个ARPreply,从而使目标一直遭受IP地址冲突警告的困扰。
    3.阻止目标的数据包通过网关
    1>比如在一个局域网内通过网管上网,那么连接外部的计算机上的ARP缓存中就存在网管IP-MAC对应记录
    2>如果,该记录被更改,那么该计算机向外发送的数据包总是发送到了错误的网关硬件地址上,这样,该计算机就不能上网了。
    3>这里也主要是通过ARP欺骗进行的。有两种方法达到这样的目的:
    Ø 向目标发送伪造的ARP应答数据包,其中发送方的IP地址为网管的地址,而MAC地址则为一个伪造的地址。当目标接收到ARP包,那么就更新自身的ARP缓存。如果该欺骗一直持续下去,那么目标的网管缓存一直是一个被伪造的错误记录。不过,如果使用arp –a,就知道问题所在了。
    Ø 第二种方法是欺骗网管。向网管发送伪造的ARP应答数据包,其中发送方的IP地址为目标的IP地址,而MAC地址则为一个伪造的地址。这样,网管上的目标ARP记录就是一个错误的,网管发送给目标的数据报都是使用了错误的MAC地址。这种情况下,目标能够发送数据到网管,却不能接收到网管的任何数据。同时,目标自己查看arp –a却看不出任何问题来。
    4.通过检测混杂模式节点
    1>在混杂模式中,网卡进行包过滤不同于普通模式。本来在普通模式下,只有本地地址的数据包或者广播(多播等)才会被网卡提交给系统核心,否则的话,这些数据包就直接被网卡抛弃。现在,混合模式让所有经过的数据包都传递给系统核心,然后被sniffer等程序利用。   
    2>通过特殊设计的ARP请求可以用来在一定程度上检测处于混杂模式的节点,比如对网络中的每个节点都发送MAC地址为FF-FF-FF-FF-FF-FE的ARP请求。对于网卡来说这不是一个广播地址(FF-FF-FF-FF-FF-FF),所以处于普通模式的节点就会直接抛弃该数据包,但是多数操作系统核心都认为这是一个广播地址,如果有一般的sniffer程序存在,并设置网卡为混杂模式,那么系统核心就会作出应答,这样就可以判断这些节点是否存在嗅探器了。
    3>可以查看,很多基于ARP的攻击都是通过ARP欺骗实现的。至于ARP欺骗的防范,还是尽可能使用静态的ARP。对于WIN,使用arp-s来进行静态ARP的设置。
    当然,如果能够完全使用静态的IP+MAC对应,就更好了,因为静态的ARP缓存只是相对的。当然,可以有一些方法来实现ARP欺骗的检测。设置一个ARP的嗅探器,其中维护着一个本地网络的IP-MAC地址的静态对应表,查看所有经过的ARP数据,并检查其中的IP-MAC对应关系,如果捕获的IP-MAC对应关系和维护的静态对应关系对应不上,那么就表明是一个欺骗的ARP数据包了。


    四、电脑本机的子网掩码工作过程(我猜测)

    网卡收到第三层数据包(仅含有IP地址)后,要对其进行帧封装,以便通过第二层链路层发送出去,此时需要填充目的地址的mac地址。

        首先判断目的IP地址是否在本子网内(通过子网掩码判断),如果是,则在arp缓存中查找(或查找不到时启动arp协议询问),如果找到则填充目的mac地址,并通过网卡发到直连的交换机上(或集线器或路由器一端),以后数据包就由交换机或路由器负责传输下去了,如果找不到,说明本子网内根本不存在此目的ip地址,即要发往的地址不存在,则返回超时错误。

        然后判断出IP地址不在本子网内,则找到本机的默认网关的IP地址,表明应该先把该数据包发往默认网关机器上,此时利用arp协议查找默认网关IP地址对应的默认网关机器的mac地址,然后把数据包填充上默认网关机器的mac地址,然后发网路由器,因为此时的数据帧的目的mac地址写的是默认网关的mac地址,交换机(或路由器)接收的数据包后,会发往默认网关机器。以后数据包就由默认网关继续往下传输了。

    展开全文
  • 探索数据包的传输过程,以直白的语言讲述数据包传输的整个过程,一本书完整的讲述了整个网络通信原理,强烈推荐给想学习网络通信、数据包传输原理的开发者们
  • 数据包传输过程

    千次阅读 2018-03-01 15:52:19
    数据包是如何在网络传输的我们电脑上的数据,是如何“走”到远端的另一台电脑的呢?这是个最基础的问题,可能很多人回答不上来,尽管我们每天都在使用网络。这里我们以一个最简单的“ping”命令,来解释一个数据包...

    数据包是如何在网络中传输的

    我们电脑上的数据,是如何“走”到远端的另一台电脑的呢?这是个最基础的问题,可能很多人回答不上来,尽管我们每天都在使用网络。这里我们以一个最简单的“ping”命令,来解释一个数据包“旅程”。

        假设:我的电脑A,向远在外地的朋友电脑B传输数据,最简单的就是“ping”一下,看看这个家伙的那一端网络通不通。A与B之间只有一台路由器。(路由器可能放在学校,社区或者电信机房,无所谓,基本原理是一样的)

    具体过程如下------
        1.“ping”命令所产生的数据包,我们归类为ICMP协议。说白了就是向目的地发送一个数据包,然后等待回应,如果回应正常则目的地的网络就是通的。当我们输入了“ping”命令之后,我们的机器(电脑A)就生成了一个包含ICMP协议域的数据包,姑且称之为“小德”吧~~~~

        2.“小德”已经将ICMP协议打包到数据段里了,可是还不能发送,因为一个数据要想向外面传送,还得经过“有关部门”的批准------IP协议。IP要将你的“写信人地址”和“收信人地址”写到数据段上面,即:将数据的源IP地址和目的IP地址分别打包在“小德”的头部和尾部,这样一来,大家才知道你的数据是要送到哪里。

        3.准备工作还没有完。接下来还有部门要审核------ARP。ARP属于数据链路层协议,主要负责把IP地址对应到硬件地址。直接说吧,都怪交换机太“傻”,不能根据IP地址直接找到相应的计算机,只能根据硬件地址来找。于是,交换机就经常保留一张IP地址与硬件地址的对应表以便其查找目的地。而ARP就是用来生成这张表的。比如:当“小德”被送到ARP手里之后,ARP就要在表里面查找,看看“小德”的IP地址与交换机的哪个端口对应,然后转发过去。如果没找到,则发一个广播给所有其他的交换机端口,问这是谁的IP地址,如果有人回答,就转发给它。

        4.经过一番折腾,“小德”终于要走出这个倒霉的局域网了。可在此之前,它们还没忘给“小德”屁股后面盖个“戳”,说是什么CRC校验值,怕“小德”在旅行途中缺胳膊少腿,还得麻烦它们重新发送。。。。。我靠~~~~注:很多人弄不清FCS和CRC。所谓的CRC是一种校验方法,用来确保数据在传输过程中不会丢包,损坏等等,FCS是数据包(准确的说是frame)里的一个区域,用来存放CRC的计算结果的。到了目的地之后,目的计算机要检查FCS里的CRC值,如果与原来的相同,则说明数据在途中没有损坏。

        5.在走出去之前,那些家伙最后折磨了一次“小德”------把小德身上众多的0和1,弄成了什么“高电压”“低电压”,在双绞线上传送了出去。晕~~出趟门就这么麻烦吗?

        6.坐着双绞线旅游,爽!可当看到很多人坐着同轴电缆,还有坐光纤的时候,小德又感觉不是那么爽了。就在这时,来到了旅途的中转站------路由器。这地方可是高级场所,人家直接查看IP地址!剩下的一概不管,交给下面的人去做。够牛吧?路由器的内部也有一张表,叫做路由表,里面标识着哪一个网络的IP对应着路由器的哪一个端口。这个表也不是天生就有的,而是靠路由器之间互相“学习”之后生成的,当然也可以由管理员手工设定。这个“学习”的过程是依靠路由协议来完成的,比如RIP,EIGRP,OSPF等等。

        7.当路由器查看了“小德”的IP地址以后,根据路由表知道了小德要去的网络,接着就把小德转到了相应的端口了。至此,路由器的主要工作完成,下面又是打包,封装成frame,转换成电压信号等一系列“折腾”的活,就由数据链路层和物理层的模块去干吧。

        8.小德从路由器的出口出来,便来到了目的地----电脑B----所属的网络的默认网关。默认网关可以是路由器的一个端口,也可以是局域网里的各种服务器。不管怎样,下面的过程还是一样的:到交换机里的ARP表查询“小德”的IP地址,看看属于哪个局域网段或端口,然后就转发到B了。

        9.进了B的网卡之后,还要层层“剥皮”,基本上和从A出来的程序是一样的------电脑B先校验一下CRC值,看看数据是否完整;然后检查一下frame的封装,看到是IP协议之后,就把“小德”交给IP“部门”了;IP协议一看目的地址,正确,再看看应用协议,是ICMP。于是知道了该怎么做了------产生一个回应数据包,(可以命名为“回应小德”),并准备以同样的顺序向远端的A发送。。至于刚刚收到的那个数据包就丢弃了。

        10.“回应小德”这个数据包又开始了上述同样的循环,只不过这次发送者是B而接收者是A了。

        以上是一个最简单的路由过程,任何复杂的网络都是在次基础之上实现的。

     

    二、网络中 IP数据报传输的过程伪代码【有助于理解】

    IP数据报需从主机A上传送到主机B上,主机A首先查找路由表;
    if(目的主机是与自己在同一个网段内)
    {
        主机A查询自己的ARP表;
        if(有该目的IP地址对应的MAC地址的记录)
        {
    将该MAC地址作为目的MAC地址,封装数据帧,传送给主机B;
        }
        else
        {
              发送一个ARP请求广播给网段内的所有主机,来查询该目的IP地址的MAC地址;
    收到ARP请求报文的各个主机如果发现该IP地址是自己的IP地址,则返回一个ARP应答报文告诉主机A自己的MAC地址;
    如果发现不是自己的IP地址,则丢弃该报文。
    主机A收到这个应答报文后,就按照返回的MAC地址,将IP数据包封装成帧,然后发送到主机B上;
    (补充:一般为了减少网络中的报文量,通信双方会维护一个各自的ARP表,把一次通信中获得IP MAC地址对保存在缓冲的ARP表中,但是ARP有一个老化机制,删除一段时间内不用的IP MAC地址对。)
        }
    }
    else if(发现了能与目的网络号相匹配的表目)
    {
    则把报文发给改表目指定的下一站的路由器或直接连接的网络接口;
    报文发送到下一站时,数据帧的目的MAC地址是下一个站路由器或者网络接口的MAC地址,而IP头部的目的IP地址是主机B的IP地址;
    这里要指出的是:ARP请求报文以下一站路由器或网络接口的IP地址为目的IP地址,寻找真的目的MAC地址。换句话,ARP请求报文只负责IP据报传输过程中每一跳中的目的MAC地址查询。
    }
    else
    {
    寻找标为“默认”的表目,把报文发送给该表目指定的下一站路由器;
    报文发送到下一站时,数据帧的目的MAC地址是下一个站路由器的MAC地址,而IP头部的目的IP地址是主机B的IP地址。
    }

    数据帧在每两个网络设备间传递时,是转换成bit流在传输媒体上传输。链路层提供了如停止等待协议等机制,控制了bit流在传输媒体上的无措传输。

    (三)ARP协议工作过程:

    1. 原理:(ARP协议只使用于局域网中)
    1> 在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。
    2> 在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。
    3> ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。
    4> 点对点的连接是不需要ARP协议的
    2. 工作过程:
    1> 当主机A向本局域网上的某个主机B发送IP数据报时,就先在自己的ARP缓冲表中查看有无主机B的IP地址。
    2> 如果有,就可以查出其对应的硬件地址,再将此硬件地址写入MAC帧,然后通过以太网将数据包发送到目的主机中。
    3> 如果查不到主机B的IP地址的表项。可能是主机B才入网,也可能是主机A刚刚加电。其高速缓冲表还是空的。在这中情况下,主机A就自动运行ARP。
    (1)ARP进程在本局域网上广播一个ARP请求分组。ARP请求分组的主要内容是表明:我的IP地址是192.168.0.2,我的硬件地址是00-00-C0-15-AD-18.我想知道IP地址为192.168.0.4的主机的硬件地址。
    (2)在本局域网上的所有主机上运行的ARP进行都收到此ARP请求分组。
    (3)主机B在ARP请求分组中见到自己的IP地址,就向主机A发送ARP响应分组,并写入自己的硬件地址。其余的所有主机都不理睬这个ARP请求分组。ARP响应分组的主要内容是表明:“我的IP地址是192.168.0.4,我的硬件地址是08-00-2B-00-EE-AA”,请注意:虽然ARP请求分组是广播发送的,但ARP响应分组是普通的单播,即从一个源地址发送到一个目的地址。
    (4)主机A收到主机B的ARP响应分组后,就在其ARP高速缓冲表中写入主机B的IP地址到硬件地址的映射。
    3. 事例说明:用ping说明ARP工作的原理
    假设我们的计算机IP地址是192.168.1.1,要执行这个命令:ping192.168.1.2。该命令会通过ICMP协议发送ICMP(以太网控制报文协议)数据包
    该过程需要经过下面的步骤:  
    1> 应用程序构造数据包,该示例是产生ICMP包,被提交给内核(网络驱动程序);   
    2> 内核检查是否能够转化该IP地址为MAC地址,也就是在本地的ARP缓存中查看IP-MAC对应表;
    3> 如果存在该IP-MAC对应关系,那么跳到步骤<7;
    如果不存在该IP-MAC对应关系,那么接续下面的步骤;
    4> 内核进行ARP广播,目的MAC地址是FF-FF-FF-FF-FF-FF,ARP命令类型为REQUEST(1),其中包含有自己的MAC地址;   
    5> 当192.168.1.2主机接收到该ARP请求后,就发送一个ARP的REPLY(2)命令,其中包含自己的MAC地址;   
    6> 本地获得192.168.1.2主机的IP-MAC地址对应关系,并保存到ARP缓存中;   
    7> 内核将把IP转化为MAC地址,然后封装在以太网头结构中,再把数据发送出去;  
    4. 特殊情况:
    ARP是解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题。如果所要找的目标设备和源主机不在同一个局域网上。
    1>此时主机A就无法解析出主机B的硬件地址(实际上主机A也不需要知道远程主机B的硬件地址);
    2>此时主机A需要的是将路由器R1的IP地址解析出来,然后将该IP数据报发送给路由器R1.
    3>R1从路由表中找出下一跳路由器R2,同时使用ARP解析出R2的硬件地址。于是IP数据报按照路由器R2的硬件地址转发到路由器R2。
    4>路由器R2在转发这个IP数据报时用类似方法解析出目的主机B的硬件地址,使IP数据报最终交付给主机B.
    说明:
    Ø 如果你的数据包是发送到不同网段的目的地,那么就一定存在一条网关的IP-MAC地址对应的记录。   
    Ø 知道了ARP协议的作用,就能够很清楚地知道,数据包的向外传输很依靠ARP协议,当然,也就是依赖ARP缓存。要知道,ARP协议的所有操作都是内核自动完成的,同其他的应用程序没有任何关系。同时需要注意的是,ARP协议只使用于本网络。
    展开全文
  • 数据包嗅探原理介绍

    2020-07-21 12:55:51
    首先介绍了网卡的工作原理,嗅探需要网卡的工作模式(杂乱模式/监控模式)。 为了提早过滤过滤不需要的数据包,介绍了BPF。 接着用三种方式:普通套接字,原生套接字,pcap API,递进的讲述了包的嗅探过程。

    0. 前言

    来源:《Computer Security》A Hands-on Approach — Wenliang Du

    所有的代码/文档见github:https://github.com/da1234cao/computer_security

    chapter 12 Packet sniffing and spoffing.

    这一章有点硬核。知识点不难,但对socket编程有点要求。

    我看过《unix网络编程》第一卷 前五章 ,背景知识还是相当欠缺。这章内容虽然看完,基本明白,但距离实际动手完成一个简单的有线/无线嗅探工具还挺远。本文,暂时仅仅看看书上的嗅探实现。


    1. 摘要与总结

    首先介绍了网卡的工作原理,嗅探需要网卡的工作模式(杂乱模式/监控模式)。

    为了提早过滤过滤不需要的数据包,介绍了BPF。

    接着用三种方式:普通套接字,原生套接字,pcap API,递进的讲述了包的嗅探过程。


    2. 包(Packet)的接收

    2.1 网卡

    参考文章:网卡工作原理详解关于网络的混杂模式实战无线网络分析(篇一)无线监听

    简单了解下:

    网卡(Network Interface Card,NIC)是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件。每块网卡有一个硬件地址,被称为MAC地址;网卡接入网络,使得用户可以通过电缆或无线相互连接;用户A要发送信息给B,通过电缆或者无线进行广播;每一块网卡都将广播的内容拷贝到自己的网卡内存中,检查头部信息中的MAC地址,判断是否是发送给自己的。如果是则将其拷贝进入内存,否则丢弃;因为MAC唯一,所以最后只有B接受了用户A的信息。

    维基百科:混杂模式(promiscuous mode)。一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序。网卡的混杂模式一般在网络管理员分析网络数据作为网络故障诊断手段时用到,同时这个模式也被网络黑客利用来作为网络数据窃听的入口。在Linux操作系统中设置网卡混杂模式时需要管理员权限。在Windows操作系统和Linux操作系统中都有使用混杂模式的抓包工具,比如著名的开源软件Wireshark。

    监控模式(monitor mode)。 类似于有线网络的混杂模式。 无线网卡在监视模式下运行时支持嗅探。 与以太网不同,无线设备面临附近其他设备的干扰。 这将严重阻碍网络连接的性能。 为解决此问题,WIFI设备在不同的信道上传输数据。接入点将附近的设备连接到不同的信道,以减少它们之间的干扰影响。 Wifi网卡还设计为在整个可用带宽和通道的片上进行通信。 将这些卡置于监视模式时,它们将捕获802. 1I帧,这些帧在它们正在侦听的通道上传输。 这意味着,与以太网不同,无线网卡可能会丢失同一网络上的信息,因为它位于不同的信道上。 大多数无线网卡不支持监视器模式或制造商禁用了该模式。


    2.2 (BSD Packet Filter)BPF

    参考文章:BPF与eBPF

    这个参考文章我没懂。目前大概知道怎么回事就好。后面使用pcap API会用到这里的概念。

    嗅探网络流量时,嗅探器只对某些类型的数据包感兴趣,例如TCP数据包或DNS查询数据包,这是很常见的。系统可以将所有捕获的数据包提供给嗅探器程序,后者可以丢弃不需要的数据包。这是非常低效的,因为处理这些不需要的数据包并将其从内核传送到嗅探器应用程序需要花费时间。当有很多不需要的数据包时,浪费的时间相当可观。最好尽早过滤这些不需要的数据包

    随着对数据包捕获的需求的增加,Unix操作系统定义了BSD数据包过滤器(BSD Packet Filter,BPF)以支持较低级别的过滤。 BPF允许用户空间程序将过滤器附加到套接字,这实际上是告诉内核尽早丢弃不需要的数据包。过滤器通常使用布尔运算符以人类可读的格式编写,并被编译为伪代码并传递给BPF驱动程序。然后由BPF伪机(一个专门为数据包过滤设计的内核级状态机)解释该低级代码。


    3. 包的嗅探

    3.1 通常套接字编程接收包

    /**
     * 作用:将进入服务器所有IP的9090端口的UDP内容,输出。
     * 
     * 准备:
     * 一个套接字描述符:scoket函数,指定期望的通信协议类型
     * 一个监听套接字:指定协议族,ip,端口
     * bind:将一个本地协议地址赋予一个套接字(描述符)
     * recvfrom:接受经指定的socket 传来的数据,放入buf --》准备个buffer,一个客户端套接字,套接字长度
     * 
     * 头文件:
     * netinet/in.h 定义了ip地址结构 struct sockaddr_in (struct in_addr作为sockaddr_in 的成员) 
     *                 还有函数 htons等,以及一些宏。
     * sys/socket.h 定义了一些列的socket API函数 如 
     *              socket(),bind() listen() , send() ,sendmsg(),setsockopt(),等等。
     * unistd.h close函数
     * 
     * 验证:echo "Hello World\!" | nc -4u  127.0.0.1 9090
    */
    
    #include <stdio.h>
    #include <string.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <errno.h>
    #include <unistd.h>
    
    int main(void){
        int sock;
        struct sockaddr_in server;
        int client_len;
        struct sockaddr_in client;
        char buf[1000];
    
        // IPV4,数据包套接字,UDP传输协议
        sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
        if(sock <= 0){
            perror("error in socket");
            return -1;
        }
    
        // 用这个初始化为零,比memset函数少一个参数
        // sockaddr_in结构体中sin_zero,还没用;整个结构体用之前,我们全部初始化为零
        // IPv4协议族,监听该服务器上所有IP的9090端口
        // 按照网络标准转化字节序
        bzero(&server,sizeof(server));
        server.sin_family = AF_INET;
        server.sin_addr.s_addr = htonl(INADDR_ANY);
        server.sin_port = htons(9090);
    
        // 将一个本地协议地址赋予一个套接字(描述符)
        if( bind(sock,(struct sockaddr *)&server,sizeof(server)) < 0){
            perror("error in bind");
            return -1;
        }
    
        while (1){
            bzero(buf,sizeof(buf));
            // 进入一个慢系统调用;
            recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr *)&client,&client_len);
            printf("%s",buf);
        }
        
        close(sock);
    
        return 0;
    }
    
    
    

    3.2 使用原生套接字接收包

    上面的程序只能接收预定的数据包。 如果目标IP地址是另一台计算机,或者目标端口号不是该程序注册的计端口,则该程序将无法获取数据包。 嗅探器程序需要捕获网络电缆上流动的所有数据包,而不管目标IP地址或端口号如何。这可以使用一种称为原始套接字的特殊类型的套接字来完成。 下面的程序显示了一个使用原始套接字的简单嗅探程序。 除了设置原始套接字,程序的其余部分与普通套接字程序非常相似。

    /**
     * 目的:使用原生套接字+混杂模式,获取该局域网中所有包
     * 
     * 原生套接字:SOCK_ROW + ETH_P_ALL,所有协议的包都将传递给raw socket。
     * 
     * 混杂模式:设置socket可选参数PACKET_ADD_MEMBERSHIP选项,
     * 使用packet_mreq结构体指定一个**以太网接口**和混杂模式行为(PACKET_MR_PROMISC)。
     * 
     * 头文件:
     * sys/socket.h 定义了一些列的socket API函数 如 socket(),bind(),listen(),
     *              send(),sendmsg(),setsockopt(),等等。
     * netinet/in.h 定义了ip地址结构 struct sockaddr_in (struct in_addr作为sockaddr_in 的成员) 
     *                 还有函数 htons等,以及一些宏。
     * linux/if_packet.h 原始数据包的数据结构定义
     * net/ethernet.h 包括几个以太网的数据结构
     * 
     * errno.h 有一个 errno 宏,它就用来存储错误代码
     * unistd.h close函数      
     * arpa/inet.h     inet_ntop函数
    */
    
    #include <stdio.h>
    #include <string.h>
    
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <linux/if_packet.h>
    #include <net/ethernet.h>
    
    #include <unistd.h>
    #include <arpa/inet.h>  
    
    int main(void){
        
        // 创建一个原生套接字,返回套接字描述符
        // 原生套接字:发送给本机的包都能收到,不进行过滤。
        // 它仅仅是一份副本,包含头部,不影响原来packet到到协议栈。
        int sock = socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
        if(sock <= 0){
            perror("error in socket");
            return -1;
        }
    
        // 打开以太网卡的混杂模式
        // 无线网卡怎么打开监听模式,我还不知道
        struct packet_mreq mr;
        mr.mr_type = PACKET_MR_PROMISC;
        setsockopt(sock,SOL_PACKET,PACKET_ADD_MEMBERSHIP,&mr,sizeof(mr));
    
        // 抓取包
        // 为什么PACKET_SIZE设置512?
        int PACKET_SIZE = 512; 
        char buf[PACKET_SIZE];
        struct sockaddr_in client;
        int client_len;
        while (1){
            
            int receive_date_size = recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr *)&client,&client_len);
            printf("receive data size : %d\n",receive_date_size);
    
            // if( ntohs(client.sin_port) == 1080 ){
            //     bzero(buf,sizeof(buf));
            //     // 1.0.0.0:2048 、 3.0.0.0:2048
            //     printf("receive data size : %d\n",receive_date_size);
            //     printf("client address is %s:%d\n",inet_ntop(AF_INET,&client.sin_addr,buf,sizeof(client)), 
    	 	// 								ntohs(client.sin_port));
            // }
    
        }
        
        close(sock);
        return 0;
    }
    

    3.3 使用pcap API接收包

    参考文章:Linux 网络编程—— libpcap 详解 、man 3 pacp

    sudo apt-get install -y libpcap-dev
    

    上面的程序是一个非常简单的嗅探器程序,它没有显示如何设置数据包过滤器。 如果确实要设置一些过滤器,则必须使用另一个带有SO_ATTACH_FIIIER选项名称的setsockeopt() call。 这样的程序不能跨不同的操作系统移植。 此外,我们的简单程序不会探索任何优化来提高其性能; 在网络繁忙的网络中,我们简单的嗅探器程序可能无法捕获所有数据包。 有许多优化措施可以使数据包嗅探器更快,更高效。

    因此创建了pcap(package capture)API,以提供独立于平台的接口,以有效地访问操作系统的数据包捕获工具。 pcap的功能之一是允许程序员使用人类可读的布尔表达式指定过滤规则的编译器。 编译器将表达式转换为BPF伪代码,内核可以使用该伪代码。 pcap API在Unix中以libpcap的形式实现,在Windows中以Winpcap的形式实现。 在Linux中,pcap是使用原始套接字实现的。

    #include <stdio.h>
    #include <pcap.h>
    #include <netinet/ip.h>
    #include <arpa/inet.h>
    #include <net/ethernet.h> 
    
    // 用户传入的参数,抓取的包的头部,抓取的包
    void got_packet(__u_char *args,const struct pcap_pkthdr *header,const __u_char *packet){
        struct ether_header *etheader = (struct ether_header *)packet;
        printf("etheader->ether_type is :%hu",etheader->ether_type);
        // IPv4以太类型
        if(etheader->ether_type == 0x0800){
            // 跨过以太网帧头部,指向IP包头
            // struct ip *ipheader = (struct ip *)(packet + sizeof(struct ether_header) - 2);
            struct ip *ipheader = (struct ip *)(packet + sizeof(struct ether_header));
            // printf("src ip is : %s",inet_ntop())
            printf("src ip is : %s\n",inet_ntoa(ipheader->ip_src));
            printf("des ip is : %s\n\n",inet_ntoa(ipheader->ip_dst));
    
            // struct iphdr *ipheader = (struct iphdr *)(packet + sizeof(struct ether_header));
    
            switch (ipheader->ip_p){
            case IPPROTO_TCP:
                printf("Protocal : TCP\n");
                break;
            case IPPROTO_UDP:
                printf("Protocal : UDP\n");
                break;
            case IPPROTO_ICMP:
                printf("Protocal : ICMP\n");
                break;
            default:
                printf("Uknow Protocal\n");
            }
        }
    
        return;
    }
    
    
    int main(void){
        // 获取网络接口设备名
        char error_content[PCAP_ERRBUF_SIZE] = {0};	// 出错信息
        char *dev = pcap_lookupdev(error_content);
        if(NULL == dev){
            printf("error_content:%s\n",error_content);
            return -1;
        }
        printf("dev:%s\n",dev);
    
        //获得网络号和掩码
        bpf_u_int32 netp = 0, maskp = 0;
        int ret = 0;
        ret = pcap_lookupnet(dev, &netp, &maskp, error_content);
        if(ret == -1){
            printf("error_content:%s\n",error_content);
            return -1;
        }
        printf("netp: %u  maskp: %u\n",netp,maskp); //无符号32位,对应一个IPv4
    
        // 打开网络接口
        /** dev:网络设备;BUFSIZ捕获的数据包长度,不能超多65535字节;1” 代表混杂模式
         * 指定需要等待的毫秒数,0 表示一直等待直到有数据包到来;
        */
        pcap_t * pcap_handle = pcap_open_live(dev, BUFSIZ, 1, 0, error_content);
        if(pcap_handle == NULL)
        {
            printf("error_content:%s\n",error_content);
            return -1;
        }
    
        // 添加一个过滤器
        // 过滤规则:filter_exp;不优化;指定子网掩码
        // char filter_exp[] = "ip proto icmp";
        char filter_exp[] = "dst host 10.0.2.5";
        struct bpf_program fp;
        pcap_compile(pcap_handle,&fp,filter_exp,0,maskp);
        pcap_setfilter(pcap_handle,&fp);
    
        // 循环捕获网络数据包,直到遇到错误或者满足退出条件。
        pcap_loop(pcap_handle,-1,got_packet,error_content);
    
        // free up allocated memory pointed to by a bpf_program -  
        // struct generated by pcap_compile() when that BPF program is no longer needed
        pcap_freecode(&fp);
    
        // 关闭handle
        pcap_close(pcap_handle);
        
        return 0;
    }
    


    悟空被压在五行山下五百年。
    在这里插入图片描述

    展开全文
  • 数据包过滤原理

    千次阅读 2013-04-08 14:56:00
     数据包过滤技术,顾名思义是在网络中适当的位置对数据包实施有选择的通过,选择依据,即为系统内设置的过滤规则(通常称为访问控制表——Access Ccntrol List),只有满足过滤规则的数据包才被转发至相应...

      数据包过滤技术是防火墙最常用的技术。对于一个充满危险的网络,过滤路由器提供了一种方法,用这种方法可以阻塞某些主机和网络连入内部网络,也可以用它来限制内部人员对一些危险和色情站点的访问。
      数据包过滤技术,顾名思义是在网络中适当的位置对数据包实施有选择的通过,选择依据,即为系统内设置的过滤规则(通常称为访问控制表——Access Ccntrol List),只有满足过滤规则的数据包才被转发至相应的网络接口,其余数据包则被从数据流中删除。
      数据包过滤可以控制站点与站点、站点与网络和网络与网络之间的相互访问,但不能控制传输的数据内容,因为内容是应用层数据,不是包过滤系统所能辨认的,数据包过滤允许你在单个地方为整个网络提供特别的保护。
      包过滤检查模块深入到系统的网络层和数据链路层之间。因为数据链路层是事实上的网卡(NIC),网络层是第一层协议堆栈,所以防火墙位于软件层次的最底层,如下图所示。

    图  包过滤模型

      通过检查模块,防火墙能拦截和检查所有出站的数据。防火墙检查模块首先验证这个包是否符合过滤规则,不管是否符合过滤规则,防火墙一般要记录数据包情况,不符合规则的包要进行报警或通知管理员。对丢弃的数据包,防火墙可以给发方一个消息,也可以不给,这要取决于包过滤策略。包检查模块能检查包中的所有信息,一般是网络层的IP头和传输层的头。包过滤一般要检查下面几项:

      IP源地址;
      IP目标地址;
      协议类型(TCP包、UDP包和ICMP包);
      TCP或UDP的源端口;
      TCP或UDP的目标端口;
      ICMP消息类型;
      TCP报头中的ACK位。
     

      包过滤在本地端接收数据包时,一般不保留上下文,只根据目前数据包的内容做决定。根据不同的防火墙的类型,包过滤可能在进入、输出时或这两个时刻都进行。可以拟定一个要接受的设备和服务的清单,一个不接受的设备和服务的清单,组成访问控制表。
          1 . 设置步骤
          配置包过滤有三步:
               (1)必须知道什么是应该和不应该被允许的,即必须制定一个安全策略。
               (2)必须正式规定允许的包类型、包字段的逻辑表达。
               (3)必须用防火墙支持的语法重写表达式。
         2. 按地址过滤
                下面是一个最简单的数据包过滤方式,它按照源地址进行过滤。比如说,认为网络202.110.8.0是一个危险的网络,那么就可以用源地址过滤禁止内部主机和该网络进行通信。下表是根据上面的政策所制定的规则。

    规则方向  源地址目标地址动作
    A内部网络202.110.8.0拒绝
    B202.110.8.0内部网络拒绝

    表:过滤规则示例      

      很容易看出这种方式没有利用全部信息,所以是不科学的,下面将要讲一种更为先进的过滤方式——按服务过滤。

         3. 按服务过滤
      假设安全策略是禁止外部主机访问内部的E-mail服务器(SMTP,端口25),允许内部主机访问外部主机,实现这种的过滤的访问控制规则类似下表。
      规则按从前到后的顺序匹配,字段中的“*”代表任意值,没有被过滤器规则明确允许的包将被拒绝。就是说,每一条规则集都跟随一条含蓄的规则,就像下表中的规则C。这与一般原则是一致的:没有明确允许的就被禁止。

    规则 方向 动作 源地址 源端口 目的地址 目的端口 注释
    A 进 拒绝 M * E-mail 25 不信任
    B 出 允许 * * * * 允许联接
    C 双向 拒绝 * * * * 缺省状态

    任何一种协议都是建立在双方的基础上的,信息流也是双向的。规则总是成对出现的,而且在讲解规则时也是成对讲解的原因。

    4.包过滤实例
      无疑按服务过滤的安全性要比单纯按地址过滤高。
      下面,将通过一个例子来讲解这种过滤方式。第一,假设处于一个类网络116.111.4.0,认为站点202.208.5.6上有黄色的BBS,所以希望阻止网络中的用户访问该点的BBS;再假设这个站点的BBS服务是通过Telnet方式提供的,那么需要阻止到那个站点的出站Telnet服务,对于Internet的其他站点,允许内部的网用户通过Telnet方式访问,但不允许其他站点以Telnet方式访问网络。第二,为了由发电子邮件,允许SMTP出站入站服务,邮件服务器是IP地址为116.111.4.1。第三,对于WWW服务,允许内部网用户访问Internet上任何网络和站点,但只允许一个公司的网络访问内部WWW服务器,内部WWW服务器的IP地址为116.111.4.5,因为你们是合作伙伴关系,那个公司的网络为98.120.7.0。

    参考:http://www.elecfans.com/dianzichangshi/2009061669433.html

    转载于:https://www.cnblogs.com/weiw/archive/2013/04/08/3007491.html

    展开全文
  • 网络数据包发送和接受原理

    千次阅读 2014-06-05 20:26:29
    一个网络数据报文的发送过程是这样的: a)发送方的应用层将要发送的数据报文,通过Socket调用提交TCP/IP层 b)TCP/IP层经过层层封装,将这些数据报文封装成IP数据报文,送往数据链路层,一般以太网用的是802.X的...
  • 数据包传输的全过程

    万次阅读 2011-11-07 18:16:05
    FTP是英文File Transfer Protocol的缩写,意思是文件传输协议。它和HTTP一样都是Internet上广泛使用的协议,用来在两台计算机之间互相传送文件。相比于HTTP,FTP协议要复杂得多。复杂的原因,是因为FTP协议要用到两...
  • 基于TCp的数据包传输过程

    万次阅读 2014-03-25 14:52:40
    HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。 浏览器(Web Browse
  • 文章简单介绍了网络通信的数据包(帧)的结构及原理
  • 计算机网络书中为了更好的解释运行原理,将TCP/IP模型改变成了五层模型,将TCP/IP四层模型中的网络接口层分为了数据链路层和物理层。 本文也采用五层模型来解释数据在网络中的传输流程。 TCP/IP五层模
  • 网络通信数据传输原理

    千次阅读 2020-04-14 21:18:17
    传输层——可靠传输,流量控制,不可靠传输(一个数据包即可,不需要建立会话,例如向DNS查询网站IP地址) 网络层——负责选择最佳路径,规划IP地址(ipv4和ipv6变化只会影响网络层) 数据链路层——帧的开始和结束,...
  • dpdk接收数据包原理分析

    万次阅读 2018-08-19 21:24:48
    dpdk接收数据包原理分析 摘要 本文对dpdk数据包捕获技术原理进行了分析,对其优缺点进行了介绍。 对使用基于EAL的应用程序进行了分析,作出了程序流程图。 引言 背景浅析 随着云计算产业的异军突起,网络...
  • 数据包是如何在网络传输

    万次阅读 2016-07-21 10:00:22
     假设:我的电脑A,向远在外地的朋友电脑B传输数据,最简单的就是“ping”一下,看看这个家伙的那一端网络通不通。A与B之间只有一台路由器。(路由器可能放在学校,社区或者电信机房,无所谓,基本原理
  • 对于连接到网络上的 Linux 系统来说,防火墙是必不可少的防御机制, 它只允许合法的网络流量进出系统,而禁止其它任何... 网络流量由 IP 信息包(或,简称 信息包)— 以流的形式从源系统传输到目的地系统的一些小块数
  • 对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所
  •   JPCAP是一个能够捕获、发送网络数据包的java类库包。这个包用到了Winpcap/Libpcap和原始套接字API,目前,JPCAP在FreeBSD 3.x、Linux RedHat 6.1、Solaris 和Microsoft Windows 2000/XP系统上已经做过测试,并且...
  • 抓包工具:用于抓取网络数据包 可用于抓取网络中传输的数据包的内容,对分析一些软件的原理
  • 数据包传输过程

    千次阅读 2012-06-28 00:45:12
    网络中数据传输过程的分析 我们每天都在使用互联网,我们电脑上的数据是怎么样通过互联网传输到到另外的一台电脑上的呢?把自己的理解写一下,可能有很多细节还没有能的很清楚!希望在以后可以使之更加的完善!有...
  • 在高速发达的计算机网络世界,网络和系统运维者每天都可能...网络数据包分析的意义 所有的网络问题或基于网络的应用问题,都源自应用的数据包,无论应用设计的有多完美,但其访问的终端可能具有很大的差别,或者应...
  • 网络数据包分析 网卡Offload

    万次阅读 2015-11-30 10:02:04
    对于网络安全来说,网络传输数据包的捕获和分析是个基础工作,绿盟科技研究员在日常工作中,经常会捕获到一些大小远大于MTU值的数据包,经过分析这些大包的特性,发现和网卡的offload特性有关,本文对网卡Offload...
  • 网络数据包拦截软件介绍

    千次阅读 2013-12-21 09:42:03
    1、Omnipeek Omnipeek是出自WindPackets的著名抓包软件,其功能与Sniffer Pro有相似之处,但是经过多年的发展,其开发环境已经...Sniffer是一种基于被动侦听原理网络分析方式。使用这种技术方式,可以监视网络状态、
  • 在写路由器时,涉及到对ARP数据包的传输和接收!本来我是打算将广播,传输,接收一块儿写完之后再来说这块儿的,但是下午突然就没心思了,明天...在看代码之前,我们首先得弄懂,ARP数据包传输原理。假设A想B发送一
  • 一个完整的网络数据包转发过程

    万次阅读 多人点赞 2018-12-13 14:23:29
    网络数据包转发过程 这篇文章讲述了上网时数据包转发的全过程,下面是电脑和网络设备连接简略图:   以PC1 ping PC3为例讲述数据包转发过程: 1、当PC1 ping PC3时,发现它们的IP不在同一网段,PC1就将数据包...
  • 互联网传输原理流程

    千次阅读 多人点赞 2018-12-12 10:10:49
    概括 五层模型 应用层 传输网络层 链路层 实体层
  • 偶尔找到“计算机网络 自顶向下方法” 一书,它从可靠数据传输的基本原理慢慢过渡到tcp协议的实现,个人觉得非常不错并且容易把握重点,因此本文也算是学习笔记。 计算机网络本身可能出现数据包受损、丢失、乱序...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,565
精华内容 29,426
关键字:

网络数据包传输原理