做网站图片如何压缩图片泉州网站制作维护
web/
2025/9/29 7:31:35/
文章来源:
做网站图片如何压缩图片,泉州网站制作维护,网站后台链接怎么做,WordPress快速添加图片目录
MAC帧协议
mac地址
以太网帧格式 ARP协议
ARP报文格式编辑
RARP
其他的网络服务或者协议
DNS ICMP协议 ping traceroute NAT技术
代理服务器 网络层负责规划转发路线#xff0c;而链路层负责在网络节点之间的转发#xff0c;也就是一跳的具体传输…目录
MAC帧协议
mac地址
以太网帧格式 ARP协议
ARP报文格式编辑
RARP
其他的网络服务或者协议
DNS ICMP协议 ping traceroute NAT技术
代理服务器 网络层负责规划转发路线而链路层负责在网络节点之间的转发也就是一跳的具体传输。
MAC帧协议 mac地址
首先在一个局域网内的主机能不能直接通信当然能在同一局域网的主机不需要经过路由器。
局域网通信其实就是将数据广播(严格来说不叫广播)到局域网然后局域网内每一个主机的数据链路层都能收到这个数据帧但是除了目标主机其他的主机在识别到这个数据帧的目的mac地址不是自己之后会将报文丢弃。 所以最终还是只有目的主机收到这个报文。所以这个过程我们在逻辑上也认为是定向传输。 那么就意味着在局域网中每一个主机都要有唯一的标识符。 我们在不考虑虚拟化的情况下每一台物理的主机都必须配有一张网卡才能接入网络而每个网卡都有自己的序列号(sn号)称为该网卡的mac地址我们也将其称为这个主机的 mac地址。每张网卡的mac地址在全球范围内都是唯一的mac地址就是 48 位的一个整数。
那么这里又有一个问题了我们只需要一个能够在局域网内进行唯一标识的标识符就可以了而mac地址虽然也可以做到但是它是全球唯一的是否大材小用了 从逻辑上来说确实大材小用了。
我们也说了在一个局域网内IP地址也是唯一的为什么不直接使用IP地址来标识唯一性
mac地址是硬件地址无法更改。而IP地址则是在主机入网时由所在局域网的路由器动态分配的同时也可以由网络管理员手动更改分配。 由于他是动态分配的那么我们无法为一个主机分配一个固定的唯一标识而是每次都是在变化的。 当然还有一个更重要的原因就是我们前面讲过的NAT技术将私有IP不断替换最终在出口路由器替换为公网IP发送到公网其实我们可以理解为在该路由器下面的所有的主机都共用这一个公网IP这时候IP其实并不能很好的标识唯一性。 同时IP和MAC地址是互相协作的各自有各自的功能或者职责。 后面我们还会讲报文如何从入口路由器转发到我们的局域网内的主机这时候也需要用到 MAC地址和IP这样的二元组来标识唯一性以及互作key值。 以太网帧格式 这里的源MAC目的MACCRC校验和这三个字段我们很好理解但是这个两字节的类型是什么呢
2字节的帧协议类型字段用来表明数据的类型或者说有效载荷的类型是IP报文还是其他的类型的报文 一般这个字段有三个取值 0x08000x08060x8035 分别对应IP报文ARP报文RARP报文。
那么说到这里我们也很容易知道他是负责分用的来表明解包之后的有效载荷该交给上层的哪个协议。而网络层就是IP协议表明收到的是一个IP报文如果是ARP或者RARP 的话则不是交给网络层这两个协议也是在链路层只不过在MAC协议之上。 而ARP报文和RARP报文后续我们会知道他们是用于获取MAC或者IP地址的报文的格式以及长度是固定的只有28字节。 而由于MAC帧协议要求有效载荷最少需要 46 字节所以这两种协议的报文封装成MAC帧的时候,MAC协议会在他们的报文基础上再加上 18 字节的填充来凑够46字节。
至于为什么有最短数据长度的限制这与以太网的CSMA/CD载波监听多点接入/碰撞检测机制有关我们不做了解只需要知道64字节的MAC帧长度是为了确保在最大长度的电缆上信号传播到最远端并返回的时间足够长使得发送方能够在发送完数据之前接收到可能的碰撞信号从而采取相应的措施如重发或放弃发送以保证数据的正确传输。 而64字节的最短帧长度减去MAC帧协议的报头之后还剩下46字节所以我们的数据部分至少需要46字节。
以太网帧格式搞清楚了我们再来复盘一下所谓的局域网通信首先局域网内的所有主机直接或者间接级联每一台主机要进行网络通信就需要先入网也就是需要接入局域网而主机的MAC地址就作为他在局域网中的唯一标识。 那么某一台主机在进行局域网内的通信的时候将上层交付给MAC协议的数据(假设是IP报文) 封装成MAC帧MAC帧的报头中会携带发送者和接收者的MAC地址以及帧类型 0800 还有帧校验和然后通过网卡将数据发送到局域网中。
那么局域网中的每一台主机都会受到这个MAC帧但是并不一定要把数据交给自己的上层。 每一台主机的链路层在收到一个MAC帧的时候首先会进行解包将MAC帧的报头提取出来判断其中的目的MAC地址是不是自己的MAC地址如果是就将数据交给上层协议。 如果不是发给自己的那么链路层就会直接将报文丢弃而不需要交给上层处理。 那么与此同时除了接收方的主机局域网内其他主机的上层根本就不会知道在链路层曾经收到了一个不是发给自己的MAC帧当然本来就不应该知道。
结论就是 局域网中所有的主机其实都能收到其他主机通过局域网发送的MAC帧主机在自己的数据链路层通过对比MAC帧的目的MAC地址和自己的MAC地址是否相等来决策是否要将数据交给上层协议处理。
既然局域网内所有主机都能收到MAC帧我们能不能通过某些对网卡或者说MAC协议的设置无需进行MAC地址的比对直接将数据交给上层处理也就是说不管是不是发给自己的都交给上层。
这就叫做网卡的混杂模式。
混杂模式的特点就是不放弃任何数据帧直接向上交付。
这也是大部分的局域网抓包工具的原理就是将网卡设置为混杂模式然后不断向上交给对应的抓包工具。
同时这也是为什么数据需要加密的原因如果我们的重要数据也使用 http 协议进行明文传输那么不说其他的只要同一局域网内的主机开启混杂模式就能将你的报文拿到。 所以我们就需要是用 https 进行数据的加密。 那么也就意味着局域网是被局域网内所有的主机所共享的如果两个主机同时发送MAC帧这时候就可能会出现 碰撞/干扰 的问题。 那么基于上面的问题就意味着 在局域网当中任何时刻只能有一个主机发消息。 但是这时候就有一个问题我们作为普通的入网的主机能控制自己的发送的行为但是无法控制别人的发送行为也就是说就算我们千算万算选择一个时间发送出去但是也架不住局域网内的其他的主机同时发送数据帧最终也还是会发生碰撞问题。
虽然不能禁止其他的主机发消息但是我们能够检测是否发生了碰撞。 如果数据帧在局域网中发生了碰撞那么会导致这个数据成为无效数据怎么判断呢 很简单MAC帧协议的CRC校验如果CRC校验失败或者说不通过就说明数据帧发生错误了也就是发生碰撞了。我们也说了一个主机发出去的数据帧局域网内的所有主机都能收到那么就包括发送方自己发送方在发送出去之后可以在后续在接受自己发出去的这个MAC帧这个MAC帧可能是绕着局域网一圈之后回到起点的那么这时候他就可以通过判断这个MAC帧的完整性和正确性来判断是否发生碰撞。 但是检测发生了碰撞并不是解决问题的方法而是发现问题最终要解决问题还是要限制同一时刻不能有其他的主机发消息。 那么怎么保证在一个时刻只允许一个主机发送呢 解决方案不同就有了不同的局域网的实现方案。
其中一种解决方案就是 令牌环。 类似于在我们的局域网中流转一部分令牌数据只有持有令牌数据的主机才可以发消息 同时每一台主机发完消息之后需要把令牌通过局域网交给下一台主机。
还有一种方法就是分时使用NTP/SNTP简单理解就是局域网内所有主机统一一个时间段大小将这个时间段划分为多份每一份分配给一台主机每个主机只能在分配给自己的时间内进行通信。这种策略需要局域网内所有主机有一个相同的时间标准需要进行精确的时间同步。
还有就是基于碰撞域的以太网。
以太网其实就是在发生碰撞时碰撞双方检测到碰撞之后不立马进行重传而是都进行一个随机时间的等待等待之后再进行数据帧的重发。 同时这两台主机在等待的时候其他的主机就可以减少碰撞的概率。 当然即便进行等待之后再次重传还是可能发生碰撞但是再次发生碰撞的概率很低很低。 就算发生了还可以再次重发。 所以重传策略不只有TCP有MAC协议也有重发策略。 网络资源就跟我们学习操作系统时所说的共享资源一样局域网资源被局域网内所有主机共享同一时刻只能有一台主机像局域网中发送消息。而我们所说的令牌环就类似于系统中的锁只有拿到锁的主机才能使用共享资源。
现在最常用的局域网就是以太网后续我们如果不特别指明说的局域网都是指的以太网。
局域网能不能很大 不能因为局域网是一个碰撞域如果局域网过大主机过多的话就会导致发生碰撞的概率增加。 那么如果没办法一个局域网内就是有很多的主机呢这时候怎么减少碰撞的概率呢
那么我们就需要讲一种设备交换机。
在大多数情况下我们像局域网中发送一个消息其实并不想让太多主机收到最好就是只有目标主机收到而当局域网很大的时候如果我们发送一个消息这个消息会在整个碰撞域内传输就算我们的消息已经被目标主机接收了也还是会做一些无用的传输。
交换机的作用我们可以理解为将局域网这个碰撞域又进行了划分分割了碰撞域。 那么有什么好处呢 首先最直观的就是如果我们的数据帧不需要跨交换机那么交换机就不会对其转发。 比如主机A发送报文给主机D那么这个报文就只会在碰撞域 1 中进行传输在数据帧到达交换机之后交换机检测到目的主机在碰撞域1中那么就不会将其转发到碰撞域2。 于此同时就允许碰撞域1内的通信和碰撞域2内的通信同时进行提高了发送的效率。
如果主机A要发送报文给主机E那么也很简单跨交换机就行了。
还有一种情况就是可以拦截碰撞数据。
比如主机A发送给 主机F的报文在碰撞域1中发生碰撞了这时候碰撞之后的报文还是会继续在局域网内传输但是遇到交换机的时候检测到数据帧发生碰撞不会对其进行转发。因为碰撞之后的报文已经是无效的数据了没必要转发他浪费网络资源。
因为碰撞域的存在一台主机发送数据的时候发送数据量大更好还是发送数据量小更好
数据量小更好。 因为数据量越大意味着在局域网中的传输的时间就越长那么发生碰撞的概率就会变大同时发生碰撞之后补发的成本也很大。 如果数据量小的话在局域网中的传输时间就很短发生碰撞的概率就越小同时就算发生了碰撞补发的代码也很小。
当然在另一方面如果我们发送的数据的总量固定那么一次性发送的数据量小的话意味着发送次数要变多当然这个影响比不上大量数据的重传。
由于一次发送的数据量不能太大所以MAC帧协议规定了我们的有效载荷的长度不能超过 1500 字节如果超过 1500 字节就需要在IP层进行分片与组装。 这个最大长度就算 MTU 最大传输单元。 不同类型的网络的 MTU 可能不同。 那么就意味着不仅是发送方主机的IP层要进行分片与组装路上的路由器也可能需要进行分片与组装。 因为假设我们的报文(1500字节)从一个 MTU 为1500 的网络经过路由器转发到了一个 MTU 为 1000 的网络中那么其实我们的报文是不能直接被转发的而是需要在这个路由器进行分片。 路由器也是工作在网络层的所以他也有分片的功能。
但是也有一种情况因为我们转发的路径可能不止一条如果我们的报文或者分片报文被设置了禁止分片的标记位那么路由器也会根据这个信息选择一条无需分片就能转发的路径。
但是如果只有一条路径MTU比较小同时报文被设置了不可分片标记位那么路由器也没办法只能将其交给这唯一的一条路径然后该报文就会被链路层丢弃。
那么这里我们也能看出来IP报头的禁止分片标记位也是影响路由选择的策略的因素之一。 MTU对于TCP和UDP的影响 对于UDP而言UDP的报文的大小取决于用户层交给他的数据的大小UDP的报头长度为8字节IP报头标准长度为 20 字节 那么就意味着只要上层交给 UDP的数据超过 1472 字节那么就需要IP曾对其进行分片。 而一旦进行分片了任何一个分片丢失了接收方的IP层都会将其丢弃也就意味着丢包的概率增大了。 而由于UDP没有重传机制所以我们也无法确定是否丢包。
所以再使用UDP协议的时候为了降低丢包的概率我们要尽可能的避免分片这就需要用户层对发送的数据的大小进行控制如果一次性发送的数据的大小超过了最大的限制那么就需要用户层手动将报文拆成多个发出去同时也需要接收方的应用层自己组装。 而如果是TCP协议的话 由于TCP是传输控制协议那么就意味着一次性发送多少数据并不由应用层控制而是由TCP协议控制。 而一旦一次性交给IP层的数据太多IP也需要进行分片那么也就意味着丢包的概率增大了。
TCP虽然有重传机制但是对于这种大数据的重传成本还是很高的。同时TCP要保证可靠性同时也要保证高效丢包的概率增大了也就间接导致传送效率低 。 所以TCP为了保证可靠性和高效性也要对一次交给IP层的报文进行控制尽量减少分片。 而TCP和IP的标准报头都是 20 字节就意味着一次最多发送 MTU - 40 字节的数据。 我们把一次发送有效数据的最大大小称为 MSS(max segment size ,最大段尺寸)。 TCP在三次握手建立连接的时候除了会交换双方的初始窗口大小之外也会进行 MSS 的协商最终双方通信时的MSS就是二者中较小的MSS值。 MSS 是在选项中携带的因为在整个通信过程中只需要交换一次MSS后续都不再需要所以没必要将其设为固定字段。
这就是为什么我们在讲TCP滑动窗口的时候即使对方的接收能力很大我们最终发送报文的时候也是一个一个1kb左右的报文发出去就是因为MSS的影响。 ARP协议
在路由转发的过程中MAC地址是不断在发生变化的同时发送方发送数据的时候也只需要知道对方的IP和端口号就行了并不需要填入对方的MAC地址MAC地址是在子网或者局域网的时候用的最终数据帧被转发到了目标网络的路由器中。 但是有这样一种情况就是路由器不知道目标主机的MAC地址。 这是有可能的因为网络中十岁时可能会加入进来新主机的尽管路由器会进行IP的分配但是这也仅能代表路由器知道在他所管理的子网或者局域网内存在对于IP的主机而不一定知道对方的MAC地址。
这时候就需要让路由器通过一定的方法通过IP地址获取对方的MAC地址。
因为只有知道了MAC地址才能在链路层封装到目标MAC地址字段然后通过局域网发给对方。
而ARP协议就是在一个局域网中获取陌生主机的MAC地址协议。
ARP报文格式
硬件类型其实就是网络类型绝大多数情况下都是以太网这个字段的值就是1而硬件地址长度就表示的是以太网的地址长度其实就是 MAC地址的长度那么他的值就是 6 。而协议类型则表示的是我们需要通过什么协议的地址获取硬件地址 绝大多数情况下已知的都是 IP 地址所以协议类型就是IP协议那么这个字段的值就是 0x8080 。而协议地址长度就是我们已知或者说依据的地址的长度IP地址的长度就是4字节所以这个字段一般填的是4。
前面的四个字段我们可以当成固定字段来理解。
而发送方的MAC地址和IP地址这一点很好理解。 接收方IP地址也好理解但是这里的接收方MAC地址怎么理解呢 我们不正是因为要获取对方的MAC地址才使用ARP协议的吗他这里又需要我们填写MAC地址怎么办呢
那么我们先暂停一下剩下的两个字段我们一会再分析我们先来认识影响ARP协议以及arp的过程。
首先当我们只知道对方的IP而不知道对方的MAC时我们需要发送一个ARP请求报文但是由于我们不知道对方主机到底是哪个所以我们需要的是将这个报文在局域网内广播让所有的主机都受到并且处理我们的arp请求所有的主机都需要判断自己是不是我们要请求的主机。
而目标主机在收到这个请求报文之后就需要进行应答他需要封装一个ARP应答报文由于在他收到的ARP请求中已经包含了发送方的IP和MAC地址那么他进行应答的时候就不需要进行广播只需要进行一对一的发送。
所以arp的两个阶段 1、arp请求局域网内广播 2、arp应答目标主机一对一把应答发给请求方。
我们要搞清楚一个问题 是谁需要目的主机的MAC地址 如果发送方和接收方都在同一局域网内且发送方知道接收方的IP却不知道对方的MAC地址那么他也需要使用ARP协议来获取对方的MAC地址。
如果发送方和接收方不在一个局域网那么就是目的主机所在网络的路由器需要知道目的主机的MAC地址也需要使用ARP协议。
我们把路由器也当作主机看其实就是同一局域网内主机之间的通信只知道IP地址但是不知道MAC地址的时候需要使用ARP协议来获取对方的MAC地址。
但是这还不够准确是那一层协议需要对方的MAC地址呢
答案很明显链路层。
所以ARP以及后续我们要讲的RARP协议都是链路层协议。
但是我们也不要忘了IP层进行路由选择的时候选择路径的本质就是选择下一跳的MAC地址IP层需要将选好的MAC地址也告诉MAC帧协议让MAC帧协议进行传送所以IP层也是需要知道对方的MAC地址的而IP层需要知道对方的MAC地址才会交付给MAC层那么就意味着ARP请求的发起者是IP层或者说IP协议而不是MAC协议。
ARP请求/应答能够直接发送到局域网中吗 显然是不能的发送到局域网中的必须是数据帧或者说是MAC帧。
所以ARP请求/应答还需要经过MAC帧协议的封装。同时也意味 ARP/RARP协议都是工作在MAC协议之上的。 那么学到这里我们也就能发现一件事在MAC帧协议中解包之后进行分用的时候并不一定要交给IP层也可以是交付给链路层的ARP/RARP协议。 这是很正常的说明ARP/RARP都只是一种链路层服务。 就像我们后续也会学习一些网络层服务报文最终也就是交给网络层的服务协议而不需要交给传输层。 那么请求时的广播与应答时的一对一通信的区别是什么呢 广播的时候局域网内所有的主机链路层收到数据帧之后MAC协议进行解包数据帧的目的MAC地址目前还不明确所以都不会或者说不能丢弃而是交给ARP/RARP协议进行处理有ARP/RARP来判断是否是发给字节的。 而进行应答时一对一通信由于数据帧的目的MAC地址明确所以只要目的MAC地址不是自己的MAC地址在MAC协议就进行丢弃了而如果是发给自己的应答那么也是交给ARP协议继续处理提取出想要的MAC地址同时建立目的IP和MAC的映射关系。
那么回到协议报头OP字段是用来干什么的
我们上面有意无意在说明ARP报文是有两种的ARP请求和ARP应答同时一个主机可能会同时收到ARP请求和ARP应答ARP协议 对于请求和应答的处理 其实是不同的所以就必须要有一个字段来标识这个ARP报文是请求还是应答。 所以OP就是用来标识ARP报文的类型的如果是ARP请求OP字段的值就是1 如果是ARP应答那么OP字段的值就是2。
而接收方MAC地址怎么填呢 以及后续将ARP请求报文封装成MAC帧的时候目的MAC地址怎么填呢
ARP请求是要在局域网内广播的所以他无需指明或者无法指明具体的目的MAC地址这时候目的MAC地址填的是 0xFFFFFF 也就是全1。当MAC地址填为全1的时候就意味着这个报文是要在局域网内广播的相当于我们使用shell命令行时的 * 通配符所有的主机的MAC协议都会认为MAC帧是发给他的不会丢弃。 那么ARP的详细过程就应该是这样的
1 报文到达目的网络的路由器但是只知道目的IP地址在路由器中无法查到目的IP对应的MAC地址
2 IP协议发起ARP请求相当于调用一个函数然后让ARP协议去完成一次请求与应答
3 ARP协议构建ARP请求目的MAC地址填为0xFFFFFF
4 ARP将请求交给MAC协议封装成MAC帧MAC协议的报头中目的MAC地址也是0xFFFFFF表示广播消息 5 局域网内所有的主机的链路层都会收到这个ARP封装成的MAC帧。 由于目的MAC地址为0xFFFFFF所有的主机的MAC协议都不会丢弃而是将ARP请求交给自己的ARP协议。
那么ARP协议怎么处理MAC层给的ARP报文呢 首先ARP协议事先也不知道这个ARP报文是请求还是应答所以会先看OP字段。 如果是1说明是请求报文然后再去看接收方IP地址如果不是自己的IP地址这时候会丢弃。 如果是那么就会进行ARP应答。 6 目的主机构建ARP应答并交给链路层进行封装一对一发送给请求方主机。目的MAC地址填为请求方的MAC地址
7 局域网内所有的主机的链路层都收到这个ARP应答但是除了请求方主机之外其他的主机的MAC协议检查到目的MAC地址不是0xFFFFFF且目的MAC地址不是自己的时候丢弃这个数据帧。 而请求方主机的MAC协议收到这个MAC帧之后解包并将有效载荷(ARP应答)交给ARP协议处理。
8 请求方ARP协议拿到ARP报文之后首先还是提取OP字段判断是请求还是应答。 如果是应答 那么这时候会直接提取ARP应答中发送方IP和发送方MAC地址。 提取出来之后就为网络层维护这一对IP和MAC地址的映射关系
9 网络层知道对方的MAC地址将报文交给MAC层进行封装发送给目的主机。 关于ARP
a. ARP只会发生在入口路由器与目的主机之间吗
并不是。只要在同一个局域网内都有可能会发生ARP 。比如同一个局域网内的主机与主机之间以及同一个局域网内的路由器与路由器之间当然也可以是路由器与主机之间。
在我们进行数据的转发过程中ARP可能一直在发生只是我们的源主机已经不关心了。
b. 局域网一般不大那么是不是只要知道局域网的子网掩码就能将局域网中所有的主机的IP和MAC的映射关系构建出来?
当然。如果你想主机或者路由器在知道子网掩码以及被分配一个IP地址之后他可以粗暴的该网络号可能存在的所有的主机都列举出来发生ARP请求这样如果该IP被分配了那么就可以获取到对方的MAC地址如果没有被分配也没关系。
那么还有一个问题就是每一次发送给该主机的报文到了这个入口路由器之后都需要ARP获取MAC地址吗
并不是。 ARP获取到对方的IP和MAC之后映射关系会被短暂缓存起来要注意ARP缓存 是暂时的有一定时效同时后续也可能被丢弃。
缓存的映射关系会定期被清理为什么呢
因为网络中IP地址是不断在发生变化的。可能上一个使用该IP的主机下线了另一台主机被分配了这个IP地址那么就需要更新映射关系不能一直用一个。 同时也可以直接把网卡换了改变MAC地址。
在Linux中查看缓存的命令是 arp 或者我们也可以带上 -a 选项 arp收到应答的时候会以最新的结果为准也就是说如果arp缓存中已经存在这次ARP应答的IP和MAC地址的映射关系了但是又收到了一个新的映射关系这时候就会更新ARP缓存。
就比如我们的网络情况很差发送方在发送一个arp请求之后迟迟没等到回复那么就会再次发送arp请求如果这两个报文都到达对方了那么最终就会收到两个arp应答。
如果局域网中有一台主机他伪造了一个 arp 应答把自己的MAC和局域网内所有的IP都关联一遍发给某一个主机那么对方就会更新arp缓存同时在对方的ARP缓存中所有的IP都对应的MAC地址都变成了这个恶意主机。 那么更新完arp缓存之后目标主机发送到的所有数据都发送给了恶意主机。 同理该主机也可以把路由器的arp缓存也用该方法更新了那么最终到达这个局域网的所有数据也都会发送给恶意主机。 虽然这种情况下恶意主机可以将收到的报文按照它原本的方向再发送出去路由器和目标 主机都不会察觉到异样但是所有的报文却都被这个恶意主机截取了。 这就叫arp欺骗成为中间人。 所以这就愈加体现了https中证书以及加密的重要性经过加密的话就算被中间人截取到报文也无法修改内容。
还有一种关于ARP的做法就是
利用arp更新的机制你可以伪造应答将局域网所有可以存在的IP都映射一个不在此局域网中或者无效的MAC地址将这些arp应答发送给一个目标主机那么该主机未来发送的所有的报文都不会被局域网内任何一个主机接收也就相当于掉网了。 或者最简单的方法就是只更新对应主机的路由器的IP和MAC的映射关系把这一条映射的MAC更新了那么他就只能在局域网内通信而无法跨局域网通信这也是一种方法且更简单快速。 你也可以设计一个软件专门用来干这事硬编码arp应答中除目的IP之外的的字段IP地址可以由用户指定那么未来你想攻击局域网内的某台主机只需要将他的IP地址填充到对应的字段就行了。 当然我们不推荐这么玩。 RARP
有没有可能我们只知道对方的MAC地址而不知道对方的IP地址呢 是有可能的比如我们是网络管理员配置了一个路由器构建了一个局域网但是数据转发不出去这时候我们需要检查一下路由器的IP地址是不是我们曾经给他配置的IP地址。而路由器的MAC地址我们是知道的这时候我们就需要一种功能已知对方MAC地址获取对方IP地址。
而完成这个功能的协议就叫做 RARP R就是reverse RARP 就是逆地址解析协议。
RARP的过程也很简单因为我们是知道对方的MAC地址的所以发送RARP请求的时候也不需要广播只需要一对一发送就行了。应答的时候就更不用说了。
其他的一些特点基本和ARP类似我们就不做重点了。 其他的网络服务或者协议
DNS
DNS就是Domain Name Systerm 其实就是一个域名解析服务。我们所说的域名就是常用的 www.baidu.com , www.bilibili.com 这样的一个字符串域名在我们日常的上网中是十分常用的但是在网络通信中其实是没有域名的只认IP地址而不认所谓的域名。但是IP地址用起来十分难记且不方便不如域名可以和网站或者服务的名字产生联系十分好记于是就有了一套域名解析服务。 域名最大的价值就是便于互联网的商业化让用户用起来更加方便。 但是由于在网络通信中只有IP的概念所以就必须要有一套能够将域名转换为IP的方案或者说服务这就是DNS。
最早的时候是直接将域名和IP地址的映射关系直接在客户端本地构建一个配置文件当我们要访问某个域名时会从配置文件中读取对应的IP。
但是这种方案的最大的缺点就是影响范围太小只在一台主机或者说只在构建了对应的映射关系的主机上能用 。
所以后续就有了专门的组织把所有的域名和IP地址的对应关系保存起来任何人都可以通过他来获取域名对应的IP地址。这套服务就叫做域名解析服务是由域名相关的组织搭建的。
域名一旦存在我们的浏览器或者其他的客户端在去访问域名的时候首先会请求DNS获得对应的IP之后拿着IP去进行访问所以域名终究还是一种上层的服务并没有不是在网络的底层搭建的同时域名也不是必需的所以所谓的域名解析也没有在前面学习的网络协议栈中出现。
同时显而易见为了提高效率我们并不需要每一次访问都需要去请求DNS服务我们的本地一定会保存最近请求过的域名的信息我们也可以叫做DNS缓存。
域名怎么看呢我们就拿 www.baidu.com 来举例
域名的后缀或者说 .com 叫做一级域名。
一级域名中一般表明的是域名的性质比如 .com 一般就是商业公司 .org 一般是非营利组织.edu 一般是学校等教育机构或组织而.cn等这些就是国家域名.cn表示的就是中国。
baidu 就是二级域名一般代表公司名或者网站名 www 我们也可以看成是二级域名的一部分是一种习惯用法。
而有的域名在最开始还有一个字段用来表示支持的协议类型。 开放性面试题 在浏览器输入 url 之后发生了什么事情(完整的过程) 这个问题其实是开放性的首先最基本的就是站在应用层来看比如 通过域名获取IP通过IP发起连接服务器请求连接建立的三次握手HTTP请求和相应的构成以及各个字段属性字段的含义状态码的类型和含义等等。
其次我们可以从整个协议栈的角度来看就是去谈操作系统在连接建立和通信时的细节可以着重讲解TCP的各种可靠性机制比如 滑动窗口应答机制超时重传机制TCP的各个字段流量控制拥塞控制以及数据在协议栈的流动的过程同时还可以谈一下 路由的过程以及转发过程中的ARP等等知识点。 ICMP协议
我们学习网络的时候一直在谈如何通过网络将数据送达如果数据未送达该怎么办可是没有谈及网络如果出现问题如何去排查网络的问题。 比如有些网络的转发路线由于故障不可达可是我们的TCP协议和IP协议都没有关于这方面的问题的排查的功能。 ICMP协议用于验证网络的联通性的。 简单来说使用ICMP协议用于验证我们的IP报文能否到达对方主机。
如果无法到达也会返回一个报文用于通知源主机IP报文为何被丢弃。
所以ICMP是基于IP协议的但是他又没有涉及到传输层的功能只关心能否到达对方主机不关心到达对方的进程所以不需要具备端口号等信息。 我们还是把ICMP称为网络层协议。
同时,ICMP协议也只适用于IPv4如果是IPv6的话就要使用ICMPv6协议。
TCP的重传策略是用于发现问题之后的补救策略而ICMP则是用来排查故障原因的。
ICMP大概分文两类报文一类是通知出错原因如果未出错也会返回网络的健康状态。 第二类就是用于诊断查询。 ping
ping 命令是基于 ICMP 协议的。ping命令的原理很简单就是通过构建不同生命周期的报文其实就是依次把IP报文的 TTL 设置为1234 ... ... 同时通过ICMP的返回结果是否为出错的返回值来判断当前主机到远端主机的跳数。 同时ping命令是基于 ICMP 的也就是说它也是一种网络层的服务不需要传出层但是我们应用层可以直接调用这个命令我们可以理解为 ping 命令是跳过了传输层直接在网络层使用ICMP服务的。 所以ping 命令无需端口号。 traceroute
traceroute 命令和ping 命令类似也是基于 ICMP协议的也是网络层的功能应用层跳过传输层直接调用。 所以 traceroute 服务也没有端口号。
他的功能是获取从当前主机到目标主机的路由器以及中间经历的时间。 NAT技术
在网络层的讲解中我们已经知道了如何从运营商的内网中不断转发和替换源IP最终到达运营商的出口路由器发送到公网中。 但是有一个问题我们没有解决
响应报文如何从运营商的入口路由器送到我们的主机
因为最终返回的响应的目的IP都是这个入口路由器的公网IP怎么送到对应的内网中的主机呢
这就需要用到NAPT转换表了。
首先不管是怎么通信的通信双方都是一个进程有自己的端口号主机也有IP虽然这个IP有可能是私有IP但是至少在局域网中能表示唯一性。
同时报文在经过路由器之后虽然源IP换成了路由器的WAN口IP但是端口号还是保留的如果而端口号如果在路由器中唯一的话那么是不是就可以用路由器中唯一的端口号来标识这一台主机
我们直接先说结论 为了支持响应能正确转发回局域网内的主机每一个进行NAT的路由器都会自动维护一个NATP表NATP表中会保存IP报文的替换前的四元组(源IP,源PORT,目的IP目的PORT)和替换后的四元组(源IP源PORT目的IP目的PORT) 这两个四元组之间互为键值构建映射关系。 我们就拿一个只经过一次转换的NAT进行举例 因为实际进行通信的是两台主机的两个进程那么有以下几种情况 事先说明由于我们举的例子中都是访问同一个服务器的同一个服务进程使用的目的IP和目的端口都是一样的为了画图方便我们在NATP表中就省略了但是要注意实际的NATP表中是会有 目的IP和目的PORT的。 1 客户端可能有多个进程会同时访问同一个服务器 我们假设A主机与服务器进程进行通信A主机两个进程使用 8080和8081端口那么这两个报文是怎么发送到公网以及路由器中的 NAPT 表中保存的是什么呢 首先第一个路由器也就是家庭局域网的路由器在转发两个保温之前要进行NAT把源IP进行替换同时会在NATP表中保存这次的替换前的 addr(IP:PORT) 和 替换后的 addr 。相当于建立了一个映射关系。 然后路由器在转发给上一级的路由器。 而服务器在收到这两个请求之后也会构建两个响应返回给我们的运营商的入口路由器。
而入口路由器会根据NATP表中的映射关系找到之前出去的时候替换的那一个条目将目的addr替换。 入口路由器再替换完之后按照替换之后的目的IP转发转发到下一级路由器之后路由器会接着进行NAT替换 最终在主机直接相连的路由器进行完NAT替换之后服务器的响应就回到的我们的主机同时也回到了指定的端口号交给了指定的进程。
我们只要知道了上面的几个图所描述的替换过程后续的几种情况其实就很简单了。 2 同一局域网内的两个主机同时访问一个服务器使用不同的端口号 这时候其实和第一种情况是一样的只不过这次NATP表中两个条目的左列信息 IP 和PORT都不同那么对应的右列的信息的IP还是相同的也就是路由器的WAN 口IP而PORT还是用的报文原始的PORT因为没有冲突。 3 同一局域网内的两个主机同时访问一个服务器使用相同的端口号 这种情况下其实我们的问题并不是NAT的过程而是因为替换之后端口号冲突了这时候要怎么办
其实很简单在进行NAT替换之前会查看路由器的端口号是否已经被使用了如果已经被使用了那么就线性搜索一个未使用的端口号来构建映射关系。
其实路由器这里的端口号我们不必当成真正的端口号只是和IP一起组成一个二元组表征在路由器中发出的消息的唯一性。我们就可以理解为一个数值就行了没必要把他跟传输层的端口号看成是一样的。
在这种情况下其实也很简单无非就是线性向后找一个空闲的port值只要表征唯一性就行了。 后续的过程其实还是跟前面的第一种情况一致。
端口号冲突的报文谁使用原始的端口号完全取决于报文到达的先后顺序因为我们说了路由器这里的端口号其实并不是传输层的端口号只是用来和IP一起表示发送方进程的唯一性的。 4 不同局域网的不同IP的主机使用不同端口号访问同一服务器进程 5 不同局域网的相同IP的主机使用不同端口号访问同一服务器进程 其实不同局域网内的相同IP的主机在经过第一个路由器之后就已经和这个相同的IP无关了这时候其实也和情况4一样。 6 不同局域网的不同IP的主机使用相同端口号访问同一服务器进程 这种情况我们可以将情况2和情况4结合起来在入口或者说出口路由器中未冲突的端口号进行了替换。 这里我们可能会有一个疑问按照上面的例子我们好像只需要保存源IP和源PORT的二元组作为映射关系就行了啊怎么还要保存目的IP和目的PORT用四元组来标识唯一性呢
其实也很好理解因为一个主机上的一个进程可以访问不同的服务器这时候也是需要维护这个关系的。 NAT技术的缺陷 1 只能从内部往外部进行转发的时候才能建立连接无法从外部主动与内部的主机建立连接。
2 NATP表的生成和销毁都需要成本
3 一旦NAT设备异常或者NATP表出现异常这时候所有的TCP连接都会断开。(因为后续TCP保活报文无法发送到目的主机这时候就会认为客户端异常强制断开连接) NAT穿透 也叫内网穿透其实就是利用NAT和NATP表把你的机器暴露在公网中我们可以这样理解 首先我们需要一个公网服务器然后我们的主机不断向该公网服务器发送消息,保证NATP表中我们的主机和这个公网服务器的映射关系一直存在而公网服务器收到的消息后续都转发给我们的主机做处理。 所以最终我们的主机就充当了公网服务器的功能。
但是我们可能会有一个疑问为什么都有一个公网服务器了还需要将请求通过内网穿透转发给在内网的服务主机呢
其实这个公网服务器相当于提供了一层防护或者认证只有通过这个外部的公网服务器的认证之后的请求才会交给真正的服务器也就是在内网中的服务器继续处理。 代理服务器
前面学习的带有NAT技术的路由器我们是不是可以换一种理解 我们将请求交给了NAT路由器然后由路由器代我们去访问服务器最终路由器会将服务器的结果返回给我们的客户端。 而代理服务器和这样的有NAT的路由器有一点像客户端要访问服务器的时候是向代理服务器发送请求由代理服务器将请求发送给真正处理的服务器而服务器只会将结果返回给代理服务器由代理服务器将结果再返回给客户端。 客户端在访问的时候其实是看不到真正的服务器的他只能将请求交给代理服务器。
而代理又分为两种 1 反向代理 客户端只要发送了请求代理服务器都会将请求发给服务器然后将服务器的返回的结果再返回给客户端代理服务器不关心这个结果。 我们上面所画的图其实就是反向代理的图。 2 正向代理客户端第一次发送请求的时候代理服务器还是会将这个请求转发给服务器然后服务器返回结果给代理服务器。 但是这时候代理服务器会将这个结果缓存一份同时将结果返回给客户端。 后续如果有客户端也要请求这份资源代理服务器就不会将这个相同的请求转发给服务器而是直接将自己缓存的资源返回给客户端。 站在上帝视角资源离客户端更近的就是正向代理也就是资源可能在代理服务器中。 而资源每次只从服务器中来就叫做反向代理。 那么代理服务器有什么优势呢
首先我们可以将代理服务器暴露在公网中而把真正的服务器放在内网中这样一来服务器能够更加安全能够通过代理服务器筛选一些非法的请求。
其次站在公司的层面如果流量大一台服务器肯定是顶不住的如果我们不使用代理服务器的话就意味着公司需要多台服务器都暴露在公网中这时候安全风险肯定是增加了的同时公网IP是不足的意味着我们需要增加更多的成本在IP上但是我们不考虑这个每个服务器都必须有一个公网IP那么这时候客户端的请求发给哪一个服务器就取决于报文中的目的IP了无法很好的进行负载均衡。如果我们的客户端的请求全部都是访问其中一台服务器的那么我们搭建多台服务器的初衷就无法满足了最终还是相当于只有一台服务器其他服务器占用了资源浪费了成本却没有创造价值。
而如果我们使用代理服务器的方案只将代理服务器暴露在公网中而将服务器都放在代理服务器所搭建的内网中这在增加了安全性的同时还减少了所需公网IP的数量。 这时候所有的客户端要访问只能访问这个代理服务器而代理服务器则可以将客户端的请求分发给内网中的服务器。
同时为了提高效率以及增加服务集群的承载上限我们的代理服务器需要有一定的策略将收到的大量的客户端请求均衡的转发给集群中的各个服务器。 这样一来就不会出现所有的请求都交给一个服务器处理的情况大大增加了服务器集群的负载能力。 这就叫做负载均衡。
这个代理服务器一般要求配置很高因为他需要有能力同时接收大量的客户端请求同时根据策略转发给内网的服务器。
同时由于需要接受大量的客户端请求所以一般这种代理服务器都是反向代理服务器尽可能地把性能都用在分发大量客户端请求上而不需要将性能用在缓存资源上。 在这些服务器上一般使用类似于 Nginx 之类地反向代理服务的软件。
同时我们也能注意到结果从服务器返回给客户端也可以有两种做法一种是服务器将结果返回给代理服务器而代理服务器再将结果返回给客户端。 其次就是我们可以直接通过NAT技术直接从内网将结果返回给客户端。 按照逻辑来讲第二种做法肯定是效率比较高的因为不需要代理服务器再做其他的事。
当然其实客户端和代理服务器之间也不是直接相连的在代理服务器的前面可能还有防火墙等设备或者软件。
在我们的学校场景中我们使用校园网的时候有时候我们会发现有些网页是打不开的这是因为在我们的客户端和服务器或者服务器的代理服务器之间还存在这一个代理服务器我们的请求其实都是交由学校的代理服务器去进行访问的那么于此同时我们的请求就有可能被学校的服务器拦截。 同时有的学校还会在代理服务器提供缓存功能也就是搞成正向代理服务器这时候如果我们申请相同的资源就是直接在内网中将缓存的内容返回给你速度比较快。 NAT和代理服务器的区别 1 首先从功能上来说NAT是如今路由器上面必须采用的策略解决的是IP不足的问题和硬件联系的。而代理服务器则是更贴近服务器也就是具体的应用也就是更贴近应用。
2 从底层实现来说NAT是工作在网络层(当然也可以说是工作在传输层因为前面我们也知道NAT能看到端口号)对IP(或者以及端口)进行替换而代理服务器则是工作在应用层的。
3 从使用范围来将NAT一般在局域网的出口路由器上部署而代理服务器可以在内网可以在公网也可以跨网络。
4 从部署位置上来看NAT一般集成在防火墙路由器等硬件设备上而代理服务器则是一个软件程序需要部署在服务器上。 我们上面所说的使用代理服务器进行负载均衡将大量请求分发给内网中的服务器我们可以理解为他是局域网中的代理。
而广域网中的代理其实最常见的就是我们所说的翻墙(后面我们简称为 FQ )。
FQ的原理
我们普通用户客户端都是在运营商的内网环境的那么要访问公网的服务器就一定需要经过运营商。如果我们要访问外网正常来说检测到你要访问的网址是国外的网址在运营商的路由器或者服务器就直接给你拦截了不会让你访问。
同时在我们国内也是有一些对接世界的窗口的比如香港地区澳门地区等他们是能够直接访问外网的那么也就意味着搭建在这些地区的服务器也是能够范围外网的于此同时这些服务器还是假设在我们国内所以如果我们只是访问国内的服务器那么运营商一般来说是不会拦截的。
说到这里结果已经呼之欲出了。 如果我们想要FQ那么首先就需要有一台在国内同时能够访问外网的服务器我们可以当成云服务器来用。同时在这个服务器上要部署代理服务器服务。 那么未来我们可以使用特定的一些客户端当我们进行访问的时候假设是https协议进行访问这个客户端和服务器的通信是使用https的那么未来我们使用这个客户端进行外网的访问这个访问外网的报文请求并不是直接通过运营商发给外网。 而是在客户端会做一些处理首先将我们的原始的访问外网的https/http 报文进行加密然后作为一个https报文的有效载荷将这个包含有加密过的https/http请求的https报文发给我们的代理服务器而在代理服务器上的逻辑就是将收到的https报文进行解密解密出来的有效载荷就是我们的访问外网的请求然后将这个请求发出去这个服务器是能够访问外网的那么最终外网的服务器将请求的资源发给了我们的代理服务器最终代理服务器将返回的资源还是经过https进行加密然后作为一个 https 的响应报文的有效载荷返回给我们的客户端而我们的客户端将收到的https相应进行解包之后将有效载荷进行解密这样就获得了我们想要的资源。
当然这样的配套的客户端和服务器都是需要我们付费的这也很好理解。
当然我们还是不推荐FQ 这种行为的我们仅仅是从原理的角度来解析不推荐应用。 以上就是链路层的理解以及对网络层中我们没有讲完的一些知识点进行补充因为有些知识点只有将网络的整体的转发的框架掌握之后我们才能更好理解所以就放在了这里。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83772.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!