本篇目标1.了解网络传输基本流程2.认识MACIP地址3.了解数据包封装和分用过程一.网络传输基本流程1.局域网通信原理1.1.举例说明本次以局域网中的以太网为例子我们先想一个问题两台主机在同⼀个局域网是否能够直接通信先举一个生活中的例子来回答李老师正在教室里上课。当老师喊“小王”并提出问题时教室里的张三、李四和王五虽然也能听见老师说话但他们发现老师叫的不是自己的名字因此不会回答而是直接忽略这条信息。小王听到自己的名字后知道老师是在和自己说话于是接收问题并作出回答。小王回答时目标是李老师其他同学听见后同样不需要处理。在这个过程中姓名用于标识信息的发送目标“小王”表示问题应该由小王接收。“李老师”表示回答应该交给李老师。其他人即使听到了信息发现目标不是自己也会将其忽略。局域网中的计算机通信也需要类似的标识。那么在以太网中每个网络接口都具有一个 MAC 地址用于在局域网中标识对应的网络接口。所以想要直接通信需要包含一下的两个东西源 MAC 地址表示数据由谁发送。目的 MAC 地址表示数据要发送给谁。1.2.认识MAC地址接下来就让我们认识一下MAC地址吧!作用识别数据链路层中相连的节点;长度为 48 比特位即 6 个字节⼀般用16 进制数字加上冒号的形式来表示例如 08:00:27:03:fb:19注意mac地址在网卡出厂时就确定了不能修改mac地址通常是唯⼀的(虚拟机中的mac地址不是真实的mac地 址可能会冲突也有些网卡支持用户配置mac地址).接下来让我们以一个图片来认识以太网的通信原理如图解释首先主机 A 向主机 E 发送数据。在共享式以太网中主机 B、C、D 和 E 的网卡都能收到该数据帧。每台主机都会检查数据帧中的目的 MAC 地址。主机 B、C、D 发现目的 MAC 地址与自己的 MAC 地址不匹配因此将数据帧丢弃主机 E 发现目的 MAC 地址与自己的 MAC 地址匹配因此接收该数据帧。特点• 在以太网中任何时刻只允许⼀台机器向网络中发送数据• 如果有多台同时发送会发生数据干扰我们称之为数据碰撞• 所有发送数据的主机要进行碰撞检测和碰撞避免• 没有交换机的情况下⼀个以太网就是⼀个碰撞域• 局域网通信的过程中主机对收到的报文确认是否是发给自己的是通过目标mac地址判定。可能有人会有这个疑问只允许⼀台机器向网络中发送数据和如果有多台同时发送这两个不是很矛盾吗答案这两句话并不矛盾其主要意思是在同一个碰撞域中同一时刻只能有一台主机成功地发送数据。如果主机 A 和主机 B 同时发送数据两个信号就会相互干扰从而发生数据碰撞。双方在发送过程中都会进行碰撞检测。检测到碰撞后它们会立即停止发送然后分别随机等待一段时间再重新尝试发送数据。2.数据传输初步明白了局域网通信原理再来看同⼀个网段内的两台主机进行发送消息的过程如图而其中每层都有协议所以当进行上述传输流程的时候要进行封装和解包封装如图• 报头部分就是对应协议层的结构体字段我们⼀般叫做报头• 除了报头剩下的叫做有效载荷• 故报文报头有效载荷解释假设用户 A 想通过网络发送一句你好这里的“你好”只是为了方便理解。计算机中实际传输的是经过字符编码后的二进制数据。1. 应用层封装应用层首先按照应用层协议组织数据应用层报头 | “你好”其中你好是用户真正想发送的数据。应用层报头记录应用程序约定的信息。经过应用层封装后应用层报头 “你好”整体成为传输层眼中的有效载荷。2. 传输层封装应用层数据向下交给传输层。传输层不会修改应用层数据的内部结构而是在其前面添加传输层报头传输层报头 | 应用层报头 | “你好”此时应用层报头 “你好”是传输层的有效载荷。而整个传输层报头 应用层报头 “你好”又会成为网络层的有效载荷。3. 网络层封装传输层数据继续向下交给网络层。网络层添加 IP 报头网络层报头 | 传输层报头 | 应用层报头 | “你好”IP 地址(后面讲)用于确定数据需要从哪台主机发送到哪台主机。4. 数据链路层封装网络层数据继续交给数据链路层。以以太网为例数据链路层添加以太网帧头链路层报头 | 网络层报头 | 传输层报头 | 应用层报头 | “你好”链路层报头中主要包含源 MAC 地址目的 MAC 地址上层协议类型然后网卡将完整的以太网帧转换成电信号、光信号或者无线信号发送出去。解包与分用如图解释1. 网卡接收完整数据帧主机 B 的网卡最先收到的是完整的以太网帧链路层报头 | 网络层报头 | 传输层报头 | 应用层报头 | “你好”网卡接收到数据后将其交给数据链路层处理。2. 数据链路层解包数据链路层只关心链路层报头主要检查目的 MAC 地址是否是自己的。数据帧是否发生错误。上层协议是什么。确认数据帧应该由自己接收后数据链路层去掉链路层报头网络层报头 | 传输层报头 | 应用层报头 | “你好”3. 网络层解包网络层接收到 IP 数据报网络层报头 | 传输层报头 | 应用层报头 | “你好”处理完成后去掉网络层报头传输层报头 | 应用层报头 | “你好”4. 传输层解包传输层收到传输层报头 | 应用层报头 | “你好”处理完成后去掉传输层报头应用层报头 | “你好”5. 应用层解析数据应用程序收到应用层报头 | “你好”应用程序根据对应的应用层协议解析应用层报头然后取出真正的用户数据“你好”最终用户 B 才能看到发送方传来的消息。解包就是每一层解析并去掉属于本层的协议报头将剩余数据交给上一层。然后我们要谈谈几个问题了1.为什么是自顶向下封装答网络数据由上层的用户程序产生而用户程序不能直接操作底层网卡只能通过系统调用把数据交给操作系统。操作系统再按照协议栈从上到下依次处理数据最终通过网卡驱动控制网卡发送数据。2.每一一层解包后上层协议有这么多如何做到将自己的有效载荷交付给上层具体的一个协议的答这里就是分用的作用了分用就是一层收到数据后根据报头中的某个字段决定把数据交给上层的哪个协议或者哪个应用程序。3同层之间都认为自己在和对方同层协议之间在通信答发送方某一层添加的协议报头由接收方对应层解析但数据实际仍然要经过发送方自顶向下封装、网络传输以及接收方自底向上解包。4.为什么叫做协议栈答发送方的数据从应用层向下传递每经过一层就添加一个本层报头如图接收方按照相反的顺序处理如图也就是说最后添加的链路层报头最先被解析最先添加的应用层报头最后被解析具有“后进先出”的特点。3.跨络络传输流程3.1.认识IP地址IP 协议有两个版本IPv4和IPv6凡是提到IP协议,没有特殊说明的默认都是IPv4。作用用来标识网络中不同主机的唯一地址;大小IP 地址是⼀个 4 字节32 位的整数;注意通常也使用点分十进制的字符串表示 IP 地址例如192.168.0.1;用点分割的每⼀个数字表示⼀个字节范围是0 - 255 192.168.0.1 ;然后跨网段的主机的数据传输数据从⼀台计算机到另⼀台计算机传输过程中要经过⼀个或多个路由器如图为什么要去目标主机先要走路由器解释如果目标主机在同一局域网可以通过IP地址直接发送到目标主机但是目标主机在其他网络先交给默认网关由路由器根据目的 IP 通过MAC地址找到下一个局域网IP地址的意义如图解释首先主机 A 判断目标不在本地局域网主机 A 要发送的 IP 数据报是源IP192.168.2.2 目的IP172.168.2.2 数据你好主机 A 判断出172.168.2.2与自己不在同一个局域网因此不能直接发送给主机 B只能先交给路由器192.168.2.1。路由器收到数据后去掉原来的链路层报头。 查看目的 IP172.168.2.2。 查询路由表。 发现目标位于右边的 172.168.2.0 网络。 决定从右侧接口 172.168.2.1 发送。然后重新封装 MAC 地址源MAC路由器右接口MAC 目的MAC主机B的MACIP 地址通常保持不变源IP192.168.2.2 目的IP172.168.2.2主机 B 收到数据帧后发现目的 MAC 是自己的。目的 IP 也是自己的。于是逐层解包最终把“你好”交给用户 B。然后结合封装与解包体现路由器解包和重新封装的特点如图3.2.IP地址和MAC地址的区别解释可以把唐三藏西天取经的过程类比成一个 IP 数据报跨越多个局域网到达目标主机的过程。假设出发地东土大唐 目的地西天灵山 中途经过两界山、高老庄、流沙河、火焰山等地其中东土大唐相当于源 IP 地址。西天灵山相当于目的 IP 地址。中途经过的每个驿站相当于路由器。每两个驿站之间相当于一个局域网。唐三藏的通关文牒上始终写着出发地东土大唐 目的地西天灵山无论唐三藏目前走到了高老庄、流沙河还是火焰山他的最终目的地始终是西天。这就相当于 IP 数据报中的源IP地址东土大唐 目的IP地址西天灵山在不考虑特殊情况时数据经过多个路由器源 IP 和目的 IP 通常不会改变整个过程中始终是源IP东土大唐 目的IP西天灵山所以IP 地址负责描述数据最终从哪台主机发出要到达哪台主机。但是唐三藏不可能从东土大唐一步直接走到西天他每次只能先前往下一个地点。例如东土大唐 → 两界山 两界山 → 高老庄 高老庄 → 流沙河 流沙河 → 火焰山 火焰山 → 西天灵山在“东土大唐到两界山”这一段当前的交接信息可以理解为源MAC东土大唐驿站 目的MAC两界山驿站到达两界山以后原来的 MAC地址就没有用了。两界山重新决定下一站是高老庄并更换交接信息源MAC两界山驿站 目的MAC高老庄驿站到达高老庄后再次更换源MAC高老庄驿站 目的MAC流沙河驿站所以MAC 地址只负责当前这一段链路的交付每经过一台路由器源 MAC 地址和目的 MAC 地址通常都会改变。总结目的IP是⼀种长远目标Mac是下⼀阶段目标目的IP是路径选择的重要依据mac地址是局域网转发的重要依据。网络通信的宏观流程如图