我的Linux网络内核之行1-基础网络知识
Posted AlexKing阁下
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的Linux网络内核之行1-基础网络知识相关的知识,希望对你有一定的参考价值。
前言
最近不光在解决项目的问题,也遇到过部分的网络问题,发现自己对于网络的知识还是非常匮乏的,因而在此做一些归纳,记录也是分享,当然我的分享应该不是最全的,但个人认为有些东西就算分享出来,用不到也是白折腾。在此系列中,我还是只介绍我个人用到的技术。
Wi-Fi的相关名词介绍
到一家店里面,以前我们经常喊:老板,你们这边的WIFI叫什么名字?
身为一个技术人员嘛,我们当然得知道“WIFI”到底指的是什么。
“WIFI”就是指SSID: Service Set Identifier(服务集标识)
SSID是一个ESS的网络标识(如:TP_Link_1201),BSSID是一个BSS的标识,BSSID实际上就是AP的MAC地址,用来标识AP管理的BSS,在同一个AP内BSSID和SSID一一映射。在一个ESS内SSID是相同的,但对于ESS内的每个AP与之对应的BSSID是不相同的。如果一个AP可以同时支持多个SSID的话,则AP会分配不同的BSSID来对应这些SSID。
这上面的话比较拗口,那么一个路由器(ESS)下可以接一个新的路由器(BSS)BSSID就是这个新的路由器的mac地址,这个新的路由器又组成了一个新的AP(一个新的连接点)其SSID与MAC地址对应。
还有几个名词
站点STA(手机)
接入点AP(路由器)
扩展服务集ESS
基本服务集BSS
分布式系统DS(传输用的,后面会讲到)
STA(工作站)启动初始化、开始正式使用AP传送数据帧前,要经过三个阶段才能够接入(802.11MAC层负责客户端与AP之间的通讯,功能包括扫描、接入、认证、加密、漫游和同步等功能)
1)扫描阶段(SCAN)
2)认证阶段 (Authentication)
3)关联(Association)
Wi-Fi的扫描
Active Scanning 主动扫描 (特点:能迅速找到) STA依次在13个信道发出Probe Request帧,寻找与STA所属有相同SSID的AP,若找不到相同SSID的AP,则一直扫描下去…
Passive Scanning 被动扫描(特点:找到时间较长,但STA节电)通过侦听AP定期发送的Beacon帧来发现网络,该帧提供了AP及所在BSS相关信息:“我在这里”…
具体的被动扫描:
(1)跳至某个信道,然后等候来帧指示(indicationof an incoming frame)或者等到ProbeDelay定时器超时。如果在这个信道收到帧,就证明该信道有用户在使用,因此可以加以探测。而ProbeDelay定时器可用来防止某个闲置信道让整个过程停止,因为工作站不会一直等待帧的到来。
(2)利用基本的DCF访问过程取得媒介使用权,然后送出一个Probe Request帧。
(3)至少等候一段最短的信道时间(即MinChannelTime)。
a.如果媒介并不忙碌,表示没有网络存在,因此可以跳至下个信道。
b.如果在MinChannelTime这段期间媒介非常忙碌,就继续等候一段时间,直到最长的信道时间(即MaxChannelTime)超时,然后处理任何的Probe Response帧。
大家可能会发现当手机进行WIFI热点搜索时,有时时间会比较长,原因是你处在的区域存在多个接入点(AP),当手机发出Probe Request帧时,多个接入点(AP)通过竞争窗口(congestionwindow)回应Probe Response帧,而这个竞争过程受限于最长的信道时间(即MaxChannelTime)。
Wi-Fi的认证
弹出一个输入密码的窗口,当然也有不用输入密码的。这个过程叫做:认证(Authentication)
里面的具体机制呢,后面再说,可以来看一下Wi-Fi的加密协议有什么。
- WPA(Wi-Fi Protected Access)是WIFI联盟制定的安全性标准,WPA2是第二个版本
- PSK(PreShared Key)叫做预共享密钥。WPA-PSK/WPA2-PSK主要是针对个人或家庭网络等,对安全性要求不是很高的用户
- WPA2是在802.11i颁布之后,WIFI联盟随即推出的最新无线安全标准,它遵循802.11i标准,以下是它采用的模式:
WPA2-PSK= PSK(密码) + AES + CCMP(计数器模式及密码块链消息认证码协议)
Wi-Fi的关联
工作站与基站进行关联,以便获得网络的完全访问权。它让分布式系统(Distribution System)得以记录每个移动式工作站的位置,以便将传送给移动式工作站的帧,转送给正确的基站。
简而言之,就是和AP建立数据交互了。
1、一旦移动式工作站与基站完成认证,便可送出关联请求(Association Request)帧。尚未经过身份认证的工作站,会在基站的答复中收到一个解除关联(Deauthenticaton)帧。
2、基站随后会对关联请求进行处理。IEEE802.11标准并未规范如何判断是否请允许关联;这因基站的实现而异。较常见的方式是考虑帧暂存所需要的空间大小。以Association Request帧中的聆听间隔(Listen Interval)字段来推算,大致上可以粗略推算出。
a. 一旦关联请求获准,基站就会以代表成功的状态代码0及关联识别码(Association ID,简称 AID)来回应。AID本身是数值形式的识别码,在逻辑上则是用来辨识暂存帧所要传递的行动式工作站。
b. 关联请求如果失败,就只会返回状态码,并且中止整个过程。
3、基站开始为移动式工作站处理帧。在常见的产品中,所使用的分布式系统媒介通常是Ethernet。当基站所收到的帧目的地为与之关联的移动式工作站时,就会将该帧从 Ethernet桥接至无线媒介,如果该移动式工作站处于省电(Power-Saving)状态,则为之暂存帧。在共享式Ethernet中,该帧会被送至所有基站,不过只有正确的基站会进行桥接处理。在交换式Ethernet 里,该工作站的MAC地址得以跟某个特定的交换端口(Switch Port)形成关联。当然,该交换端口必须连接到当前为该工作站提供服务的基站。
网络协议
说了那么多的Wi-Fi链接,其基石除了nl802.11协议,还有最基石的几个协议,比如ARP\\ICMP\\TCP,这些是我们最常用到的协议栈。
一般我们会见到OSI的7层架构,给这些协议做了划分
ARP
ARP(Address Resolution Protocol)地址解析协议,目的是实现IP地址到MAC地址的转换。
实例
主机A的IP地址为192.168.42.1,MAC地址为0A-11-22-33-44-01
主机B的IP地址为192.168.42.15,MAC地址为0A-11-22-33-44-02
当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址(192.168.42.15)解析成主机B的MAC地址
以下为工作流程:
(1)根据主机A上的路由表内容,IP确定用于访问主机B转发IP地址是192.168.42.15。然后A主机就在自己的本地ARP缓存中检查主机B的匹配MAC地址。
(2)如果主机A在ARP缓存中没有找到映射,它将询问192.168.42.15的硬件地址,从而将ARP请求帧广播道本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,他将丢弃ARP请求。
(3)主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存(主机B)中。
(4)主机B将包含其MAC地址的ARP回复消息直接发送回主机A。
(5)当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。
主机B的MAc地址一旦确定,主机A就能向主机B发送IP通信了
ARP数据分析
下图为抓到的一个ARP的请求
具体可以看以下表格
ARP的回复包:
注意了
内容格式和请求相似,不过会有目的地址对应的MAC地址,ARP数据包类型字段为2。
重点就在opcode。
ARP的攻击与防御
从上面大家可以看出ARP是一个非常简单的包,如果是黑客的,他会咋么做呢?
不卖关子了,我可以截取ARP,将其挟持成自己的主机,有段时间你可能发现你的主机变慢了,网络卡了,那么有可能是受到了ARP的攻击哟。
一般来讲
①ARP缓存表基于"后到优先"原则,IP与MAC的映射信息能被覆盖;
②ARP攻击基于伪造的ARP回应包,黑客通过构造"错位"的IP和MAC映射,覆盖主机的ARP表(也被称为"ARP毒化"),最终截取用户的数据流;
③一旦遭受ARP攻击,账号密码都可能被窃取(如果通信协议不是加密的);
对于商业级的交换机来讲,都会有DAI(Dynamic ARP Inspection)- 动态ARP检测。
主要工作为:
1.交换机记录每个接口对应的IP与MAC,生成DAI检查表
2.交换机价差每个接口发过来的ARP回应包,根据DAI表判断是否违规,并惩罚相关接口
那么我们消费级的就没有办法了吗?
还是有的。模拟DAI的算法,通过软件的模式,不断地处理网络包,并在本地做保护。
ARP防火墙:
1.绑定正确的IP与MAC映射
2.自动识别局域网内存在的ARP扫描和欺诈行为
ICMP
一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。所以我们就需要一种协议来完成这样的功能–ICMP协议。
主要功能:
- 确认IP包是否成功到达目标地址
- 通知在发送过程中IP包被丢弃的原因
最常用的Ping就是ICMP报文:
一台主机向一个节点发送一个类型字段值为8的ICMP报文,如果途中没有异常(如果没有被路由丢弃,目标不回应ICMP或者传输失败),则目标返回类型字段值为0的ICMP报文,说明这台主机存在。
ICMP报文包含在IP数据报中,IP报头在ICMP报文的最前面。一个ICMP报文包括IP报头(至少20字节)、ICMP报头(至少八字节)和ICMP报文(属于ICMP报文的数据部分)。当IP报头中的协议字段值为1时,就说明这是一个ICMP报文。
而我们一般需要关注的类型有以下这几个
实例
这是我抓到的2笔ping过程中的ICMP报文
其具体数据如下:
一个请求,一个回复,注意这边的type与code,这个是构成ICMP类型的重要组成。根据这个你能够知道到底发生了什么事情
通常为以下状态:
类型8,代码0:表示回显请求(ping请求)。
类型0,代码0:表示回显应答(ping应答)
类型11,代码0:超时
TCP报文
有很工程,我们一般都是使用TCP通信的,什么3次握手,我在此就不说了,主要还是说说协议。
还是一样要关注的仍然是其首部。
这里大家应该注意的是这个FLAGS,这个可以跟3次握手一一对应起来,有兴趣的家人们可以直接试试。回头还会分享一下我是咋么抓包的。
IP报文
前面讲的那么多,其实是已经分析出来的东西了。而在这些报文之前还有报文,这个那就是IP报文
这里关注首部与原目标即可,还有PROTOCOL。这个非常重要。
以太网封装
当然哦,IP报文之前,还有一笔报文,我们称其为以太网的封装。
具体组成如下:
协议总结
大家可以看到这个是组成发包,而到接受端一样是逐一解包。这里就不一一说明了。
以上是关于我的Linux网络内核之行1-基础网络知识的主要内容,如果未能解决你的问题,请参考以下文章
i.MX6ULL驱动开发 | 31 - Linux内核网络设备驱动框架