一点一滴成长

导航

TCP/IP协议(3):数据链路层

OSI数据链路层上的协议有Ethernet/IEEE802.3/IEEE802.4/IEEE802.5、 ARP、RARP等。

1、Ethernet(以太网)

  链路层支持很多协议,比如Ethernet、IEEE802.3、IEEE802.4、IEEE802.5等,使用哪种协议取决于网络所使用的硬件。

  TCP/IP使用Ethernet以太网来作为LAN局域网上的技术,它采用一种称作CSMA/CD(带冲突检测的载波侦听多路接入)的媒体接入方法,标准以太网的传输速率为10Mbps,以太网帧格式如下:

  

  IEEE802.3:以“以太网”为技术原形,本质特点是采用CSMA/CD 的介质访问控制技术的网络.IEEE802.3与Ethernet略有区别,但在忽略网络协议细节时,人们习惯将IEEE 802.3称为Ethernet。IEEE802.4针对令牌总线网络,IEEE802.5针对令牌环网络。

2、MAC地址

  MAC地址就是物理地址,它由二层数据链路层负责,以太网帧头的源地址和目的地址就是指MAC地址。一块网卡对应一个MAC地址,MAC地址使用6个字节来表示,它是由IEEE管理的,每个MAC地址都是全球唯一的。两台主机通信,最终是通过网卡将数据发送给对方的,所以知道目的主机的MAC地址很重要。

  MAC地址会耗尽吗?答案是以后有可能会被用完的,如果MAC地址用完了其实也没那么糟糕,由于网络模型的特殊性,MAC地址不会被传播到当前网络之外的地方(以路由器为分界)来使用,所以只要保证在一个路由器内没有MAC地址重复,那么网络就是正常的。

3、ARP、RARP

   ARP是地址解析协议,它可以根据主机内网IP地址获取其MAC地址,在IPV6中使用NDP来代替ARP。ARP工作在局域网内,当数据从WAN发送到路由器、局域网内两台同网段的主机收发数据、局域网内两台不同网段的主机收发数据 等情况都会使用ARP协议。

     ①:局域网内两台同网段的主机收发数据:每台主机(包括路由器)都会维护一个ARP缓存表,上面保存了IP地址和MAC地址的映射关系。当源主机向目的主机发送数据的时候会在ARP缓存表里根据目的主机IP地址查询其MAC地址,如果查到的话就将数据中MAC地址填充,然后发给目的主机。如果在ARP缓存表中没有找到目的主机的MAC地址则会向本地网段发起一个ARP请求的广播数据包,收到广播包的目的主机同样会将源主机MAC地址写入自己的ARP缓存表中,然后发回一个ARP应答包,里面包含了目的主机的MAC地址,其他非目的主机会忽略该ARP广播。这样源主机就得到了目的主机的MAC地址,然后将它写入ARP缓存表中,这样就可以向目的主机发送数据了。

    比如我们ping局域网内的一台主机,在本机抓包的话可以看到发送的数据的以太网帧中的源MAC地址就是本机MAC地址,目的MAC地址就是目标主机的MAC地址,收到的回复数据的以太网帧中的源MAC地址就是目标主机的MAC地址,目的地址就是本机MAC地址。本机发送的数据中的IP帧中的源地址即本机局域网地址,目的地址即为目标主机局域网地址,收到的数据中的IP帧中的源地址即为目标主机局域网地址,目的地址为本机局域网地址,在目标主机上抓包的话也是如此。

     ②:局域网内两台不同网段的主机收发数据:比如源主机位于192.168.0网段,目的主机位于192.168.1网段。源主机向目的主机发送数据时需要通过ARP获得目的主机MAC地址,而这时发现目的主机不在同一网段内,需要使用默认网关(路由器),源主机同样可以通过发送ARP广播获得默认网关的MAC地址,然后源主机将默认网关MAC地址填充到数据报并发送给网关,网关收到数据后通过检查目的IP地址发现不是给自己的,所以要对数据进行路由,根据它的路由表做转发,将数据报发给目标路由器,目标路由器收到数据后通过检查IP地址发现目标主机位于本网段中,然后它同样通过ARP协议获得目标主机的MAC地址,将目标主机MAC地址写入数据报并发送给目标主机。

   比如我们ping局域网内不在同一网段的一台主机,在本机抓包的话可以看到发送的数据的以太网帧中的源MAC地址就是本机MAC地址,目的MAC地址则不是目标主机的MAC地址(因为不在同一个网段,所以不会像第一种情况那样持有MAC地址缓存表,所以就没有目标主机的MAC地址),IP帧中的源地址即本机局域网地址,目的地址即为目标主机公网地址,收到的回复数据的以太网帧中的源MAC地址是路由器MAC地址而不是对方MAC地址,目的地址是本机MAC地址,IP帧中的源地址即为目标主机公网地址,目的地址为本机局域网地址。

     ③:当数据从WAN发送到路由器:路由器通过NAT获得目标主机的内网IP,然后通过ARP协议获得目标主机的MAC地址,将MAC地址填入数据报后发往目标主机。

       比如我们在局域网内的电脑上ping一台公网主机,在本机抓包的话可以看到发送的数据的以太网帧中的源MAC地址就是本机MAC地址,目的MAC地址则不是目标主机的MAC地址(因为是公网电脑,所以不会像第一种情况那样持有其MAC地址缓存表,所以就不知道目标主机的MAC地址),IP帧中的源地址即本机局域网地址,目的地址即为目标主机公网地址,收到的回复数据的以太网帧中的源MAC地址是路由器MAC地址,目的MAC地址是本机MAC地址,IP帧中的源地址即为目标主机公网地址,目的地址为本机局域网地址。如果是在目标主机即公网电脑上抓包的话,收到的数据的以太网帧中的源MAC地址不是发送电脑的MAC地址(为路由器地址?),目的MAC地址是本机MAC地址,IP帧中的源地址为局域网主机所在的公网IP,目标地址有可能不是目标主机的公网地址(因为使用的是云主机,虽然有公网IP但实际上也是局域网电脑),发送的数据的以太网帧中的目的MAC地址不是目的电脑的MAC地址(为路由器地址?),源MAC地址为本机MAC地址,IP帧中的目标地址为局域网主机所在的公网IP,源地址有可能不是本机公网IP地址(原因同上)。

   ARP欺骗:A发送广播请求C的MAC地址,而B收到广播后冒充C进行回应(ARP应答数据中目的IP地址为C而MAC地址为B),A收到回应后会认为B就是C。

   RARP是反向地址转换协议使只知道自己硬件地址的主机能够知道其IP地址,这种主机往往是无盘工作站,因此RARP协议目前已很少使用。

4、MTU

  MTU(Maximum Transmission Unit)称为最大传输单元,它跟链路层协议有着密切的关系,对于以太网传输来说,由于其电气方面的限制,每个以太网帧的大小都有最大1518bytes和最小64bytes的限制,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。由于以太网最大的数据帧是1518Bytes,刨去其帧头14Bytes和帧尾CRC校验部分4Bytes,那么剩下承载上层协议(IP协议)的地方也就是最大就只能有1500Bytes,这个值我们就把它称之为MTU。

  因为有MTU这个限制,所以网络层的IP协议负责检查每个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否作“分片”处理,这就是所谓的“IP分片”,分片最大的坏处就是降低了传输性能。

  如果应用使用的是TCP协议的话,那么分片的工作就由TCP协议处理了,因为TCP协议中有MSS(最大分段大小)来进行类似IP协议中这种检查,这就是“TCP分片”。下面这张图解释了MTU和MSS的关系,可以看出来MSS最大为MTU(1500)-IP头长度(20)-TCP头长度(20) = 1460,所以当我们使用TCP协议发送数据的时候,发送的数据最好不要超过1460大小,否则会分为两个以太网帧来发送。

  

  为什么有了“IP分片”还会有“TCP分片”?这是因为如果IP层分的某一片数据丢失了,由于TCP不知道也不关心IP层分片的细节,所以保证可靠性的TCP协议会对整个数据包进行重传,所以TCP会加入MSS来避免IP层的分片。而UDP协议同样不保证可靠性,所以它可以直接使用IP层进行分片,所以UDP数据超过MTU(1500)-IP头长度(20)-UDP头长度(8) = 1472个字节就会进行IP分片。
  

posted on 2017-05-24 16:09  整鬼专家  阅读(793)  评论(0编辑  收藏  举报