admin 管理员组

文章数量: 887021

文章目录

  • 网络层 IP协议
    • 格式
    • 子网划分
    • 路由表
    • NAT技术
    • 格式解释
    • 分片(MTU、MSS)
  • 数据链路层 以太网协议
    • ARP协议

本篇主要讲解IP协议和以太网协议即MAC帧协议。

承上启下学习网络一定要先理解到每层的作用再去思考它们分别是如何做到的这很重要

  在网络传输过程中网络层的IP协议决定了在同一个子网内下一次传输的地址即路径选择问题,而数据链路层以以太网协议的MAC帧协议则是真正的实现地址的跳转,而之前学习的传输层的TCP协议则是提供策略保证可靠的传输若出现问题进行兜底

理解每层的作用再来学习是如何做到的

网络层 IP协议

格式


  当拿到要通信的对端的IP地址后,网络层是如何进行路径选择的?难道是全网内一台一台主机地毯式的进行询问排查搜索吗?肯定不是!这里可以理解——路径选择的本质就是查找而查找的本质也可以解释为排除,一次查找排除的更多那么这个查找效率就更高,而路径选择的本质也是利用此原理——设计了子网划分的概念。

子网划分

怎么理解子网划分提高了路径选择的效率?

   理解在全国寻找一个人(不是抓逃犯是找朋友的感觉)
  假设国家没有构造出省份更没有构造出市县镇的概念,那么当你拿到那个人的身份证时,只能得知此人在中国内(没有子网划分,只能得知通信的对端在网络内),而若有省市县镇你就可以一层一层的不断的进一步缩小范围,可能找到最后你只需要到小区门口喊一嗓子就能得到他的回应继而找到此人,再理解上述提到的查找的本质是排除,一次查找选择一个省就相当于排除了其他所有省中所有的人因此效率很高——子网划分就是这种原理。

那么子网又是如何划分的?先认识IPV4地址的构成

  IPV4 长度32位即4字节 通常我们看到的都是以十进制表示 分4组按 . 划分每段占8位如192.168.1.104
  IP地址被划分位两个部分 分别是网络号和主机号。网络号保证相互连接的两个网段具有不同的标识而在同一个网段内网络号相同主机号必须不同

如上述IP地址为什么如此表示?为什么被分为两部分?本质就是子网划分的结果

  理解一下自身的学号一个班最多不超过100人为什么不只是一个两位的编号?而是一长串最后的两位才是自身在班级里的编号,因此也可以理解学号也是被两部分构成 前部分为了快速找到你 后一部分才是你正真在班级的编号
  不同的子网其实就是把网络号相同的主机放到一起

过去子网的划分是把所有的IP地址分为五类

  主要看ABC三类 理解其子网划分
  同一个子网内网络号相同主机号不同,假设我申请了一个B类网络地址,那么我就可以构建一个以该网络号相同的子网并在子网内我能够接入最多2^16位台主机,把视野拉开整个网络里都是各种大大小小ABC类的子网,此时我有着我想要通信的对端的IP地址,我就能先通过IP地址的前几位判断出是A类还是BC类,在依次往后拿到其网络号,通过该网络号在找到该子网,然后再通过对比主机号找到我要通信的对端,假设该对端是B类的网络地址,那么只通过一次查找IP地址的前几位我就能排除所有的A类和C类,再通过往后的14位网络号我又能排除所有在B类网络中的其他子网,这就是子网划分的意义大大提升了路径选择的效率 理解一层一层逐步逼近。

  上述也说的是过去的子网划分手段那么为什么现在不用了?他有什么缺点?
首先一个A类地址能接入 2^24即16,777,216台主机,B类地址则是能接入2 ^16即65,536台,C类只有256台,因此A类太大而C类又太小导致大部分的组织企业都会申请B类地址,而B类网络地址也最多只能申请2 ^14个,导致B类地址很快就被分配完,继而若申请A类则浪费C类则不够用。
但是在实际网络架设中即使是B类网络地址也不会存在一个子网内连接6万多台的主机更不用谈A类网络地址,造成的现象就是大量的IP地址都被浪费的同时IP地址数又很紧缺

而现在的子网划分的方案则是引入 子网掩码 的概念来区分网络号和主机号称为CIDR

  子网掩码也是一个32位的正整数 也分两部分 假设为第一部分和第二部分 第一部分必定全1 第二部分必定全0
  将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号
  网络号和主机号的划分与这个IP地址是A类、B类还是C类无关

  有了子网掩码之后子网划分就会变得非常灵活进而减少IP地址的浪费,具体的应用和如何做到划分可以看下面的连接

转载自乘香墨影

  他里面说的互联网就是被切分成一个个子网下存在的,一个个子网往下还可以继续切分,但是对外就是一个整体。所以 CIDR 这种方式,/x 这个数值越小,说明当前子网下的主机数量越多。反之可以通过增加 /x 来继续进行子网的划分。

  上述所说的对外是一个整体的理解就非常通透,因为在网络通信中目的网络号是不断变化的随着路由不断精细,直到在一个子网内找到该主机

  这个/x是IP地址和子网掩码一种简洁的表示方式例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高24位是1,也就是255.255.255.0

路由表

  那么理解子网掩码的方式划分子网之后,再来理解一下路由表就可以理解如何进行路径选择
在网络通信中每一个节点都会保存一张路由表,这里的节点不仅包括路由器也包括每一台主机

  那么路由表中具体会保存哪些信息?

  路由表保存该节点所连接的所有子网的子网掩码和目的网络号的条目(子网掩码和目的网络号成对对应)、出接口、下一跳的地址和默认缺省路由条目等


  上述路由表中Destination是目的网络号 Gateway是下一条的地址 Genmask是子网掩码 Iface则是发送网络接口 Flags中的U标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发(Metric和Ref不考虑)

  可以看到上述路由表中,该台主机连接在两个子网中网络号192.168.10.0 192.168.56.2
其中127.0.0.0表示为本地回环的网络号多用于网络检测
default则为缺省路由作用为当一个数据包的目的网络号不和该节点的的路由条目匹配,那么该数据包就会被发送到缺省路由规定的下一跳的地址

那么路由表的作用是什么?

例一:如果要发送的数据包的目的地址是192.168.56.3
  192.168.56.3跟第一行的子网掩码做与运算得到192.168.56.0,与第一行的目的网络地址不符再跟第二行的子网掩码做与运算得 到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去; 由于192.168.56.0/24正是与eth1接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转 发

例二:如果要发送的数据包的目的地址是202.10.1.2
依次和路由表前几项进行对比, 发现都不匹配;按缺省路由条目,从eth0接口发出去, 发往192.168.10.1路由器;由192.168.10.1路由器根据它的路由表决定下一跳地址;

  而上述的两个例子只是数据在路由过程中经历的一次路径选择 事实上数据在进行跨网络传输的过程也就是不断的重复上述的操作,在节点的路由表中匹配寻找下一跳的地址不断不断的 “跳到” 一个个子网中直到在其中一个子网内找到要通讯的对端主机

  可以看到节点在路径选择中地位重要,其中不要只认为路由器是节点还要理解其实我们自己的机器也是一个个节点,不然在传输中我们自己的机器没有路由表又该如何根据接收端IP地址判断是在自己的子网中直接不通过路由器进行传输还是交给缺省路由呢?

  那么再来理解一下路由器这个节点
  首先路由器一般代表一个子网的出口或者入口 主机号为1 且路由器工作在网络层
  为什么路由器主机号为1?
  那是因为路由器的功能为构建子网(例如手机开热点 构建子网)入网时路由器是第一个主机所以主机号为1
  怎么查看?你们可以再自己的window下查看一下自己IP配置信息 命令提示符输入ipconfig

  在结合学到的知识就能理解就算我们的网络没有搞好,我们依旧可以登录路由器的页面(访问路由器的IP地址)对路由器进行设置——因为同一个子网内可以直接通信

  再准确的理解之前说过路由器工作在网络层,那么上图的的路由器页面是什么?难道不是一个HTTPS的响应吗而HTTPS响应不应该是应用层的知识吗?所以说现在认为路由器只工作在网络层是不准确的,在再后面学习NET技术的时候,路由器还能去查看数据包的端口号信息(工作在传输层)

  而再跨网络传输过程中,我们不认识该数据包的目的网络交给缺省路由即路由器,那么路由器又该怎么做呢?首先可以肯定的是路由器肯定不会再从传输过来的子网中查找,所以他只会从他连接的其他子网中匹配目的网络号是否配对依次类推。所以可以得到肯定一点是一个路由器最少也要连接两个子网。

理解下图

  特别是 “脱 穿”报头这部理解,上图也表示了网络层只是 选择了路径 至于正真实现路径 ”跳“这个动作则是靠数据链路层

  再回到这张图,我把我的IP地址暴露出来了会有危险吗?会遭到攻击吗或者你能和我建立连接吗?
  这里就要再理解一下了
  我们IP地址(IPV4)32位 假设CIDR(子网掩码)能使每个IP地址都不浪费可是IP地址就只有32位,2^32 大概有43亿而每个主机都需要一个IP地址 (另外IP地址并非是按照主机台数来配置的, 而是每一个网卡)还有一些特殊的IP不能够使用,所以只是CIDR技术IP地址早就不够用了

那么现在我们是怎么做到突破IPV4 32位物理层的限制从而解决IP地址不够用现状呢?主要是两点

  1. IPV6
  2. NAT技术

还有一个为动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的(不是关键)

  首先讲IPV6 IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及我们国家是IPV6推进的主力军 而不急着推进IPV6的最根本的就是NAT技术

NAT技术

讲NAT技术就必须理解现在的网络体系 私有IP和公有IP

私有IP的范围

  • 10.*,前8位是网络号,共16,777,216个地址
  • 172.16.到172.31.,前12位是网络号,共1,048,576个地址
  • 192.168.*,前16位是网络号,共65,536个地址
    包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);

  结合上图理解私有IP地址是可以重复出现的只要在一个子网中不相同即可 且每个路由器都配置两个IP地址WAN口IP和LAN口IP,连接在路由器的LAN口就属于该路由器的子网中用于局域网之间的通信,而WAN口IP则是连接上一级的子网中(理解缺省路由方面的知识)只要私有IP地址在同级(不是同层)都是可以完全相同的,因此在你查看自己的IP地址的时候你的默认网关通常也是192.168.1.1而你的IP地址自然不用说一定也是一个192.168开头的私有IP地址

  因此网络中也一定做不到和一个私有IP地址进行通信(因为私有IP地址不唯一),路由器在解包读到目的IP地址是个私有IP时直接会把该数据包丢弃——因此只有公有IP地址才能在网络中进行数据传输

  基于这点再来想一想套接字通信原理 [(源IP,源端口) , (目的IP,目的端口)],现在我们可以确保目的IP一定是公有IP地址之后,那作为一台发送方的主机我的IP又一定是私有IP地址,那接收方收到我的数据之后又如何封装他的响应报头和我进行通信呢?一定不会是封装发送发的私有IP地址——NAT技术解决

  不要误解 不是WAN口IP就一定是公有IP,只有一级一级往上的外层的运营商路由器的WAN口IP才会是公有IP 所以有时候换个角度理解局域网的话,也可以把该WAN口IP是公有IP地址的路由器之内都解释为一个 ”局域网“ 再换个角度理解NAT技术就可以解释为 一个局域网内的所有主机共用一个公有IP地址,所以缓解了IPV4不足的问题

下面就来讲NAT技术
主要逻辑:子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP,而上述这些转换IP的映射都会被保存在一个表中用于接收端发送其响应的数据 继而使接收端也能找到发送方(IP转换


例子1主机A访问服务器B
源IP地址192.168.1.201 目的IP地址122.77.241.3
第一步:主机A在其路由表中配对认识到目的主机不是在这个子网内因此发送给了缺省路由即路由器,之后路由器就会把解去数据链路层协议的报头并向网络层提交再读到数据包中的IP地址并把它的源IP地址替换成其WAN口地址10.1.1.2并会把替换的关系保存起来

第二步:家用路由器依旧配对把数据发送到运营商路由器同样把源IP地址替换成其WAN口地址并把替换的关系保存起来

然后就是运营商路由器进行路径的选择,匹配路由表后直接就发送到服务器B(路由表作用忘了就去看上面的知识)

那么之后服务器B再给主机A响应数据又是如何做到呢?很简单因为替换的关系都被维护着
第一步:

第二步:


这样就可以做到主机A和服务器B来回的通信

  但是这样依旧有局限性如 如果在一个子网内分别由两台不同的主机都访问同一个服务器就会造成IP转换的映射关系形成多对一的关系,服务器的响应数据不知该给哪台主机。
例子:主机A和主机C都和服务器B通信

所以两个报文的源IP地址都经过路由器的替换变成相同,若服务器B给主机A响应时候会遇到什么情况?

因此就有了了NAPT技术 简单来讲就是新增了端口号来建立映射关系而这种映射关系表也是由路由器自动创建保存的

NAPT技术

  NAPT与动态地址NAT不同,它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的TCP端口号。NAPT算得上是一种较流行的NAT变体,通过转换TCP或UDP协议端口号以及地址来提供并发性。除了一对源和目的IP地址以外,这个表还包括一对源和目的协议端口号,以及NAT盒使用的一个协议端口号。
  NAPT的主要优势在于,能够使用一个全球有效IP地址获得通用性。主要缺点在于其通信仅限于TCP或UDP。当所有通信都采用TCP或UDP,NAPT允许一台内部计算机访问多台外部计算机,并允许多台内部主机访问同一台外部计算机,相互之间不会发生冲突

上述引用百度百科的解释 好好理解特别是加粗为重点

例子1:主机A端口号为21的进程访问服务器以及主机C端口为20的进程访问服务器

  因为维护了两个不同的映射关系,服务器B若要对主机A响应 依旧使用NAPT加上主机A端口号为21 就能有唯一的映射关系成功返回到主机A处

  但是还有一种更加极端的情况 那就是 同一子网内两台主机访问同一个服务器并且它们的端口号也相同(因为端口号用来区分一台主机中的各进程,因此不同主机的端口号是可以相同的),那这时候路由器也会做出调整使其还是形成唯一的映射关系
例子2:主机A端口号为20 和 主机C端口号为20 都访问服务器B


  至于修改哪个修改成多少都是路由器自身决定的而这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项
从上述也能理解一点一棒子打死路由器只工作在网络层是不正确的(端口号位于传输层因此NAT的路由器也能解释传输层的报文)

NAT技术的缺陷
1、无法从外部局域网内部的私有IP服务器发起请求连接
  例如最开始的那张图,服务器B若要想和发起向主机A建立连接 但是因为主机A只有私有IP地址而私有IP地址并不唯一所以NAT技术的通信必须由私有IP主机发起
  所以,如果我们自己编写的服务器程序如果要想被所有的人访问到,就要将程序部署到具有公网IP的服务器上。

2、转换表的生成和销毁都需要额外的开销

3、在通信过程中一旦NAT设备出现故障,所有的TCP都会断开连接。

  理解了上面 如何子网划分、路由表配对、私有IP公有IP、NAT NAPT技术就能够完整的理解数据从上到下再进入网络路径选择的步骤。
  因此网络层的IP协议如何进行路径选择的逻辑就讲完了
  接下来就要回到IP协议的报头的解释

  我认为上述能够理解才是最重要的

格式解释

  • 4位版本号: 指定IP协议的版本, 对于IPv4来说, 就是4
  • 4位头部长度: IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大
    的数字是15, 因此IP头部最大长度是60字节(也可以这么理解四位首部长度全0和全1代表的范围为【0,15】,其单位为4字节也可以解释为以四字节为一行,报头一共有几行,而因为除选项的报头固定大小20字节即5行所以四位首部长度大小范围【5,15】。)
  • 8位服务类型: 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要
  • 16位总长度: IP数据包整体占多少个字节
  • 16位标识: 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的
  • 3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话,最后一个分片置为0, 其他是1. 类似于一个结束标记
  • 13位分片偏移: 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置
  • 8位生存时间(TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL-= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环(死循环浪费资源)
  • 8位协议: 表示上层协议的类型
  • 16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏
  • 32位源地址和32位目标地址: 表示发送端和接收端
  • 选项字段忽略

分片(MTU、MSS)

上述大多数字段都是读完就理解了,重点讲解16位分片标识、3位标志和13位片偏移

这三个字段用于分片操作,为什么要要有分片?就要先理解什么是MTU

MTU定义

  最大传输单元(Maximum Transmission Unit,MTU)用来通知对方所能接受数据服务单元的最大尺寸,说明发送方能够接受的有效载荷大小
  以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500字节和1492字节。链路层的这个特性称为MTU,即最大传输单元。不同类型网络的数帧长度大多数都有一个上限如果IP层有一个数据包要传,而且数据帧的长度比链路层的MTU还大,那么IP层就需要进行分片( fragmentation),即把数据包分成干片,这样每一片就都小于MTU。

  上述就解释了为什么要分片,还有明白MTU是数据链路层的定义,一般MTU的大小为1500字节注意MTU大小是指数据帧的有效载荷大小。
我的云服务器MTU大小为1500字节

那么理解为什么分片操作位于是在IP层?

  因为数据链路层中规定了MTU的大小 所以IP层在向下传输时必须要比MTU要小
  但是IP层并不能决定传输报文的大小 正真决定传输报文的大小是由上层的TCP协议决定的(滑动窗口、拥塞窗口),就可以把IP层理解为一个跑腿办事的,假设传输层往下传输一个较大的报文而数据链路层不会传输比MTU大的数据帧,此时IP层只能自己想办法减小一次传输报文的大小即分片操作。(后面也会讲尽量不要分片)

理解完上述在来看一个粗粒度的分片操作 理解一下这三个字段。

16位分片标志:就好比一个报文的序号不同的数据又不同的序号,需要分片的数据分片标识相同(同理TCP协议的序号)
3位标志:只讲第三位 置1 表示该数据是被分片了的,不同最后分片数据的最后一个分片标志为0
13位片偏移:就可以理解为分片之后每一个分片在原始报文的起始位置就是一个偏移量的概念

  当然理解分片不只要理解为什么分怎么分还有知道该怎么组装即把多个分片组装回原本的一个报文。(为什么组装,那是因为分片分的是传输层传来的数据段,若不组装直接向上交付给传输层,传输层拿到的都不是一个完整的报文无法解包再向上交付)

该如何组装就要先知道该数据是否被分片是否需要组装
那么就重点从标志和片偏移出发,首先一个报文没有被分片其标志为0且片偏移为0,那么反向就是都是被分片的数据

  1. 标志为1 片偏移=0 (分片首部)
  2. 标志为1 片偏移>0(分片中部)
  3. 标志为0 片偏移>0(分片尾部)

总结就是标志和片偏移都不是0那该数据就是被分片了的(结合上图和标志、片偏移的定义理解)

注意:因为传输数据过大在IP层进行分片,而每一个分片后往下传输数据也都是一个数据包,我想说的是这些被分片成多段的数据在下层和在网络中传输过程中都是一个完整的报文。结合下图

所以说分片后的数据在传输过程中和别的没有分片的数据都是一样的,也因此也会出现丢包问题。

  那么若分片后的数据丢包后该怎么解决?
  首先第一点就是在组装时如何知道有分片的数据丢包了,分片首部和尾部的数据都很容易检查出,若没有标志为1片偏移为0即首段丢包,若没有标志为0片偏移>0即尾部丢包,那么中间是否丢包就要结合其他的字段——16位总长度 因为有片偏移的存在所以组装的时候也就是把分片的数据根据片偏移升序排序,而后一个分片的数据的片偏移一定是前一个分片数据的片偏移加上其16位总长度,若不匹配则中间有分片数据丢包。结合下图理解

  紧接着就来理解如果发现 分片后的数据丢包了该怎么办?可以肯定的是若TCP协议则一定会重传而UDP协议则是一个分片数据丢包那么就把整个和该分片标识相同的分片全部丢弃

  那么就有一点需要理解TCP协议一定会重传是只重传丢包的分片数据还是整个完整的数据段

  答案:整个完整的数据段
  为什么?
  从高内聚低耦合角度理解最好理解,分片是网络层进行的操作所以位于传输层的TCP协议并不会知道哪一块分片数据丢失,所以它只会重传一个完整的数据段,当然也肯定可以有方案使TCP只重传那一块分片数据但是这就使耦合度增加TCP协议还要知道IP协议如何进行分片操作。

  最后再来思考分片操作好吗?——不好
  因为过多的分片会增加丢包率 假设在此时的网络环境中丢包率为0.5% 当TCP协议给IP协议一个很大的数据段,IP协议对其分片假设分成了五片,那么只要是这五片中的任意一片数据丢包就需要TCP协议重传数据段(当然丢包率不会是2.5%,概率知识我不会算反正丢包率会因为分片而增加)
而对于TCP协议来讲增加丢包率重传概率上升不就意味着TCP协议要维护的滑动窗口成本增加,在最开始讲到的是否分片并不是IP层所能决定的他只是一个跑腿的只负责传输TCP协议给他的数据段过大数据链路层又不接收只能自己分片,那么此刻分片操作对于TCP来讲它好吗?——肯定也不好 因此TCP协议也要有一个传输数据的大小上限——终于可以引出最后的知识MSS
MSS定义

  最大报文段长度(MSS)是TCP协议的一个选项,用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度(MSS不包含TCP协议报头长度)。

区分MSS与MTU

  最大报文段长度(MSS)与最大传输单元(Maximum Transmission Unit, MTU)均是协议用来定义最大长度的。不同的是,MTU应用于OSI模型的第二层数据链接层,并无具体针对的协议。MTU限制了数据链接层上可以传输的数据包的大小,也因此限制了上层(网络层)的数据包大小。例如,如果已知某局域网的MTU为1500字节,则在网络层的因特网协议(Internet Protocol, IP)里,最大的数据包大小为1500字节(包含IP协议头)。MSS针对的是OSI模型里第四层传输层的TCP协议。因为MSS应用的协议在数据链接层的上层,MSS会受到MTU的限制。

上述为百度百科的解释结合下图一起理解MSS和MTU

  现在就要进一步明白TCP协议在传输数据的时候不仅要考虑 对端接收缓存区大小、网络环境拥塞情况还要考虑MTU的大小(所以不能把滑动缓存区的所有数据直接打包成一个数据段向下传输,对端接收缓存区能接收不意味着网络环境和MTU大小能符合)

  上述基本内容已经讲完但是还有一点还没讲明白那就是为什么会定义出MTU大小,数据链路层在传输数据时受什么限制从而要定义出MTU大小?(只能在下面数据链路层板块讲需要讲的前提有点多)

  网络层IP协议完结最主要理解我始终认为是如何进行路径选择(路由表,子网划分,NAT技术)

数据链路层 以太网协议

  数据链路层定义
  网络层中已经学习了跨网络通信时下一跳的地址也知道了为什么是这样跳的过程,但是具体是怎么实现数据的发送则交给了数据链路层解决。

  一直都说在同一个子网内或者局域网内可以直接通信,是如何做到的?且正确理解跨网络通信的本质无非就是在多个子网内进行路径选择和发送的过程,所以只要理解了在同一个子网内两台主机如何通信的问题依次类推就能完全理解跨网络通信毕竟不管你下一跳怎么选下一跳的地址都是在同一个子网内。

  数据链路层中主要讲最普遍的以太网

  以太网的定义

  以太网是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网是应用最普遍的局域网技术,取代了其他局域网技术如令牌环、FDDI和ARCNET
   以太网实现了网络上无线电系统多个节点发送信息的想法,每个节点必须获取电缆或者信道的才能传送信息,有时也叫作以太(Ether)。(这个名字来源于19世纪的物理学家假设的电磁辐射媒体-光以太。后来的研究证明光以太不存在。)每一个节点有全球唯一的48位地址也就是制造商分配给网卡的MAC地址,以保证以太网上所有节点能互相鉴别由于以太网十分普遍,许多制造商把以太网卡直接集成进计算机主板。

上述也可以明白数据链路层中现如今以太网是最普遍的技术还有别的技术但是它们都离不开MAC地址,何为MAC地址?
MAC地址定义

  MAC地址(英语:Media Access Control Address)也称为局域网地址,MAC位址,以太网地址或物理地址,它是一个用来确认网络设备位置的位址。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址
  MAC地址的长度为48位(6个字节),通常表示为12个16进制数,如:00-16-EA-AE-3C-40就是一个MAC地址,其中前3个字节,16进制数00-16-EA代表网络硬件制造商的编号,它由IEEE(电气与电子工程师协会)分配,而后3个字节,16进制数AE-3C-40代表该制造商所制造的某个网络产品(如网卡)的系列号。只要不更改自己的MAC地址,MAC地址在世界是唯一的。形象地说,MAC地址就如同身份证上的身份证号码,具有唯一性

和IP协议TCP协议一样 以太网在数据链路层中也一定有自己的格式以太网MAC帧也可以叫MAC帧(MAC帧是数据帧的一种)

字段中的目的地址和源地址这两字段其中的地址不是IP地址而是MAC地址
类型字段有三个值分别为IP、ARP以及RARP,可以解释成格式中的数据是哪种类型的最后向上交互就给对应的协议
CRC字段为校验码(不是重点)CRC定义了解

对比以往的IP协议和TCP协议的报文格式就可以看出MAC帧相比较非常简单,也正是如此。

在讲之前要先理解局域网内的通信原理是如何。

举个例子
想象在一个教室内所有的学生都在自习其中一名学生叫学生B,讲台桌上坐着老师A ,过了会老师A就在教室里说接下来我要抽一名学生来回答一下问题,所有的学生都听到了并都竖着耳朵听着老师A,“来B同学你站起来你来回答一下” 除了B同学以外的其他同学听到老师叫的不是自己所以都没有站起来并且马上就恢复自习的状态,只有B同学站了起来准备回答问题。

  解释:教室好比一个局域网,老师A和学生B好比通信的双方,当然在一个局域网中还有其他连接在局域网内的主机这些主机就是其他学生,在老师A给学生B通信时候,不止有学生B收到了老师A的数据,是在教室内的所有的学生都收到了这个数据,只不过在提取数据时只有学生B发现这个数据是在和他通信所以他就一层一层的解包不断向上传递作出反应,其他学生提取完信息之后发现不是和他通信就直接就把该数据丢弃了。

那么局域网内的各主机的怎么知道是否和自己通信或者说它们的名字是什么?

  MAC地址就是它们唯一的名字,不仅在一个局域网内唯一在全球范围内也是唯一,而MAC地址的会在数据链路层被封装,所以在局域网内所有主机在数据链路层会提取报头中目的地址大小并和自身的MAC地址比对,配对成功就向上传输,不成功就直接在数据链路层被丢弃不会再往上传输。

这就是局域网内的通信原理

  但是马上就又有一个问题,局域网中主机A向主机B发送数据 基于套接字通信我们是知道主机A一定已经知道主机B的IP地址和端口号是多少所以一层一层往下封装了数据段封装了数据包,但主机A怎么封装MAC帧呢?主机A压根就不知道主机B的MAC地址是多少啊。名字都不知道那更别谈通信了。
因此问题就是 通信双方如何获取对方的MAC地址的

ARP协议

引出ARP协议ARP协议定义

地址解析协议
OSI模型把网络工作分为七层,IP地址在OSI模型的第三层,MAC地址在第二层,彼此不直接打交道。在通过以太网发送IP数据包时,需要先封装第三层(32位IP地址)、第二层(48位MAC地址)的包头,但由于发送时只知道目标IP地址,不知道其MAC地址,又不能跨第二、三层,所以需要使用地址解析协议。使用地址解析协议,可根据网络层IP数据包包头中的IP地址信息解析出目标硬件地址(MAC地址)信息,以保证通信的顺利进行。
简单理解就是ARP协议建立了主机 IP地址 和 MAC地址 的映射关系

ARP协议报文格式

  • 硬件类型指链路层网络类型,1为以太网;
  • 协议类型指要转换的地址类型,0x0800为IP地址;
  • 硬件地址长度对于以太网地址为6字节;
  • 协议地址长度对于和IP地址为4字节;
  • op字段为1表示ARP请求,op字段为2表示ARP应答

注意理解上图中可以看到 ARP协议封装的报文实际上就可以当作数据帧的有效载荷,所以ARP协议也处于数据链路层中。
简单理解下图ARP协议的位置

那么如何理解ARP协议能够建立目标主机IP和目标MAC地址的映射呢?
当填写数据帧报文时候,并不知道目的MAC地址时就填写为全F字段 ——FFFFFF 广播地址。

理解下图 主机A想得到主机B的MAC地址 通过ARP协议

  上图可以看到依旧是结合局域网通信原理 在局域网内的所有主机都会收到主机A发送的报文,而当主机B收到一个FFFFFF的广播地址时不会直接丢弃而是会向上解包,解析到类型字段为0806就会明白该协议是一个ARP协议就会继续向上解包 交给ARP层 再会提取目的IP地址发现和自身的IP地址匹配随后就会看OP字段 解析为1明白这是一个请求报文,因此就明白主机A 是想要它的MAC地址 而此时主机B已经拿到了主机A的IP地址和MAC地址 随即发送一个OP为2的ARP应答报文 封装自身的MAC地址给主机A 这样主机A就会成功拿到主机B的MAC地址 而对于主机C来说 收到一个FFFFFF的广播会先向上解包解析到类型是0806向上交付给ARP层 但匹配目的IP地址后发现不匹配随即就会丢弃。

主机B发送响应

  经过上图中的一来一回 主机A通过ARP协议就能拿到想要通信对端的MAC地址 即就能封装数据帧 从而实现数据的发送

  但是难道在每次通信的时候都需要使用ARP协议先拿到对端MAC地址吗?这样会不会太麻烦了
  当然不是 再进行一次ARP请求应答之后 系统会缓存 相应的IP地址和MAC地址之间的映射关系从而方便下次直接封装数据帧,当然这个缓存也会有时间限制

下图就是我系统缓存的IP转MAC地址的映射表

  综上理解了ARP协议加上局域网通信原理和一个子网内实现数据传输就能够理解跨网络该如何通信无非就是进行多次的路径选择多次的数据在子网内的通信

  总结一下 根据子网掩码划分出的一个个子网实现出一个个灵活的网络号而根据NAT技术分成私有IP公有IP,私有IP在同一级可以重复这也意味着私有IP无法锁定唯一一台主机这就需要在网络层不断的对报文进行 脱穿 报头的操作 把源IP地址不断的进行替换节点又会保存替换的映射关系,这里也要记得路由器至少有两套地址 lan口对内wan口对外 ,一层一层不断的进行路径选择也就是意味着源IP地址不断的被替换至于如何实现路径的选择则是依靠路由表进行配对。而如何实现数据的传输则是在数据链路层,首先要有ARP协议进行IP地址和MAC地址的转换进而形成映射关系实现封装数据帧,而在跨网络通信中要不断要在一个子网中传输报文,这也意味着在数据链路层也要进行 脱穿 报头的操作 目的MAC地址和源MAC地址不断变化 所以说在跨网络通信中一个报文的源IP地址、目的MAC地址、源MAC地址都会不断的变化 。

  最后再理解一点 为什么在数据链路层会规定出MTU大小
  理解:局域网又可以叫碰撞域,可以把一个局域网想象成一个临界资源在同一时刻内只能通过一条报文,否则就会引起数据的碰撞即数据丢失若丢失那么数据就需要进行重传,而数据帧越长在局域网中发送时占用的时间也就越多越容易发生碰撞,换个角度若发生碰撞数据帧越长重传的成本也就越高,简单理解就是不要把鸡蛋放在同一个篮子里 所以需要规定适合的数据帧大小即MTU大小

本文标签: 网络 链路层 数据