python网络编程(二)

网络层

  • 网络层负责获取和维护主机的IP地址,IP地址用于主机间进行网络互联的标示,网络层负责给数据包选择路由路径,也就是路由寻址
  • 负责点到点(point-to-point)的传输(这里的“点”指主机或路由器)

网络层协议

IP网际协议

  1. IP协议位于网络层,它是TCP/IP协议族中最为核心的协议,所有的上层协议如TCP、UDP数据都以IP数据包格式传输。

  2. IP协议特征:

    • 不可靠(会出现丢包的情况)
    • 无连接(数据包之间是独立的)
  3. IP协议版本:

    • IPv4:IPv4是互联网协议的第四版,也是第一个被广泛使用,构成现今互联网技术的基础协议,是TCP/IP协议簇中的核心协议

    • IPv6:IPv6是互联网协议的第六版,是新一代的互联网技术的基础协议,目前正在推广中。

  4. IPv4协议的格式:

    • 4位版本:是指IP协议的版本(IPv4、IPv6),通信双方的的版本必须一致。
    • 4位首部长:标示IP数据包的头部。
    • 8位服务类型:为了获取更好的服务用的。
    • 16位总长度(字节数):标示了首部和数据之和的长度,单位字节,所以数据包最大长度为65535字节。
    • 16位标示:用于标记数据包,使得最后相同标记的数据包可以组装成原来的数据。
    • 3位标志:用于标记当前的数据包是否需要分段传输。
    • 13位片偏移:用于指出分段传输后数据包在源数据中相对的位置。
    • 8位生存空间:英文缩写TTL,标示了数据包在网络中的寿命,由发送方设置,防止消耗网络资源。
    • 8位协议:指出数据包中的数据使用的什么协议(TCP/UDP)。
    • 16位首部检验和:标记当前的数据包是否有问题。
    • IPv4使用4个字节32个二进制位表示一个地址,通常采用点分十进制方法表示,例如192.168.1.1,也可以通过二进制表示。
    • IP地址分为两个部分:192.168.1.1中192.168.1.0为网络地址,后面的1为主机地址
  5. IP地址划分

    • A类地址(0.0.0.0 - 127.255.255.255 :00000000.00000000.00000000.00000000 - 01111111.1111111.1111111.1111111)
    • B类地址(128.0.0.0 - 191.255.255.255 :10000000.00000000.00000000.00000000 - 10111111.11111111.11111111.11111111)
    • C类地址(192.0.0.0 - 223.255.255.255 :11000000.00000000.00000000.00000000 - 11011111.11111111.11111111.11111111)
    • D类IP地址(224.0.0.0 - 239.255.255.255 :11100000.00000000.00000000.00000000 - 11101111.11111111.11111111.11111111)
    • E类IP地址(240.0.0.0 - 255.255.255.255 :11110000.00000000.00000000.00000000 - 11111111.11111111.11111111.11111111)
  6. 公有IP地址和私有IP地址

    • 公用地址在Internet中使用,可以在Internet中随意访问。
    • 私有IP地址无法在Internet中使用,只能在内部使用。
      • A类:10.0.0.0/8 10.0.0.0-10.255.255.255
      • B类:172.16.0.0/12 172.16.0.0-172.31.255.255
      • C类:192.168.0.0/16 192.168.0.0-192.168.255.255
      • 本地回环地址是指以127开头的地址(127.0.0.1-127.255.255.254),通常用127.0.0.1表示,永远在线,都可以ping通。
  7. 子网掩码

    • 用网线直接连接的计算机要能够相互通信,计算机必须要在同一网络
    • 它们的网络地址必须相同,而且主机地址必须不一样,如果不在一个网络就无法通信。
    • 子网掩码就是判断网络中的计算机在不在同一网络,在就能通信,不在就不能通信。
    • 子网掩码使用的运算:11=1,10=0,00=0,子网掩码与通信双方的IP地址进行与运算得出双方的网络地址,从而可以得出网络地址是否相同。
  8. 路由器(Router)又称网关设备(Gateway),用于连接多个逻辑上分开的设备,当数据从一个子网传输到另一个子网时,可通过路由器的路由功能来完成。

    • 直连路由:设备和设备接口间相连的路由。

    • 静态路由:手动配置的路由。

    • 动态路由:通过动态路由学习的路由。

ARP地址解析协议

  1. ARP协议:ARP(Address Resolution Protocol)是个地址解析协议,在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址(Mac地址),而数据包首先是被网卡接收到后再去做上层协议的,如果接收到的数据包的硬件地址与本机不符,就丢弃该数据包。因此通讯前必须获得目的主机的硬件地址。

  2. ARP协议工作流程

    • 当发送方向局域网中的接收方发送IP数据报时,就会在自己的ARP缓冲表(命令:arp -a)中查看有无接收方主机的IP地址。

      • 如果有,就可以查出对应的硬件地址,再将此硬件地址写入Mac帧,然后通过以太网将数据包发送到目的主机中。

      • 如果查不到目的主机的IP地址,那么就必须通过ARP协议解析进行通信。

    • ARP进程会在局域网中广播一个ARP请求。ARP请求的主要内容大致为:我的IP地址是xxx.xxx.xxx.xxx,我的硬件地址是xx-xx-xx-xx-xx-xx,我想知道IP地址为sss.sss.sss.sss的主机硬件地址。

    • 在该局域网中的所有主机都会收到此ARP请求。

    • 目的主机在ARP请求中见到了自己的IP地址,就会向源主机发送ARP响应,并写入自己的硬件地址,大致内容为:我的IP地址是sss.sss.sss.sss,我的硬件地址为ss-ss-ss-ss-ss-ss。其余主机都不理睬这个ARP请求。

    • 虽然ARP请求是广播发送的,单ARP响应是普通的单播,即从一个地址发送给另一个地址

    • 当源主机收到目的主机的ARP响应后,会将目的主机的IP地址到硬件地址的映射写入其缓冲表。

  3. 注意事项:如果你的数据包是发送到不同网段的目的地,那么就一定存在着一条网关的IP- MAC地址对应的记录。也就是说如果访问的不是同一局域网的目的主机时,ARP缓冲表中存放着的是网管的IP- MAC。ARP协议在同网段及跨网段下的工作原理

  4. Python Scapy 模块

    • scapy是一个Python程序,使用户能够发送,嗅探和剖析并伪造网络数据包。此功能允许构建可以探测,扫描或攻击网络的工具。

    • 安装scapy

      • 下载地址:Github scapy下载地址
      • 下载解压后,进入CMD到该解压目录下,执行python setup.py install
      • 或者执行pip install scapy
    • 获取网关的MAC地址

      from scapy.all import *
      
      # 设置信息,只需要解析对方的MAC地址
      conf.verb = 0
      
      
      def handle_arp_address(ip_address):
          """
          srp: 让arp数据包工作在数据帧中,也就是在数据链路层上,发数据帧
          Ether: 工作在以太网,局域网中
          dst: dst是目的广播MAC地址
          pdst: pdst是目的IP地址
          timeout:超时时间
      
          :param ip_address: 目的IP地址
          :return:
          """
          ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=ip_address), timeout=2)
          for snd, rcv in ans:
              # 解析为MAC&IP地址的格式
              print(rcv.sprintf(r"%Ether.src% & %ARP.psrc%"))
      
      
      handle_arp_address("172.17.0.1")
      

ICMP网际控制消息协议

  1. ICMP协议

    • ICMP协议:ICMP全称Internet Control Message Protocol(网际控制信息协议)
    • 为什么要有ICMP协议?一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否通畅,这个时候就需要用到ICMP协议了。
  2. ICMP的作用

    • 确认IP包是否成功到达目标地址。
    • 通知在发送过程中IP包被丢弃的原因。
  3. ICMP的实际应用

    • ping命令一般用于检测网络通不通,也叫延时,其时间值越大,速度越慢
  4. ICMP协议的两种类型

    • ICMP请求包
      • 在源机上运行ping 目标主机IP
      • 源机查询ARP高速缓冲表,查看是否有目标主机的MAC地址
      • 如果有,则开始封装网络层数据包,包含目的主机IP地址,源地址,ICMP请求等
      • 封装数据链路层数据帧,包含目的MAC地址,源MAC地址,网络层数据等
      • 封装成物理层的比特流,通过网卡和通信线路传输
    • ICMP回复包
      • 目的主机回复ICMP数据包,包含目的IP地址,源IP地址,ICMP回复数据等
      • 封装数据链路层数据帧,包含目的MAC地址,源MAC地址,网络层数据等
      • 封装成物理层比特流,通过网卡和通信线路传输
  5. Python Scapy 模块

    from scapy.all import *
    
    # 关闭详细信息
    conf.verb = 0
    
    
    def handle_alive(ip):
        """
        传入的ip是否存活
        srp:是让ARP协议工作在数据链路层上,发送的是数据帧
        sr:是让ICMP协议工作在网络层上,发送的事数据包
        ICMP:ICMP是IP协议的一部分,可以进行retry重试,timeout是超时时间
    
        :param ip: 需要检测的ip地址
        :return:
        """
        ans, unans = sr(IP(dst=ip) / ICMP(), retry=0, timeout=2)
        for snd, rcv in ans:
            print(rcv.sprintf(f"%IP.src% is alive"))
    
    
    handle_alive('172.17.0.1')
    # ICMP协议不受网络范围的限制
    # 当前所处的网络,也可以判断外网,类似于ping命令
    # 我们所处的网段一般都处于私有IP地址段,只能判断同一IP私有段或者公有IP地址段
    
posted @ 2022-06-07 17:54  行走的世界  阅读(177)  评论(0编辑  收藏  举报