python网络编程(二)
网络层
- 网络层负责获取和维护主机的IP地址,IP地址用于主机间进行网络互联的标示,网络层负责给数据包选择路由路径,也就是路由寻址。
- 负责点到点(point-to-point)的传输(这里的“点”指主机或路由器)
网络层协议
IP网际协议
-
IP协议位于网络层,它是TCP/IP协议族中最为核心的协议,所有的上层协议如TCP、UDP数据都以IP数据包格式传输。
-
IP协议特征:
- 不可靠(会出现丢包的情况)
- 无连接(数据包之间是独立的)
-
IP协议版本:
-
IPv4:IPv4是互联网协议的第四版,也是第一个被广泛使用,构成现今互联网技术的基础协议,是TCP/IP协议簇中的核心协议
-
IPv6:IPv6是互联网协议的第六版,是新一代的互联网技术的基础协议,目前正在推广中。
-
-
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为主机地址。
-
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)
-
公有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
通。
-
子网掩码
- 用网线直接连接的计算机要能够相互通信,计算机必须要在同一网络。
- 它们的网络地址必须相同,而且主机地址必须不一样,如果不在一个网络就无法通信。
- 子网掩码就是判断网络中的计算机在不在同一网络,在就能通信,不在就不能通信。
- 子网掩码使用的与运算:
11=1,10=0,00=0
,子网掩码与通信双方的IP地址进行与运算得出双方的网络地址,从而可以得出网络地址是否相同。
-
路由器(Router)又称网关设备(Gateway),用于连接多个逻辑上分开的设备,当数据从一个子网传输到另一个子网时,可通过路由器的路由功能来完成。
-
直连路由:设备和设备接口间相连的路由。
-
静态路由:手动配置的路由。
-
动态路由:通过动态路由学习的路由。
-
ARP地址解析协议
-
ARP协议:ARP(Address Resolution Protocol)是个地址解析协议,在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址(Mac地址),而数据包首先是被网卡接收到后再去做上层协议的,如果接收到的数据包的硬件地址与本机不符,就丢弃该数据包。因此通讯前必须获得目的主机的硬件地址。
-
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地址到硬件地址的映射写入其缓冲表。
-
-
注意事项:如果你的数据包是发送到不同网段的目的地,那么就一定存在着一条网关的IP- MAC地址对应的记录。也就是说如果访问的不是同一局域网的目的主机时,ARP缓冲表中存放着的是网管的IP- MAC。ARP协议在同网段及跨网段下的工作原理
-
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网际控制消息协议
-
ICMP协议
- ICMP协议:ICMP全称Internet Control Message Protocol(网际控制信息协议)
- 为什么要有ICMP协议?一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否通畅,这个时候就需要用到ICMP协议了。
-
ICMP的作用
- 确认IP包是否成功到达目标地址。
- 通知在发送过程中IP包被丢弃的原因。
-
ICMP的实际应用
ping
命令一般用于检测网络通不通,也叫延时,其时间值越大,速度越慢。
-
ICMP协议的两种类型
- ICMP请求包
- 在源机上运行
ping 目标主机IP
- 源机查询ARP高速缓冲表,查看是否有目标主机的MAC地址
- 如果有,则开始封装网络层数据包,包含目的主机IP地址,源地址,ICMP请求等
- 封装数据链路层数据帧,包含目的MAC地址,源MAC地址,网络层数据等
- 封装成物理层的比特流,通过网卡和通信线路传输
- 在源机上运行
- ICMP回复包
- 目的主机回复ICMP数据包,包含目的IP地址,源IP地址,ICMP回复数据等
- 封装数据链路层数据帧,包含目的MAC地址,源MAC地址,网络层数据等
- 封装成物理层比特流,通过网卡和通信线路传输
- ICMP请求包
-
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地址段