网络层协议IP、数据链路层、NAT详解
网络层的任务就是在复杂的网络环境中找到一个合适的路径进行数据的传输。IP协议提供了一种能力这种能力就是找到目的主机的能力但是能力不代表能够百分之百完成所以需要传输层来保证可靠性比如重传等。基本概念IP曾主要是解决把数据从主机A跨网络传输到主机B所以必须标识通信双方主机的唯一性就像TCP一样使用端口号标识进程的唯一性网络层使用IP来标识主机的唯一性。IP分为目标网络和目标主机通过路由器从一个按照IP从一个子网路由到另一个子网。路由器一般只工作到网络层上层没有但是当代路由器已经是一台小型的计算机了。IP协议头格式如何实现数据报头和数据的分离使用四位首部长度20~60字节固定20字节有选项就是大于20字节一个数据报中就可以分离出抱头了接下来看16位总长度用这个长度减去四位首部长度的长度就得出了IP数据部分实现分离。如何分用看8位协议这个字段标识了上层传输层是什么协议然后进行分用交付。四位版本号标识使用的哪一种版本的IP有IPV4和IPV6IPV6是解决IPV4数量不够的一种方案我国IPV6技术最好。8位服务类型TOS标识此时的IP是提供的哪一种服务有最小延迟最大吞吐量、最小成本、最高可靠性对于ssh、telnet这类使用最小延迟对于FTP则是使用最大吞吐量。第二行三个字段后续介绍。8位生存时间TTL数据报在网络中通过路由器传输的时候有一个集线器的设备这个设备是做信号放大一类的因为数据都是以光电信号方式传输那么也避免不了在传输过程中时间长了信号会衰减那么集线器就会做信号放大但是这样以来有些数据可能一直在网络中传输不必要地占用资源出现路由循环TTL解决了这个问题它记录了某一个报文传输时经过路由器次数限制经过一个路由器TTL减去1TTL减到0还没到达那么就会丢弃这个报文。16位首部校验和光电信号在传输过程中可能出现被干扰的情况出现数据失真比如比特位翻转首部校验和在数据到达之后会进行检验只有正确的报文才会接受。IPv4用32位ip地址IPv6用128位ip地址在IP报头中有两个字段标识这个IP报文来自哪里将去往何处就是源IP地址和目的IP地址。网段划分首选要明确一点就是现在使用的网络是被运营商长时间设计过的我们在学习网络层的时候重要的是理解网络是如何被设计的。在同一个子网内部各个主机的网络号是相同的将来寻找目的主机先通过路由器按照网络号转发找到目的子网再通过IP的主机号进行主机的查找同一个网段内部主机号不同。那么也可以知道路由器一定会配置两个网段IP因为它是两个网段之间的桥梁。路由器有搭建子网的功能。为什么要这样设计为什么不直接从1到~编号呢这样设计的原因就是为了提高查找的效率就像暴力遍历查找和二分查找一样淘汰的之后前者每次淘汰一个而后者每次淘汰一半子网划分就是每次就淘汰一个网段提高了查找效率。我们平时使用的网络IP一般都是子网IP都是由路由器自动分配管理的路由器的DHCP协议会给新入子网的主机分配IP避免手动管理的麻烦。在路由器的表面包含了路由器的管理地址IP通过这个IP可以进入这个路由器的配置界面进行相关的配置。如何进行网段划分分类划分法这是最初的划分方法具有局限性比如申请了一个A类网络地址但是实际使用的时候主机号并没有占用那么多剩余的主机号就浪费了因为这个网络号只有你能使用。这样网络地址的使用率就很低。针对于此提出了新的方案无类别域间路由CIDR引入子网掩码的概念来进行一个ip地址的网络号和主机号的区分这个子网掩码是一串1和一串0组成的和ip地址进行与操作得到的就是网络号这样提高了ip地址的使用率。特殊的ip地址主机号全0整个ip地址表示网络号主机号全1整个ip地址表示广播地址用于给一个链路中所有相互连接的主机号发送数据包127.*用于进行本机环回loopback通常是127.0.0.1。ip地址的数量限制ip地址是32位就是2的32次方大概是43亿由于一些特殊ip地址无法使用并且ip并不是按照主机来配置的往往一个网卡有多个ip地址这就似的ip地址并不够用CIDR在一定程度上缓解了这种问题提高了ip地址的使用率但是没有本质上解决问题没有提高ip地址的上限有三种方法可以很大程度上解决动态分配ip地址只给接入网络的设备分配ip地址同一个MAC地址设备每次接入互联网的时候得到的ip地址不一定相同NAT技术后面介绍IPv6128位和IPv4是两种不相干的协议目前没有被普及。私有IP和公网IP私有ip不能出现在公网上所以私有ip是任何ip都行但是还是规定了私有ip的范围10.*前8位是网络号、127.16.*~127.31.*前16位是网络号、192.168.*前16位是网络号。这些开头的ip都是私有ip不能出现在公网上。其他的都是公网IP。网络宏观上是这样的公网私网子网、局域网 1n。我们平时使用的都是私有ip。一个路由器可以配置两个ip一个是对内的子网IP另一个是对外的WAN口IP路由器LAN口连接的主机都属于这个路由器管理的子网中不同的路由器管理的子网ip大差不差甚至彼此之间可以重复但是在一个子网内的IP不能重复每一个路由器都是运营商路由器子网的一个节点逐层向外找最后一个运营商路由器的WAN口IP一定是公网IP。比如此时主机192.168.1.201/24有一个目的IP是122.77.24.3/24的报文首先发现这个目的IP不是子网IP那么就一定会交给路由器路由器会将这个IP报文的srcIP替换为路由器的WAN口IP继续在路由器所在的子网中查看发现dstIP不是内网IP直接交给路由器路由器将IP报文的srcIP替换为当前路由器的WAN口IP也就是122.77.24.4/24此时将IP报文交给公网找到目的主机。这种IP替换的过程就是NAT技术这种技术不关心srcIP是多少也就是你的srcIP或者说子网IP可以重复只需要经过一层层的替换成为公网IP即可。所以NAT技术可以解决IP地址不足的问题了。那么如何回来呢这就是为什么子网IP不能暴露在公网上因为不同子网中的主机IP可以重复那么在回来的时候不知道交给哪个子网所以子网IP不能暴露在公网上。具体如何回来呢在公网上靠的是路由表天目在内网实际上每个路由器会记录替换前srcIP和替换之后的srcIP地址的映射关系当回来时dst交给某一个路由器路由器会通过dst和映射关系找到之前出去替换前的srcIP作为现在的dstIP之后通过路由表条目找到出去接口这样层层查找映射关系就可以将回来时的IP交给目的子网至于如何在子网内找到具体的目的主机这个话题后面解释。总结一下可以发现运营商是控制了我们的报文是否可以发送到公网上毕竟路由器是运营商管辖的而路由器又相当于一道道城门。为什么流量欠费不能上网当你欠费的时候上网时报文会被在进入公网的路由器截取运营商判断这个手机号的流量是否欠费欠费那么就不让你NAT不让你出去。当我们访问的资源包含敏感词的时候呢比如我想要访问境外的一些资源那么运营商会通过路由器查看ip发现这个srcIP明显不是国内的就直接丢弃这个数据包所以无法访问境外资源IP层面拦截。理解公网首先公网IP是有限资源公网IP不是按照国家规模分配的而是按照每一个国家的网民数量分配的目前是美中日德英一张简单的网络结构来学习公网划分这里都是一个假设的只是合乎理论的例子并非实际情况。在国家层面网络号为前8位并且国家之间都配置了一个出入口路由器这个路由器配置了两个WAN口IP一个是面向国际的也就是在国家路由器之前的IP地址另一个是面向国内的例如中国就是面向国内各个省份的IP地址。在国家内部例如中国各个省份之间有出入口路由器这个路由器国际路由器一样配置有两个WAN口IP使用16位网络号之后是一个省份内的城市此时就要开始进行子网划分了因为再分主机号可能就不够了使用子网。报文是怎么转发的呢假设现在俄罗斯要访问目标地址5.1.16.X每个路由器内部都有路由表条目这个条目是已经配置好的俄罗斯将这个IP和子网掩码与操作之后会发现这个IP不是国内的而是中国的那么就会通过下一跳地址转发到中国的国际路由器然后在中国国际路由器做同样的操作发现是某个省的这样一步一步走到目的主机内网转发还没介绍后续介绍。同样的从这个主机转发出去也是类似的操作。路由就是通过目的IP地址一跳一跳经过路由器到达目的地当数据包到达一个路由器之后路由器会判断这个目的IP需不需要发给下一个路由器或者直接发给目的主机依此反复直到达到目的主机。使用route命令查看目的IP网络号的下一跳IFace就是从这个路由器哪一个接口出去。匹配则直接转发最后都没有匹配的那么就是直接缺省转发也就是最后一行Gateway表示下一跳地址Destination表示目的网络地址。在公网靠的是路由表条目在内网优先看NAT映射关系之后看路由表条目确定下一跳因为内网中网络号相同单纯靠路由表条目找不到具体的子网。IP分片和组装这个就是IP协议头中涉及到的16位标识3位标志13位片偏移。数据链路层的最大传输单元MTU不能超过1500字节也就是上层下来的报文不能超过1500字节硬件设计的结果这就使得上层IP层报文不能超过1500字节也就是传输层不能超过1480字节那么传输层数据部分不能超过1460字节这个1460就是MSS最大段尺寸。若是超过了最大段尺寸就需要在IP层进行分片分片不是主流而是少数情况下不得已而为之分片会有缺点就是当分片之后某一个报文丢失之后意味着整个报文都丢失了其他的分片也没有用了所以分片不是主流。这也是为什么学习传输层的时候滑动窗口的大小是1000为什么将窗口内的报文看做一个整体不一次性发送。16位标识分片之后原本属于一个报文的每一个分片需要被分到一组和其他分片区分开来这个标识就是区分依据。3位标志第一位保留第二位为1表示禁止分片此时若是超过MTU那么就会丢弃报文因为太大传不了又不允许分片为0表示可以分片第三位为1表示后面还有分片为0表示后面没有分片了。13位片偏移是分片之后的报文在原来没有分片的报文中的偏移量用于接受之后分片的组装。接收方如何确认某一个报文是分片之后的报文首先看标志位第三位为1则必是分片为0但是片偏移不为0也是分片其他情况都是未分片的。怎么保证把分片收完整了首先需要按照16位标识将同类分片收集起来之后判断有没有丢失的分片若是没有偏移量为0的分片那么就是第一个分片丢失没有第三位标志位为0的分片表示最后一个分片丢失从第一个分片开始用自己的偏移量加上自己报文的长度就是下一个报文的偏移量若是在收集的分片中没有找到偏移量是这个的那么说明中间分片丢失依此找到最后一个都可以找到说明没有丢失。如何组装也就是像确认中间分片丢失与否一样找到下一个分片组装起来即可。数据链路层简介网络层研究的是数据报跨网络找到目的子网的过程准确来说是确定了数据传输的方向至于如何传输就是数据链路层要研究的问题例如一个子网中一台主机如何将数据交给另一台主机以太网以太网不是一种具体的网络而是一种技术标准包含数据链路层和物理层例如网络拓扑结构、访问控制方式传输速率等的内容以太网中的网线必须使用双绞线以太网是目前最常用的局域网技术与其并列的还有令牌环网、无线LAN。以太网的帧格式数据链路层封装的叫做数据帧以太网中就是以太网帧。帧中内容为目的地址6字节表示目的的MAC地址源地址表示起点MAC地址类型2字节标识封装的数据属于哪一种协议也就是当前数据帧面向哪种协议封装的有IP、ARP、RARP末尾是CRC循环校验。中间数据部分在46~1500字节之间当面向ARP或者RARP的时候只有28字节需要使用填充字段PAD保证数据部分为最小的46字节。如何实现头部和数据部分分离以太网数据帧格式是固定的前面14个字节就是头部直接取出即可剩下的部分不要最后4字节就是数据部分。如何实现分用看类型字段是哪一种协议就表明这个数据帧面向哪一种协议提供服务。MAC地址MAC地址用来标识数据链路中的节点地址同时也是每台主机网卡地址出厂的时候就确定了是唯一不变的有些网卡也支持用户自己配置虚拟机中的MAC地址不是真实的MAC地址可能出现冲突长度为6字节这是表现形式08:00:27:03:fb:19如何理解IP地址和MAC地址IP地址确定的是一种长期目的告诉你最终的目的并且确定路径的方向在数据传输过程中目的IP不变源IP可能会变NAT技术而MAC地址是具体如何到达下一个节点MAC地址就是下一个节点的真实地址。三个问题为什么一个主机就知道这个数据要跨网络或者不跨传输到另一个主机这是路由的结果上层数据是先通过网络层的才回到数据链路层也就是先看目的IP和路由表发现在当前子网中那么就只需要直到目的主机的MAC即可不在那么就缺省交给路由器这个路由器会将数据转发出这个子网然后进行同样的操作。为什么数据链路层封装的帧的数据大小有限制46~1500字节首先局域网就是一个碰撞域在同一个局域网中的主机发送数据会被所有主机接受判断是不是自己的那么同时有多台主机发送数据这些数据就会发生碰撞所以同时只能有一个数据帧在流动所以以太网相当于一个临界资源为了所有主机享有资源的公平性一个数据帧不能在以太网中停留太长时间同时也不能太短这就导致了以太网帧不能太长或者太短太长在以太网中停留时间长太短分片很多碰撞概率增加所以有上限和下限。真正在网络上流动的数据形式其实是数据帧。当我们只知道目的的IP地址但是不知道其MAC地址的时候我们是不能将数据帧交给对方的如何直到目的IP地址对应的目的MAC地址呢ARP协议地址解析协议ARP地址解析协议这个协议是在数据链路层和网络层之间在封装MAC帧之上这是其功能以及过程决定的。不知道IP对应的MAC就封装成ARP的数据帧而不是IP的数据帧将这个数据帧在当前局域网中广播得到目的IP的MAC硬件地址在ARP解析之后直到MAC地址再封装成IP数据帧也就是MAC帧进行一对一的数据传送。ARP数据帧格式硬件类型指的是链路层网络类型1为以太网协议类型是要转换的地址类型0x0800是IP硬件地址长度对于以太网是6字节协议地址长度对于IP是4字节op字段为1表示是ARP请求为2表示应答具体流程首先是请求源地址填当前主机的MAC地址以太网目的地址填全F也就是广播地址表示这个帧发给所有主机帧类型为ARP硬件类型为MAC协议类型为IP长度分别是6和4欧赔是1表示请求发送端以太网地址为当前主机mac地址发送端IP地址为当前主机路由出去的IP地址目的以太网地址为全F目的IP地址就是目的IP。当前局域网的所有主机都会收到这个帧先看op发现是1请求那么就看目的IP地址和自己的IP不一样就会丢弃这个丢弃是在ARP模块丢弃的匹配匹配的主机就会在ARP模块封装ARP应答和请求不一样的是op为2源mac地址填自己的macIP也是目的mac和目的IP填请求中的源mac和IP。发送出去之后只有对应mac目的地址的主机才会收到但是也会有错误情况不匹配情况。整体过程是接收方先看op为2则看目的mac匹配无事发生不匹配丢弃这个丢弃在ARP模块丢弃。之后就知道了IP对应的MAC地址并且会记录下来之后传输直接单播即可。这个映射关系的记录不是永久的因为IP地址是会变化的。NAT、NATP技术NAT解决的是IP数量不够的问题。通过前面学习残留一个问题从局域网主机发送的请求可以到目的主机但是目的主机返回应答的时候只到了第一个连接局域网和公网的路由器接下来要如何找到局域网中的目的主机呢在发送请求的时候源IP替换成为路由器的WAN口IP路由器会记录下来源IP和WAN口IP的映射关系这个关系在回来的时候用到了替换的IP是请求时源主机IP或者所在的网段IP具有相同网络号的IP这样可以直接或者进一步替换找到目的主机这个替换的IP是返回时的目的IP。因为不同局域网可以存在相同IP地址所以必须记录下来返回时的映射关系。这样也决定了外网不能直接访问内网因为不知道映射关系。但是存在这样一种问题若是同一个局域网中访问同一个外网的主机那么在出入口路由器进行替换的时候不知道返回的报文具体要交给局域网中的哪一个主机因为此时返回时的目的IP在路由器中的映射存在多个直接映射可能会出错。此时映入NATP技术也就是IPport来进行替换请求也就是出去的时候将当前发起请求的进程的端口号以及主机和路由器的WAN口IP替换。这样还是不行因为不同主机上面的端口号会重复这样一来映射之后的源IPport会重复为了解决映射的时候若是出现相同的端口号路由器会自动改成不一样的这样唯一IP端口就保证了回来的时候一定是唯一的正向代理和反向代理正向代理正向代理Forward Proxy是一种常见的网络代理方式它位于客户端和目标服务器之间代表客户端向目标服务器发送请求。正向代理服务器接收客户端的请求然后将请求转发给目标服务器最后将目标服务器的响应返回给客户端。通过这种方式正向代理可以实现多种功能如提高访问速度、隐藏客户端身份、实施访问控制等。工作原理 - 客户端将请求发送给正向代理服务器。 - 正向代理服务器接收请求并根据配置进行处理如缓存查找、内容过滤等。 - 正向代理服务器将处理后的请求转发给目标服务器。 - 目标服务器处理请求并将响应返回给正向代理服务器。 - 正向代理服务器将响应返回给客户端。功能特点 - 缓存功能正向代理服务器可以缓存经常访问的资源当客户端再次请求这些资源时可直接从缓存中获取提升访问速度。 -内容过滤正向代理可依据预设规则过滤请求与响应屏蔽广告、拦截恶意网站。 -访问控制借助正向代理管控网站访问权限限制工作时段浏览娱乐类网站。 - 隐藏客户端身份隐匿客户端真实IP地址保障用户隐私安全。 - 负载均衡将客户端请求分发至多台目标服务器增强系统扩展性与稳定性。应用场景 企业网络管理依托正向代理管控员工网络访问行为规范上网操作规避不良网站浏览与企业信息泄露风险。 公共网络环境图书馆、校园等公共网络场景中合理调配网络资源维护网络使用公平性与安全性。 内容过滤与保护家长可配置正向代理筛选不良网络信息规避未成年人受到负面内容侵害。 提高访问速度依靠缓存机制留存常用网站与资源缩减网络延迟加快页面访问速率。 跨境电商与海外访问助力企业及个人破除网络访问限制稳定顺畅访问境外网站与相关资源。反向代理反向代理服务器是一种网络架构模式作为Web服务器的前置节点接收客户端发来的请求将请求分发至后端服务器处理再把后端反馈的数据回传给客户端。该架构能够有效提升网站运行性能、防护能力与运维便捷性。基本原理 - 反向代理服务器部署在客户端与Web服务器之间客户端发起的请求最先抵达反向代理服务器。服务器依照预设规则把请求转发至后端Web服务器再将服务器响应回传给客户端。整个交互过程中客户端仅与反向代理服务器通信无法获知实际对接的后端服务节点。应用场景 - 负载均衡按照既定策略分发客户端请求至多台后端服务器均衡服务压力有效提升网站整体性能与响应效率适配高并发访问场景。 - 安全保护隐藏后端服务器真实IP规避直接攻击风险。可搭配防火墙、访问控制列表等规则筛选拦截请求筑牢后端服务安全防线。 - 缓存加速缓存后端服务响应数据重复请求可直接调取缓存反馈减轻后端运行负担加快页面访问响应速度。 - 内容过滤和重写依据规则处理请求报文增减请求头部、调整访问路径满足URL改写、身份核验等业务需求。 - 动静分离拆分静态与动态资源处理流程静态资源由反向代理直接响应交付无需调取后端服务大幅优化静态资源访问速率。 - CDN内容分发网络核心运作原理依托反向代理实现。正向代理往往作为请求的转发反向代理相当于是资源的缓存。NAT和代理服务器路由器普遍具备NAT功能借助NAT中转实现不同子网设备间的数据通信。 代理服务器交互逻辑与之相似客户端向代理发起请求由代理转发至目标服务器收到返回数据后再回传给客户端。NAT与代理服务器区别 - 应用层面NAT属于基础网络设备主要解决IP地址资源短缺问题代理偏向业务应用可用于网络加速、跨境访问等场景。 - 工作层级NAT运行在网络层仅做IP地址转换代理服务器工作于应用层。 - 使用范围NAT多部署在局域网出口代理可部署于局域网、广域网支持跨网络使用。 - 部署形式NAT多集成在路由器、防火墙硬件中代理以软件程序形式部署在服务器设备上。代理服务器常见应用 - 广域代理实现跨区域网络访问 - 内网代理实现服务器集群负载均衡例子当想要访问google这样的网站的时候运营商会发现这个域名不合要求不替换或者IP是外网不给你进行转发。如何实现访问呢首先在安装一款软件这款软件会给你的报文进行加密并且目的IP设置为香港香港是对外窗口可以访问外网这样就可以骗过运营商这是一个合法请求到达目的地址之后代理服务器会解密提取真实报文发现是访问外网那么就会进行请求获取的响应也会进行加密并且按照相同的方式交给目的主机解密获得资源。这里例子是正向代理的使用真正的公网跨国网络。内网穿透我们知道外网是无法直接访问一个内网的那么就使得在不同的局域网的双方不能直接通信必须借助云服务器或者其他服务器。若是在很远的地方就不能直接处理公司或者学校的事情在不同的局域网这样会造成问题。如何实现直接通信呢在公司或者学校的主机上面配置frpcfrp是一款做内网穿透的软件在云服务器上面配置frps并且客户端和服务端是进行过连接建立的也就是通信过这样一来出入口路由器就建立的IP端口的映射比如公司或者学校客户端的22端口映射到了服务器的8888端口同样地服务器也可以回来映射建立成功那么此时在另一个局域网访问云服务器上的8888端口就可以直接访问另一个局域网中的主机了。整个过程相当于把内网服务暴漏在公网上了。内网打洞不同局域网中的主机A、B向同一个云服务器发起请求获取应答建立好了两队NAT映射关系。之后云服务器会将B的IP和端口交给主机A同样地主机A的也交给主机B这样访问的时候主机A就可以直接访问主机B了这就是内网穿透也就是p2p技术的实现。为什么可以直接访问因为路由器的WAN口IP是唯一的拿到这个IP去公网中一定可以找到。直播也就是这样实现的当有很多人看一场直播的时候若是访问的是服务器上面的资源那么服务器会有很大压力为了解决这个问题在每个客户端访问一次服务器之后就给看直播的客户端和做直播的客户端进行内网打洞此时就相当于就是p2persons了大大减小的服务器的压力此时服务器也将自己作为客户端记录直播内容作为录播。交换机工作在数据链路层依据 MAC 地址转发数据。核心原理维护 MAC 地址表记录端口与设备 MAC 对应关系收到数据帧查表精准转发至目标端口不广播无关端口同一端口组设备可同时并发传输互不干扰主要特点隔离冲突域提升内网传输效率无路由寻址功能仅限同网段通信端口独享带宽传输稳定性高常见用途组建局域网、内网设备互联、拓展网络接口设置一个交换机主机A第一次送数据帧交换机会直到A在自己左边这样将所有主机记录下来此后若是A给D发交换机就不会让数据经过自己这样减小了冲突域。