理解网络补充--键入网址到网页显示

📅 2026/8/21 4:02:36
理解网络补充--键入网址到网页显示
键入网址到网页显示期间发生了什么接下来以下图较简单的网络拓扑模型作为例子探究探究其间发生了什么孤单小弟 —— HTTP首先浏览器做的第一步工作就是要对 URL 进行解析从而生成发送给 Web 服务器的请求信息。让我们看看一条长长的 URL 里的各个元素的代表什么见下图所以图中的长长的 URL 实际上是请求服务器里的文件资源。要是上图中的蓝色部分 URL 元素都省略了那应该是请求哪个文件呢当没有路径名时就代表访问根目录下事先设置的默认文件也就是 /index.html 或者 /default.html 这些文件这样就不会发生混乱了。生产 HTTP 请求信息对 URL 进行解析之后浏览器确定了 Web 服务器和文件名接下来就是根据这些信息来生成 HTTP 请求消息了。真实地址查询 —— DNS通过浏览器解析 URL 并生成 HTTP 消息后需要委托操作系统将消息发送给 Web 服务器。但在发送之前还有一项工作需要完成那就是查询服务器域名对应的 IP 地址因为委托操作系统发送消息时必须提供通信对象的 IP 地址。有一种服务器就专门保存了 Web 服务器域名与 IP 的对应关系它就是 DNS 服务器。域名的层级关系DNS 中的域名都是用句点来分隔的比如 www.server.com里的句点代表了不同层次之间的界限。在域名中越靠右的位置表示其层级越高。实际上域名最后还有一个点比如 www.server.com.这个最后的一个点代表根域名。也就是. 根域是在最顶层它的下一层就是 .com 顶级域再下面是 server.com。所以域名的层级关系类似一个树状结构根 DNS 服务器.顶级域 DNS 服务器.com权威 DNS 服务器server.com根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中。这样一来任何 DNS 服务器就都可以找到并访问根域 DNS 服务器了。因此客户端只要能够找到任意一台 DNS 服务器就可以通过它找到根域 DNS 服务器然后再一路顺藤摸瓜找到位于下层的某台目标 DNS 服务器。域名解析的工作流程客户端首先会发出一个 DNS 请求问 www.server.com 的 IP 是啥并发给本地 DNS 服务器也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址。本地域名服务器收到客户端的请求后如果缓存里的表格能找到 www.server.com则它直接返回 IP 地址。如果没有本地 DNS 会去问它的根域名服务器“老大 能告诉我 www.server.com 的 IP 地址吗” 根域名服务器是最高层次的它不直接用于域名解析但能指明一条道路。根 DNS 收到来自本地 DNS 的请求后发现后置是 .com说“www.server.com 这个域名归 .com 区域管理”我给你 .com 顶级域名服务器地址给你你去问问它吧。”本地 DNS 收到顶级域名服务器的地址后发起请求问“老二 你能告诉我 www.server.com 的 IP 地址吗”顶级域名服务器说“我给你负责 www.server.com 区域的权威 DNS 服务器的地址你去问它应该能问到”。本地 DNS 于是转向问权威 DNS 服务器“老三www.server.com对应的IP是啥呀”server.com 的权威 DNS 服务器它是域名解析结果的原出处。为啥叫权威呢就是我的域名我做主。权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。本地 DNS 再将 IP 地址返回客户端客户端和目标建立连接。至此我们完成了 DNS 的解析过程。现在总结一下整个过程我画成了一个图。那是不是每次解析域名都要经过那么多的步骤呢当然不是了还有缓存这个东西的嘛。浏览器会先看自身有没有对这个域名的缓存如果有就直接返回如果没有就去问操作系统操作系统也会去看自己的缓存如果有就直接返回如果没有再去 hosts 文件看也没有才会去问「本地 DNS 服务器」。指南好帮手 —— 协议栈通过 DNS 获取到 IP 后就可以把 HTTP 的传输工作交给操作系统中的协议栈。协议栈的内部分为几个部分分别承担不同的工作。上下关系是有一定的规则的上面的部分会向下面的部分委托工作下面的部分收到委托的工作并执行。应用程序浏览器通过调用 Socket 库来委托协议栈工作。协议栈的上半部分有两块分别是负责收发数据的 TCP 和 UDP 协议这两个传输协议会接受应用层的委托执行收发数据的操作。协议栈的下面一半是用 IP 协议控制网络包收发操作在互联网上传数据时数据会被切分成一块块的网络包而将网络包发送给对方的操作就是由 IP 负责的。此外 IP 中还包括 ICMP 协议和 ARP 协议。ICMP 用于告知网络包传送过程中产生的错误以及各种控制信息。ARP 用于根据 IP 地址查询相应的以太网 MAC 地址。IP 下面的网卡驱动程序负责控制网卡硬件而最下面的网卡则负责完成实际的收发操作也就是对网线中的信号执行发送和接收操作。可靠传输 —— TCPHTTP 是基于 TCP 协议传输的所以在这我们先了解下 TCP 协议。TCP 包头格式我们先看看 TCP 报文头部的格式首先源端口号和目标端口号是不可少的如果没有这两个端口号数据就不知道应该发给哪个应用。接下来有包的序号这个是为了解决包乱序的问题。还有应该有的是确认号目的是确认发出去对方是否有收到。如果没有收到就应该重新发送直到送达这个是为了解决丢包的问题。接下来还有一些状态位。例如 SYN 是发起一个连接ACK 是回复RST 是重新连接FIN 是结束连接等。TCP 是面向连接的因而双方要维护连接的状态这些带状态位的包的发送会引起双方的状态变更。还有一个重要的就是窗口大小。TCP 要做流量控制通信双方各声明一个窗口缓存大小标识自己当前能够的处理能力别发送的太快撑死我也别发的太慢饿死我。除了做流量控制以外TCP还会做拥塞控制对于真正的通路堵车不堵车它无能为力唯一能做的就是控制自己也即控制发送的速度。不能改变世界就改变自己嘛。TCP 传输数据之前要先三次握手建立连接所以三次握手目的是保证双方都有发送和接收的能力。TCP 分割数据如果 HTTP 请求消息比较长超过了 MSS 的长度这时 TCP 就需要把 HTTP 的数据拆解成一块块的数据发送而不是一次性发送所有数据。MTU一个网络包的最大长度以太网中一般为 1500 字节。MSS除去 IP 和 TCP 头部之后一个网络包所能容纳的 TCP 数据的最大长度。数据会被以 MSS 的长度为单位进行拆分拆分出来的每一块数据都会被放进单独的网络包中。也就是在每个被拆分的数据加上 TCP 头信息然后交给 IP 模块来发送数据。TCP 报文生成TCP 协议里面会有两个端口一个是客户端的端口通常是随机生成的一个是 Web 服务器监听的端口HTTP 默认端口号是 80HTTPS 默认端口号是 443。在双方建立了连接后TCP 报文中的数据部分就是存放 HTTP 头部 数据组装好 TCP 报文之后就需交给下面的网络层处理。至此网络包的报文如下图。远程定位 —— IPTCP 模块在执行连接、收发、断开等各阶段操作时都需要委托 IP 模块将数据封装成网络包发送给通信对象。IP 包头格式我们先看看 IP 报文头部的格式在 IP 协议里面需要有源地址 IP 和 目标地址 IP源地址IP即是客户端输出的 IP 地址目标地址即通过 DNS 域名解析得到的 Web 服务器 IP。因为 HTTP 是经过 TCP 传输的所以在 IP 包头的协议号要填写为 06十六进制表示协议为 TCP。假设客户端有多个网卡就会有多个 IP 地址那 IP 头部的源地址应该选择哪个 IP 呢当存在多个网卡时在填写源地址 IP 时就需要判断到底应该填写哪个地址。这个判断相当于在多块网卡中判断应该使用哪个一块网卡来发送包。这个时候就需要根据路由表规则来判断哪一个网卡作为源地址 IP。在 Linux 操作系统我们可以使用 route -n 命令查看当前系统的路由表。举个例子根据上面的路由表我们假设 Web 服务器的目标地址是 192.168.10.200。首先先和第一条目的子网掩码Genmask进行 与运算得到结果为 192.168.10.0但是第一个条目的 Destination 是 192.168.3.0两者不一致所以匹配失败。再与第二条目的子网掩码进行 与运算得到的结果为 192.168.10.0与第二条目的 Destination 192.168.10.0 匹配成功所以将使用 eth1 网卡的 IP 地址作为 IP 包头的源地址。假设 Web 服务器的目标地址是 10.100.20.100那么依然按照上面的路由表规则判断判断后的结果是和第三条目匹配。第三条目比较特殊它目标地址和子网掩码都是 0.0.0.0这表示默认网关如果其他所有条目都无法匹配就会自动匹配这一行。并且后续就把包发给路由器Gateway 即是路由器的 IP 地址。IP 报文生成至此网络包的报文如下图。两点传输 —— MAC生成了 IP 头部之后接下来网络包还需要在 IP 头部的前面加上 MAC 头部。MAC 包头格式MAC 头部是以太网使用的头部它包含了接收方和发送方的 MAC 地址等信息。在 MAC 包头里需要发送方 MAC 地址和接收方目标 MAC 地址用于两点之间的传输。一般在 TCP/IP 通信里MAC 包头的协议类型只使用0800 IP 协议0806 ARP 协议MAC 发送方和接收方如何确认?发送方的 MAC 地址获取就比较简单了MAC 地址是在网卡生产时写入到 ROM 里的只要将这个值读取出来写入到 MAC 头部就可以了。接收方的 MAC 地址就有点复杂了只要告诉以太网对方的 MAC 的地址以太网就会帮我们把包发送过去那么很显然这里应该填写对方的 MAC 地址。所以先得搞清楚应该把包发给谁这个只要查一下路由表就知道了。在路由表中找到相匹配的条目然后把包发给 Gateway 列中的 IP 地址就可以了。既然知道要发给谁按如何获取对方的 MAC 地址呢此时就需要 ARP 协议帮我们找到路由器的 MAC 地址。ARP 协议会在以太网中以广播的形式对以太网所有的设备喊出“这个 IP 地址是谁的请把你的 MAC 地址告诉我”。然后就会有人回答“这个 IP 地址是我的我的 MAC 地址是 XXXX”。如果对方和自己处于同一个子网中那么通过上面的操作就可以得到对方的 MAC 地址。然后我们将这个 MAC 地址写入 MAC 头部MAC 头部就完成了。好像每次都要广播获取这不是很麻烦吗放心在后续操作系统会把本次查询结果放到一块叫做 ARP 缓存的内存空间留着以后用不过缓存的时间就几分钟。也就是说在发包时先查询 ARP 缓存如果其中已经保存了对方的 MAC 地址就不需要发送 ARP 查询直接使用 ARP 缓存中的地址。而当 ARP 缓存中不存在对方 MAC 地址时则发送 ARP 广播查询。MAC 报文生成至此网络包的报文如下图。出口 —— 网卡网络包只是存放在内存中的一串二进制数字信息没有办法直接发送给对方。因此我们需要将数字信息转换为电信号才能在网线上传输也就是说这才是真正的数据发送过程。负责执行这一操作的是网卡要控制网卡还需要靠网卡驱动程序。网卡驱动获取网络包之后会将其复制到网卡内的缓存区中接着会在其开头加上报头和起始帧分界符在末尾加上用于检测错误的帧校验序列。起始帧分界符是一个用来表示包起始位置的标记末尾的 FCS帧校验序列用来检查包传输过程是否有损坏最后网卡会将包转为电信号通过网线发送出去。送别者 —— 交换机我们常说的普通交换机核心工作是对以太网数据帧做二层转发全程不会修改帧里的源 MAC 地址和目的 MAC 地址它工作在 OSI 网络模型的数据链路层二层因此也被叫做二层网络设备。交换机的包接收操作首先从终端发来的以太网电信号会通过网线到达交换机的对应端口。交换机的端口物理芯片会先接收信号把连续的电信号转换成能处理的数字信号。随后交换机会通过帧末尾的FCS帧校验序列 检查数据有没有在传输过程中出错如果校验失败会直接丢弃这个帧校验无误的话就把完整的以太网帧存入这个端口的接收缓冲区。这部分信号转换、差错校验的底层操作和我们电脑里的网卡几乎一模一样但二者的核心工作逻辑天差地别。电脑的网卡有自己唯一的 MAC 地址它会像快递驿站一样核对收件人收到的帧里只有目的 MAC 地址是自己的、或是广播 / 组播地址才会收下处理不是发给自己的直接丢掉。但交换机的端口完全不一样它不会核对数据帧的目的 MAC 地址只要是校验通过的合法帧全部收下存入缓冲区。把帧存入缓冲区之后交换机会立刻查自己的「MAC 地址表」看看这个帧的目的 MAC 地址有没有对应的记录。交换机的 MAC 地址表主要包含两个信息局域网内终端设备的 MAC 地址这个终端设备连在交换机的哪个端口上举个例子如果收到的包的接收方 MAC 地址为 00-02-B3-1C-9C-F9则与图中表中的第 3 行匹配根据端口列的信息可知这个地址位于 3 号端口上然后就可以通过交换电路将包发送到相应的端口了。所以交换机根据 MAC 地址表查找 MAC 地址然后将信号发送到相应的端口。当 MAC 地址表找不到指定的 MAC 地址会怎么样地址表中找不到指定的 MAC 地址。这可能是因为具有该地址的设备还没有向交换机发送过包或者这个设备一段时间没有工作导致地址被从地址表中删除了。这种情况下交换机无法判断应该把包转发到哪个端口只能将包转发到除了源端口之外的所有端口上无论该设备连接在哪个端口上都能收到这个包。这样做不会产生什么问题因为以太网的设计本来就是将包发送到整个网络的然后只有相应的接收者才接收包而其他设备则会忽略这个包。有人会说“这样做会发送多余的包会不会造成网络拥塞呢”其实完全不用过于担心因为发送了包之后目标设备会作出响应只要返回了响应包交换机就可以将它的地址写入 MAC 地址表下次也就不需要把包发到所有端口了。局域网中每秒可以传输上千个包多出一两个包并无大碍。此外如果接收方 MAC 地址是一个广播地址那么交换机会将包发送到除源端口之外的所有端口。以下两个属于广播地址MAC 地址中的 FF:FF:FF:FF:FF:FFIP 地址中的 255.255.255.255普通的二级交换机的端口无需MAC地址。二级转发过程不会更改转发包的源MAC和目的MAC。出境大门 —— 路由器路由器与交换机的区别数据包在局域网内经过交换机完成终端之间的转发后就会到达路由器由它把数据包转发到外网的下一个路由器或是跨网段的目标设备。路由器和交换机的转发逻辑有一个共同点都靠 「查表」 来决定数据包该发到哪但二者查的表、转发的规则、负责的工作完全不一样。二者最核心的区别在于工作的网络层级和能力边界具体如下路由器是工作在网络层的三层设备核心是基于 IP 地址做跨网段转发俗称网络的 「出口大门」。它的每个负责路由转发的端口都有专属的 MAC 地址和 IP 地址既能识别二层以太网帧也能处理三层 IP 包。普通二层交换机是工作在数据链路层的二层设备核心是基于 MAC 地址做同局域网内的终端转发俗称局域网的 「内部枢纽」。它的每个物理端口都有自己的 MAC 地址但本身没有 IP 地址只识别和处理以太网帧不处理 IP 层的内容。路由器基本原理路由器的端口具有 MAC 地址因此它就能够成为以太网的发送方和接收方同时还具有 IP 地址从这个意义上来说它和计算机的网卡是一样的。当转发包时首先路由器端口会接收发给自己的以太网包然后路由表查询转发目标再由相应的端口作为发送方将以太网包发送出去。路由器的包接收操作首先电信号到达网线接口部分路由器中的模块会将电信号转成数字信号然后通过包末尾的 FCS 进行错误校验。如果没问题则检查 MAC 头部中的接收方 MAC 地址看看是不是发给自己的包如果是就放到接收缓冲区中否则就丢弃这个包。总的来说路由器的端口都具有 MAC 地址只接收与自身地址匹配的包遇到不匹配的包则直接丢弃。查询路由表确定输出端口完成包接收操作之后路由器就会去掉包开头的 MAC 头部。MAC 头部的作用就是将包送达路由器其中的接收方 MAC 地址就是路由器端口的 MAC 地址。因此当包到达路由器之后MAC 头部的任务就完成了于是 MAC 头部就会被丢弃。接下来路由器会根据 MAC 头部后方的 IP 头部中的内容进行包的转发操作。转发操作分为几个阶段首先是查询路由表判断转发目标。具体的工作流程根据上图举个例子。假设地址为10.10.1.101的计算机要向地址为192.168.1.100的服务器发送一个包这个包先到达图中的路由器。判断转发目标的第一步就是根据包的接收方 IP 地址查询路由表中的目标地址栏以找到相匹配的记录。路由匹配和前面讲的一样每个条目的子网掩码和192.168.1.100IP 做 与运算后得到的结果与对应条目的目标地址进行匹配如果匹配就会作为候选转发目标如果不匹配就继续与下个条目进行路由匹配。如第二条目的子网掩码255.255.255.0与192.168.1.100IP做 与运算后得到结果是192.168.1.0这与第二条目的目标地址192.168.1.0匹配该第二条目记录就会被作为转发目标。这与第二条目的目标地址192.168.1.0匹配该第二条目记录就会被作为转发目标。路由器的发送操作接下来就会进入包的发送操作。首先我们需要根据路由表的网关列判断对方的地址。如果网关是一个 IP 地址则这个IP 地址就是我们要转发到的目标地址还未抵达终点还需继续需要路由器转发。如果网关为空则 IP 头部中的接收方 IP 地址就是要转发到的目标地址也是就终于找到 IP 包头里的目标地址了说明已抵达终点。知道对方的 IP 地址之后接下来需要通过 ARP 协议根据 IP 地址查询 MAC 地址并将查询的结果作为接收方 MAC 地址。路由器也有 ARP 缓存因此首先会在 ARP 缓存中查询如果找不到则发送 ARP 查询请求。接下来是发送方 MAC 地址字段这里填写输出端口的 MAC 地址。还有一个以太类型字段填写 0800 十六进制表示 IP 协议。网络包完成后接下来会将其转换成电信号并通过端口发送出去。这一步的工作过程和计算机也是相同的。发送出去的网络包会通过交换机到达下一个路由器。由于接收方 MAC 地址就是下一个路由器的地址所以交换机会根据这一地址将包传输到下一个路由器。接下来下一个路由器会将包转发给再下一个路由器经过层层转发之后网络包就到达了最终的目的地。互相扒皮 —— 服务器 与 客户端数据包抵达服务器后服务器会先扒开数据包的 MAC 头部查看是否和服务器自己的 MAC 地址符合符合就将包收起来。接着继续扒开数据包的 IP 头发现 IP 地址符合根据 IP 头中协议项知道自己上层是 TCP 协议。于是扒开 TCP 的头里面有序列号需要看一看这个序列包是不是我想要的如果是就放入缓存中然后返回一个 ACK如果不是就丢弃。TCP 头部里面还有端口号 HTTP 的服务器正在监听这个端口号。于是服务器自然就知道是 HTTP 进程想要这个包于是就将包发给 HTTP 进程。服务器的 HTTP 进程看到原来这个请求是要访问一个页面于是就把这个网页封装在 HTTP 响应报文里。HTTP 响应报文也需要穿上 TCP、IP、MAC 头部不过这次是源地址是服务器 IP 地址目的地址是客户端 IP 地址。穿好头部衣服后从网卡出去交由交换机转发到出城的路由器路由器就把响应数据包发到了下一个路由器就这样跳啊跳。最后跳到了客户端的城门把守的路由器路由器扒开 IP 头部发现是要找城内的人于是又把包发给了城内的交换机再由交换机转发到客户端。客户端收到了服务器的响应数据包后同样也非常的高兴客户能拆快递了于是客户端开始扒皮把收到的数据包的皮扒剩 HTTP 响应报文后交给浏览器去渲染页面一份特别的数据包快递就这样显示出来了最后客户端要离开了向服务器发起了 TCP 四次挥手至此双方的连接就断开了。