1、以太网
1.1、认识以太网

主机B给主机C发送消息,现在我们已经知道根据主机C的目的IP地址来进行路由,所以网络层已经解决了为什么交给路由器F、G、H等的问题,因为根据目标网络查找路由表决定了我要走路由器F、G、H等。但是主机B怎么将数据交给路由器F,这是数据链路层的问题。
真正在网络物理结构上跑的报文是MAC帧!在逻辑上我们认为IP在流动,这是需要MAC帧的支持的。
数据链路层解决的是:相邻主机直接通信的问题。
"以太网"不是一种具体的网络,而是一种技术标准。既包含了数据链路层的内容,也包含了一些物理层的内容。例如:规定了网络拓扑结构,访问控制方式,传输速率等。
例如以太网中的网线必须使用双绞线。传输速率有 10M, 100M, 1000M 等。
以太网是当前应用最广泛的局域网技术。和以太网并列的还有令牌环网,无线LAN等。
1.2、以太网帧格式

源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。
帧协议类型字段有三种值,分别对应IP、ARP、RARP。其中IP是0800,ARP是0806,RARP是8035。
帧末尾是 CRC 校验码,占4字节。
以太网帧要求有效载荷必须在[46,1500]范围内,不能超过1500,也不能少于46。
1、解包和封包的问题
读取固定长度的14字节,就可以获取目的MAC地址,源MAC地址,类型,读取最后4字节就可以获取CRC校验码,剩下的就是有效载荷了。
2、如何进行分用问题
首先进行解包,然后提取2字节的类型,根据2字节类型的值来判断,如果是0800说明要交付给上层的IP协议。
认识MAC地址:
长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
在网卡出厂时就确定了, 不能修改。mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突。也有些网卡支持用户配置mac地址)

1.3、MTU
认识MTU:
以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节要在后面补填充位。
最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU。
MTU对IP协议的影响:由于数据链路层MTU的限制,对于较大的IP数据包要进行分包。
MTU对UDP协议的影响:一旦UDP携带的数据超过1472(1500 - 20(IP 首部) - 8(UDP 首部)),那么就会在网络层分成多个IP数据报。这多个IP数据报有任意一个丢失,都会引起接收端网络层重组失败。那么这就意味着,如果 UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加。

由于数据链路层MTU的限制,对于较大的IP数据包要进行分片。如果不进行分片,那么数据链路层的有效载荷最大为1500,也就是IP报头+有效载荷=1500,对于网络层IP协议来说最大有效载荷就是1480,那么传输层TCP协议报头+有效载荷不能超过1480,去掉TCP报头,传输层的有效载荷最大就是1460。
这个1460就是MSS,TCP的一个数据报也不能无限大,受制于MTU。TCP 的单个数据报的最大消息长度,称为 MSS(Max Segment Size)。
如图,MTU=1500包含了IP报头和TCP报头,而我们真正要发送的数据是MSS=1460。
TCP双方三次握手的时候不仅会协商窗口大小,还会进行MSS协商。
最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的 MTU)。双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。
然后双方得知对方的MSS值之后,选择较小的作为最终MSS。
MSS的值就是在TCP首部的40字节变长选项中(kind=2)。
2、重谈局域网通信原理
今天在教室里面老师对着张三说,张三你作业怎么没做。那么教室里所有人都能听见老师跟张三说的话,只不过所有人提取名字张三跟自己的名字进行比对,发现并不是自己,所以直接就忽视了。而张三在听到这句话后,发现老师就是在对自己说,所以张三就站起来说:老师我作业做了,你是不是没看呢?张三的回答教室里所有人也都能听见,但是其他人也都不会插嘴,因为张三是对老师说的,老师听到后就给张三答复。在这个过程中,老师和张三都认为自己在和对方直接通信。

以太网通信中,比如当前主机A给主机E发送数据,所有主机都是能接收到的。主机B网卡收到之后向上交付给数据链路层,数据链路层进行解包然后提取目标地址:MacE,而自己是MacB,所以这不是发给我的,因此就把该报文丢弃了,而我们用户是感知不到的。那么对于主机C、主机D也是如此。主机E收到之后向上交付给数据链路层,然后进行解包提取目的地址MacE,而自己就是MacE,所以确定这是发给我的,因此提取类型的值0800,要分用给网络层的IP协议,所以继续向上交付。IP报头中也有8位协议类型,所以可以继续向上交付给TCP,然后TCP报头中有16位目的端口,可以继续交付给上层的进程。主机E上层处理之后要返回以同样的方式返回给主机A。并且我们不能只看到每台主机,我们还要看到每台主机都有一个网络协议栈,网络通信本质就是进程间通信,要贯穿网络协议栈。
局域网通信所有主机都能看得到,只不过其他主机发现不是发给自己的都会直接丢弃,但是网卡有一种工作模式叫做:混杂模式,可以接收所有的数据,不管是不是发给该主机的。
细节1:为了避免局域网中数据碰撞的问题,要保证任何时刻只有一台主机在使用局域网资源。
当主机A给主机E发消息的时候,其他主机可能也会相互发消息,如果大家都在发消息就会导致局域网数据碰撞问题。数据碰撞:两台以上主机发送数据互相干扰。因此在任何时刻局域网只能有一台主机在发送数据。
细节2:如果碰撞了,涉及碰撞的主机怎么办?——碰撞避免。
由于可能发生数据碰撞,所以每台主机都要进行碰撞检测,如果发生了数据碰撞,就要进行碰撞避免。碰撞避免就是让主机随机等待上一段时间然后重新发送。由于任何时刻只能有一台主机使用局域网资源,所以局域网就是临界资源,进行碰撞检测和碰撞避免就是保证任何时刻只有一台主机使用临界资源,本质上就是互斥,只不过这种互斥的方式比较特殊。
细节3:整个局域网,我们称为一个碰撞域。
细节4:在一个碰撞域中,主机越多越好还是越少越好?
主机如果越多,那么就会导致数据碰撞的概率增加,因此主机不能太多。所以主机越少越好。那如果主机很多怎么解决呢?需要使用交换机。
细节5:单台主机发送数据帧,数据帧的长度是越长越好还是越短越好?MTU=[46,1500]。
首先不能太长,如果发送数据帧太长主机A发送的负担就会比较大,占用以太网资源就会比较久,就更可能发生碰撞,另外重发的话负担也很大。那如果数据帧越短是不是就越好呢?也不是,如果数据帧太短,主机A本来发10个,现在发20个,会导致发送的密度增大,所以也会导致数据碰撞概率增大。因此既不能太长也不能太短。
细节6:如果我想黑掉一个局域网该怎么做?
主机A不断发送垃圾数据来和以太网中的数据发生碰撞,这样整个局域网中的所有人都会断网。但是主机A发送也要走网络协议栈,你一旦发生碰撞了不是会执行碰撞避免等一会再发吗?道理是这个道理,但是有一些工具可以绕过链路层直接交给硬件发送。
再谈交换机:
如果局域网主机数量很多,就导致容易发生碰撞,因此就需要交换机出场了,交换机可以划分碰撞域。

如图,主机A给主机E发送消息,主机B和主机D收到之后直接丢弃,然后交换机的i_left收到主机A的报文,接着交换机就会记录下MacA一定在交换机的左侧,然后将报文直接转发给右侧,右侧主机C收到后直接丢弃,主机E收到发现就是给自己的所以继续向上交付。
后来主机E也给主机A应答,主机C收到后丢弃,然后交换机收到了,交换机就能判断MacE一定在我的右侧,然后将报文转发给左侧,左侧的主机B和D收到后直接丢弃,主机A收到后发现就是给自己的所以继续向上交付。
交换机在经过一段时间的学习,就能知道MacA、MacB、MacD在我的左侧,MacC、MacE在我的右侧。
现在主机A又要给主机D发送数据,主机B收到后直接丢弃,交换机收到后根据源地址和目的地址进行判断,发现源地址MacA和目的地址MacD都在我的左侧,所以就不需要再转发给右侧了。那么如果当左侧发生了数据碰撞,也不会影响到右侧,因此交换机可以划分碰撞域。同理,如果右侧的主机E给主机C发送数据,交换机识别到源地址MacE和目的地址MacC都在我的右侧,因此不会转发给左侧。
3、ARP协议
3.1、问题引入

主机B给主机C发送数据,在将数据转发到目标网络之前都是使用IP地址进行路由的,而当数据到了路由器D,路由器D就是入口路由器,它和主机C在一个子网中,这时候就需要将数据从路由器D转发给主机C。现在问题是,我们只知道源IP地址:ipb和目的IP地址:ipc,并不知道主机C的MAC地址。我们必须得知道主机C的MAC地址,因为需要继续向下交付给数据链路层然后封装成MAC帧才能发送。

再来看第二种场景,主机B的IP地址为192.168.10.4,主机C的IP地址为111.222.111.222。现在主机B要给主机C发送数据,那么src就是192.168.10.4,dst就是111.222.111.222,然后主机B需要查路由表,将目标IP地址跟子网掩码按位与再与目标网络比对,发现前面都不是。主机B也不知道这个IP地址要去哪,但是可以肯定的是绝对不在我这个子网中,所以就要走默认路由转发给路由器F,而在路由表条目中我们能知道路由器F的IP地址为192.168.10.1,但是我们并不知道路由器F的MAC地址,那么怎么向下封装MAC帧然后发送给路由器F呢?
因此,在局域网中,我们需要一种能力:把IP地址转换为MAC地址的能力!
对于第一种情况,IP地址在内网中是唯一的,所以要把ipc转换为主机C的MAC地址,这样路由器D就能向下封装MAC帧然后发送给主机C了。对于情况2,查了路由表要走缺省路由,知道路由器F的IP地址为192.168.10.1,所以只要能将该IP地址转换为MAC地址,就能封装MAC帧发送给路由器F。
数据报的发送主要依靠的是IP进行路由,但是实际转发的时候特别依赖于MAC地址。
3.2、ARP基本原理

今天王老师正在上课,突然校长过来了,对着王老师说把你们班10号同学叫出来,所以王老师就对着班级里的所有人喊了一声:我是王老师,哪名同学的学号是10,告诉我你的名字。班级里学号为9、6、7…的同学都不会应答,因为不是自己,然后张三发现这是在叫自己,因为张三就是10号,所以张三就对老师说:老师我叫张三,我是10号。这就是两个过程:1、先广播。2、再单发。
王老师的IP地址就是192.168.1.1,MAC地址就是mac1。张三的IP地址就是192.168.1.10,MAC地址就是mac3。王老师想要知道192.168.1.10这台主机的MAC地址,所以今天构建了一种协议,我是mac1,ip1,我要找ip是192.168.1.10,获取它的mac地址。所以张三就给老师说我的地址是mac3,这时候老师就知道张三的mac地址了。

主机A希望与172.20.1.2,所以会发送ARP请求包,主机B接收到了之后发送ARP响应包将自己的MAC地址告诉主机A。
所以对于上面路由器D转发给主机C,需要先发起一次ARP请求,然后主机C告诉路由器的MAC地址,路由器就可以向下交付封装MAC帧发送给主机C。再来说第二种情况,查了路由表发现要走缺省路由,获取了路由器F的IP地址192.168.10.1,然后在当前网络中进行一次ARP请求就可以获取路由器F的MAC地址,就能将报文交给路由器F了。
主机B给路由器F发送报文要一直ARP吗?如果当初已经ARP过了现在还需要ARP吗?

通过arp -a命令可以查看缓存的IP地址和MAC地址映射关系。所以并不是每次都要进行ARP,如果ARP过后就会被暂时缓存起来,再次收到同样的报文直接交付。
3.3、ARP数据报格式

ARP协议也是在数据链路层,在MAC帧之上的协议。以太网帧中有2字节的类型,0800表示IP协议,0806表示ARP协议。
硬件类型指链路层网络类型,1为以太网。
协议类型指要转换的地址类型,0x0800为IP地址。
硬件地址长度对于以太网地址为6字节。也就是MAC地址为6字节。
协议地址长度对于IP地址为4字节。
op 字段为1表示ARP请求,op字段为2表示ARP应答。

当报文转发到了出入口路由器R,路由器R的IP为IPR,MAC地址为MACR,主机E的IP为IPE,MAC地址为MACE,现在有个报文源IP为ipx,目的IP为IPE,路由器R可以肯定这个IP地址和我在一个子网中,但是它并不知道主机E的MAC地址,所以需要发起一次ARP请求。
我们需要注意到:主机B可以收到路由器R给他发的ARP请求,也可能受到曾经它发送ARP请求的应答,比如主机B给发送了ARP请求,请求IPC的MAC地址,主机B可能同时收到路由器R的ARP请求和主机C的ARP应答。
结论:任何主机都可能收到ARP请求或ARP应答。

如图,路由器R在数据链路层ARP协议中,首先构建ARP协议请求,填入ARP协议报头相关字段,硬件类型填1表示以太网,协议类型填0800表示要进行IP协议转换,硬件地址长度填6表示MAC地址长度为6字节,协议地址长度填4表示4字节IP地址长度,发送端以太网地址就是MACR,发送端IP地址就是IPR,目的以太网地址不知道所以填全F,目的IP地址就是IPE。接着向下交付封装MAC帧,以太网目的地址为全F表示要进行广播,以太网源地址为MACR,帧类型为0806表示ARP协议。
然后发送到以太网中,以太网所有主机都能接收到,我们分析一下主机B收到后如何处理。主机B收到后向上交付给数据链路层的MAC帧,然后进行解包提取以太网帧信息,发现以太网目标地址为全F,所以是进行广播,所以主机B也要进行处理,提取帧类型0806,向上交付给数据链路层的ARP协议,然后首先判断op字段(因为主机B可能收到ARP请求也可能收到ARP应答),发现op是1所以是一个ARP请求,再看目的IP地址,发现不是我所以直接丢弃了。对于主机C和主机D也是如此。
主机E收到了向上交付给数据链路层的MAC帧,提取出MAC帧发现目的地址全F说明是广播,提供帧类型0806,继续向上交付给ARP协议,判断op字段为1是ARP请求,然后目的IP地址为IPE,而我就是IPE,因此这是给我发送的ARP请求,所以我需要构建ARP响应返回给路由器R。

现在主机E要给路由R响应,主机E的数据链路层中的ARP协议这一层构建ARP应答,发送端以太网地址为MACE,发送端IP地址为IPE,目的以太网地址为MACR,目的IP地址为IPR。然后向下继续封装MAC帧,以太网目的地址为MACR,以太网源地址为MACE,帧类型0806表示ARP请求或应答。
此时主机B收到数据帧,做报头和有效载荷分析,然后发现要去的以太网目的地址为MACR,而自己是MACB,所以这不是给我的,因此直接丢弃。对于主机C和主机D也是如此。这一次丢弃和上一次丢弃不一样,上一次是在ARP协议这一层丢弃,这一次是在数据帧这一层直接丢弃。因为上一次是广播,而这一次是单发。
路由器R收到后MAC帧这一层先进行报头和有效载荷分离,MACR和自己地址相等,所以提取帧类型发现是0806,交付给上层ARP协议这一层。路由器收到ARP首先看op,发现op是2,所以是ARP应答,所以这时候就应该看发送端的以太网地址和发送端的IP地址,这时候就拿到了对方的IP地址和MAC地址,所以路由器就可以缓存IPE:MACE的映射关系。至此完成了一次ARP请求。
因此,step2:将IP报文向下交付封装MAC帧,然后就能转发给主机E了。
任何主机都可能受到ARP请求或ARP应答。所以任何主机处理ARP请求或应答都是先看op,然后根据op类型确定处理动作。

现在发送数据,在网络层通过目标IP进行路由,查找路由表,找到下一跳或者缺省路由,获取下一跳IP地址,而下一跳和当前主机一定在同一个子网中,当前主机发起ARP请求获取下一跳的MAC地址,然后就向下交付给数据链路层封装MAC帧,转发给下一个主机。上面的图中就是转发给路由器,然后路由器网卡向上交付给数据链路层,进行解包分用,交付给网络层,根据目的IP继续查找路由表,同样找到下一跳IP地址然后发起ARP获取MAC地址,向下封装就可以继续转发。当数据丢包了,或者某个路由器挂掉了,那么发送方长时间得不到应答,传输层TCP就会进行超时重传。因此传输层定策略,网络层提供路径选择的能力,数据链路层帮我们进行局域网数据包的转发。TCP/IP为我们提供可靠的把数据从A主机跨网络传输到B主机的能力。网络里真正在跑的其实是MAC帧,逻辑上我们认为IP报文经过一个又一个网络层到达对方主机的网络层,逻辑上我们认为发送方主机传输层直接传给了对方传输层。逻辑上我们还认为发送方主机应用层直接转发给对方主机应用层,对方应用需要解决TCP的粘包问题并进行序列化和反序列化的过程。

再来看以太网帧格式,我们发现数据帧的有效载荷可能是IP数据报,对应的帧类型就是0800。还可能是ARP请求/应答,对应的帧类型就是0806。也可能是RARP请求/应答,对应的帧类型就是8035。
RARP是逆地址解析协议,就是将MAC地址转换成IP地址。
另外数据帧的有效载荷至少是46字节,ARP请求/应答只有28字节,所以需要在尾部填充18字节达到46字节。
3.4、ARP欺骗

步骤一:主机A的IP地址为ipA,MAC地址为macA。路由器R的IP地址为ipR,MAC地址为macR。主机A和路由器R已经通信过了,因此主机A缓存了arp信息:ipR到macR映射。路由器也缓存了ipA到macA的映射关系。所以将来外部网络将数据转发给了路由器,路由器查找arp缓存信息找到主机A的MAC地址macA,就能向下封装MAC帧然后转发给主机A。

步骤二:这时候来了个中间人主机M,主机M的MAC地址为macM,中间人对主机A和路由R发起攻击,主机M给主机A发送大量的arp应答,告诉主机A:我是ipR,我的mac地址是macM。主机A中有arp缓存,但是主机A如果收到了大量的arp应答,主机A就会使用最新的arp映射关系。因此主机A中原来arp映射关系是ipR和macR,现在变成了ipR和macM。主机M同样给路由器R发送大量arp应答,告诉路由器R:我是ipA,我的MAC地址是macM,路由器就会更新映射关系为ipA和macM。

步骤三:现在主机A要将报文转发给路由器R,对应的映射关系是ipR和macM,所以主机A向下封装数据帧,目标以太网地址为macM。路由器R收到了就认为这不是给我的,所以直接丢弃了。主机M就可以获取到主机A的报文,然后主机M再将该报文转发给路由器R。将来外部响应给ipA,到了路由器这里,路由器缓存的信息是ipA和macM,所以就会转发给主机M,主机M再转发给主机A。此时中间人就可以截取篡改主机A和另一台主机通信的数据。
7127

被折叠的 条评论
为什么被折叠?



