在我第一次接触计网东西的时候是前端的浏览器页面右击检查,点开Network,发现里面的东西都不大了解,甚至看不懂这些是什么,但我知道这是和后端交互,给后端发送请求,学习计网时我的基础也只有2xx、3xx、4xx、5xx这些状态码的含义。其他一概不知。学习计网的第一天也是我实习的第一天。

计网的学习可以参照三本书《图解 TCP/IP》《图解 HTTP》《网络是怎么连接的》小林codinghttps://xiaolincoding.com/,本站的所有计网有关的博客都是在小林coding上基于自己的理解写的。

接下来让我们开启计网的学习!

2024.10.8

当键入网址后,到页面显示,其间发生了什么 这个面试题是我第一次面试时被面试官问到了,当时答的一塌糊涂,完全是想到什么说什么。

下面就用小林coding里面的网络拓扑模型作为例子,看看里面会发生什么?

简单的网络模型

首先浏览器做的第一步工作就是要对 URL 进行解析,从而生成发送给 Web 服务器的请求信息。

url里面有什么?见下图:

URL 解析

其中http和https是访问协议,其区别是 :

HTTP 是以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息。默认工作在 TCP 协议 80 端口。

HTTPS 是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。默认工作在 TCP 协议443端口。

服务器名后面跟着的就是请求服务器里的文件资源。

网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性;用协商的hash算法进行数据完整性保护,保证数据不被篡改。

真实地址查询 —— DNS

通过浏览器解析 URL 并生成 HTTP 消息后,需要委托操作系统将消息发送给 Web 服务器。

但在发送之前,还有一项工作需要完成,那就是查询服务器域名对应的 IP 地址,因为委托操作系统发送消息时,必须提供通信对象的 IP 地址。

比如我们打电话的时候,必须要知道对方的电话号码,但由于电话号码难以记忆,所以通常我们会将对方电话号 + 姓名保存在通讯录里。

所以,有一种服务器就专门保存了 Web 服务器域名与 IP 的对应关系,它就是 DNS 服务器。

例如:www.server.com.,这个最后的一个点代表根域名。`.`根域是在最顶层,它的下一层就是 .com 顶级域,再下面是 server.com

  • 根 DNS 服务器(.)
  • 顶级域 DNS 服务器(.com)
  • 权威 DNS 服务器(server.com)

域名解析的工作流程:【小林coding里面写的很详细,在这里使用小林coding的图来展示】

域名解析的工作流程

浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去 hosts 文件看,也没有,才会去问「本地 DNS 服务器」。

2024.10.9

昨天当键入网址后,到页面显示,其间发生了什么 这个问题还没写完,今天继续!

指南好帮手 —— 协议栈

通过 DNS 获取到 IP 后,就可以把 HTTP 的传输工作交给操作系统中的协议栈。

协议栈的内部分为几个部分,分别承担不同的工作。上下关系是有一定的规则的,上面的部分会向下面的部分委托工作,下面的部分收到委托的工作并执行。

img

可靠传输 —— TCP

HTTP 是基于 TCP 协议传输的,先了解一下TCP协议。

TCP 传输数据之前,要先三次握手建立连接:

TCP 三次握手

用TCP协议把数据包送出去后,TCP不会对传达后的情况置之不理,它一定会向对方确认是否成功送达。握手过程中使用了TCP的标志——SYN和ACK。

发送端首先发送一个带有SYN标志的数据包给对方。接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后,发送端再回传一个带ACK标志的数据包,代表“握手”结束。

2024.10.10

远程定位 —— IP

TCP模块在执行连接、收发、断开等各阶段操作时,都需要委托IP模块将数据封装成 网络包 发送给通信对象。

在IP协议里面需要有源地址IP目标地址IP

  • 源地址IP,时客户端输出的IP地址;
  • 目标地址,通过DNS域名解析得到的Web服务器IP。

两点传输 —— MAC

生成了 IP 头部之后,接下来网络包还需要在 IP 头部的前面加上 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 广播

ARP协议会在以太网中以 广播 的形式,对以太网所有的设备喊出:”这个IP地址是谁的?请把你的MAC地址告诉我”。

然后就会有人回答:“这个 IP 地址是我的,我的 MAC 地址是 XXXX”。

如果对方和自己处于同一个子网中,那么通过上面的操作就可以得到对方的 MAC 地址。然后,我们将这个 MAC 地址写入 MAC 头部,MAC 头部就完成了。

好像每次都要广播获取,这不是很麻烦吗?

在后续操作系统会把本次查询结果放到一块叫做 ARP 缓存的内存空间留着以后用,不过缓存的时间就几分钟。

  • 先查询ARP缓存,如果其中已经保存了对方的MAC地址,就不需要发送ARP查询,直接使用ARP缓存中的地址。
  • 而当ARP缓存中不存在对方MAC地址时,则发送ARP广播查询

查看 ARP 缓存内容

ARP 缓存内容

出口——网卡

网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方。因此,我们需要将数字信息转换为电信号,才能在网线上传输,也就是说,这才是真正的数据发送过程。

负责执行这一操作的是网卡,要控制网卡还需要靠网卡驱动程序

网卡驱动获取网络包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列

数据包

  • 起始帧分界符是一个用来表示包起始位置的标记
  • 末尾的 FCS(帧校验序列)用来检查包传输过程是否有损坏

最后网卡会将包转为电信号,通过网线发送出去。

送别者——交换机

下面来看一下包是如何通过交换机的。交换机的设计是将网络包原样转发到目的地。交换机工作在 MAC层,也称为二层网络设备

交换机的包接收操作

首先,电信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换为数字信号。然后通过包末尾的 FCS 校验错误,如果没问题则放到缓冲区。这部分操作基本和计算机的网卡相同,但交换机的工作方式和网卡不同。

计算机的网卡本身具有MAC地址,并通过核对接收到的包的接收方MAC地址判断是不是发给自己的,如果不是发给自己的则丢弃;相对地,交换机的端口不核对接收方 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:FF
  • IP 地址中的 255.255.255.255

2024.10.12

昨天太忙了。。。

出境大门——路由器

网络包经过交换机之后,现在到达了路由器,并在此被转发到下一个路由器或目标设备。

这一步转发的工作原理和交换机类似,也是通过查表判断包转发的目标。

路由器与交换机的区别

  • 因为 路由器 是基于IP设计的,俗称三层网络设备,路由器的各个端口都具有 MAC 地址和 IP 地址;
  • 交换机 是基于以太网设计的,俗称二层网络设备,交换机的端口不具有 MAC 地址。

路由器基本原理

路由器的端口具有 MAC 地址,因此它就能够成为以太网的发送方和接收方;同时还具有 IP 地址,从这个意义上来说,它和计算机的网卡是一样的。

当转发包时,首先路由器端口会接收发给自己的以太网包,然后路由表查询转发目标,再由相应的端口作为发送方将以太网包发送出去。

路由器的包接收操作

首先,电信号到达网线接口部分,路由器中的模块会将电信号转成数字信号,然后通过包末尾的 FCS 进行错误校验。

如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。

总的来说,路由器的端口都具有 MAC 地址,只接收与自身地址匹配的包,遇到不匹配的包则直接丢弃。

查询路由表确定输出端口

完成包接收操作之后,路由器就会去掉包开头的 MAC 头部。

接下来,路由器会根据 MAC 头部后方的 IP 头部中的内容进行包的转发操作。

转发操作分为几个阶段,首先是查询路由表判断转发目标。

路由器转发

路由器的发送操作

进入包的发送操作

首先,我们需要根据路由表的网关列判断对方的地址。

  • 如果网关是一个 IP 地址,则这个IP 地址就是我们要转发到的目标地址,还未抵达终点,还需继续需要路由器转发。
  • 如果网关为空,则 IP 头部中的接收方 IP 地址就是要转发到的目标地址,也是就终于找到 IP 包头里的目标地址了,说明已抵达终点

知道对方的 IP 地址之后,接下来需要通过 ARP 协议根据 IP 地址查询 MAC 地址,并将查询的结果作为接收方 MAC 地址。

路由器也有 ARP 缓存,因此首先会在 ARP 缓存中查询,如果找不到则发送 ARP 查询请求。

接下来是发送方 MAC 地址字段,这里填写输出端口的 MAC 地址。还有一个以太类型字段,填写 0800 (十六进制)表示 IP 协议。

网络包完成后,接下来会将其转换成电信号并通过端口发送出去。

发送出去的网络包会通过交换机到达下一个路由器。由于接收方 MAC 地址就是下一个路由器的地址,所以交换机会根据这一地址将包传输到下一个路由器。

接下来,下一个路由器会将包转发给再下一个路由器,经过层层转发之后,网络包就到达了最终的目的地。

在网络包传输的过程中,源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。

相互扒皮——服务器 与 客户端

网络分层模型

至此,当键入网址后,到页面显示,其间发生了什么?就是全部内容了。

参考资料:

https://xiaolincoding.com/network/1_base/what_happen_url.html#%E4%BA%92%E7%9B%B8%E6%89%92%E7%9A%AE-%E6%9C%8D%E5%8A%A1%E5%99%A8-%E4%B8%8E-%E5%AE%A2%E6%88%B7%E7%AB%AF



通过几天的视频学习,了解了三种交换方式、性能指标和体系结构✌️,下面开始吧!这些都是我在实习期间偷偷摸摸写的,偷感好重😭😭

2024.10.17

常用的性能指标有以下8个:

  • 速率
  • 带宽
  • 吞吐量:单位时间内通过某个网络的数据量
  • 时延:发送时延、传播时延、处理时延
  • 时延带宽积:传播时延和带宽的乘积
  • 往返时间
  • 利用率
  • 丢包率:丢失的分组数量与总分组数量的比率,分组丢失主要原因:分组误码、网络拥塞

image-20241017130703039

常见的计算机网络体系结构

OSI体系结构

从下至上:物理层、数据链路层、网络层、运输层、会话层、表示层、应用层

TCP/IP体系结构

从下至上:网络接口层、网际层、运输层、应用层

原理体系结构

从下至上:物理层、数据链路层、网络层、运输层、应用层

image-20241017130638031

五个层次在这个过程的作用是:

主机发送:

  1. 应用层:根据HTTP协议构建一个报文,把报文交给运输层处理。

  2. 运输层:根据HTTP请求报文添加一个TCP首部,使之成为TCP报文段。该首部的作用:区分应用进程、实现可靠传输。然后将TCP报文段交给网络层处理。

  3. 网络层:给TCP报文段添加IP首部,是指成为IP数据报,作用是使之可以在互联网上传输(即,被路由器转发)。然后将IP数据报交给数据链路层处理。

  4. 数据链路层:给IP数据报添加首部和尾部,使之成为帧。帧首部的作用是为了让帧能够在一段链路上或一个网络上传输,能够被相应的目的主机接受。帧尾部的目的是让目的主机检查所接受到的帧是否有误码。数据链路层将帧交给物理层。

  5. 物理层:将帧看作比特流。给该比特流前加前导码,作用是让目的主机做好接受帧的准备。物理层将添加前导码的比特流变换成相应的信号发送到传输媒体,信号通过传输媒体到达路由器。

路由器转发

  1. 物理层:收到信号后将信号变换为比特流,去掉前导码,交付给数据链路层。实际上交付的是帧。
  2. 数据链路层:去掉帧的首部和尾部,将其交付给网络层,实际上交付的是IP数据报。
  3. 网络层:解析IP数据报的首部,从中提取目的网络地址,查找自身的路由表,确定转发端口,以便数据转发。网络层将IP数据报交付给数据链路层。
  4. 数据链路层:添加一个首部和尾部,变成帧。
  5. 物理层:接受帧,将其看作比特流,加前导码。将加了前导码的比特流变换成相应的信号发送到传输媒体。

服务器接收

  1. 物理层:信号通过传输媒体到达服务器的物理层,物理层将其变为比特流,去掉前导码,交付给数据链路层。实际上交付的是帧。
  2. 数据链路层:去掉帧的首部和尾部,将其交付给网络层,实际上交付的是IP数据报。
  3. 网络层:将IP数据报的首部去掉后,将其交付给运输层,实际上交付的是TCP报文段。
  4. 运输层:将TCP报文段的首部去掉后,将其交付给应用层。实际上交付的是HTTP请求报文。
  5. 应用层:对HTTP请求报文进行解析,然后给主机发回响应报文。

image-20241017130607193

2024.10.18

TCP/IP网络模型

应用层

专注于为用户提供应用功能,比如 HTTP、FTP、Telnet、DNS、SMTP等。专注于为用户提供应用功能,比如 HTTP、FTP、Telnet、DNS、SMTP等。而且应用层是工作在操作系统中的用户态,传输层及以下则工作在内核态。

传输层

应用层的数据包会传给传输层,传输层Transport Layer)是为应用层提供网络支持的。

在传输层会有两个传输协议,分别是 TCPUDP

网络层

最常使用的是 IP 协议(Internet Protocol),IP 协议会将传输层的报文作为数据部分,再加上 IP 包头组装成 IP 报文,如果 IP 报文大小超过 MTU(以太网中一般为 1500 字节)就会再次进行分片,得到一个即将发送到网络的 IP 报文。

img

网络层负责将数据从一个设备传输到另一个设备,世界上那么多设备,又该如何找到对方呢?因此,网络层需要有区分设备的编号。

我们一般用 IP 地址给设备进行编号,对于 IPv4 协议, IP 地址共 32 位,分成了四段(比如,192.168.100.1),每段是 8 位。只有一个单纯的 IP 地址虽然做到了区分设备,但是寻址起来就特别麻烦,全世界那么多台设备,难道一个一个去匹配?这显然不科学。

因此,需要将 IP 地址分成两种意义:

  • 一个是网络号,负责标识该 IP 地址是属于哪个「子网」的;

  • 一个是主机号,负责标识同一「子网」下的不同主机;

怎么分的呢?这需要配合子网掩码才能算出 IP 地址 的网络号和主机号。

比如 10.100.122.0/24,后面的/24表示就是 255.255.255.0 子网掩码,

知道了子网掩码,该怎么计算出网络地址和主机地址呢?

将 10.100.122.2 和 255.255.255.0 进行按位与运算,就可以得到网络号,如下图:

img

将 255.255.255.0 取反后与IP地址进行进行按位与运算,就可以得到主机号。

那么在寻址的过程中,先匹配到相同的网络号(表示要找到同一个子网),才会去找对应的主机。

IP地址的网络号

所以,IP 协议的寻址作用是告诉我们去往下一个目的地该朝哪个方向走,路由则是根据「下一个目的地」选择路径。寻址更像在导航,路由更像在操作方向盘

网络接口层

生成了 IP 头部之后,接下来要交给网络接口层Link Layer)在 IP 头部的前面加上 MAC 头部,并封装成数据帧(Data frame)发送到网络上。

以太网在判断网络包目的地时和 IP 的方式不同,因此必须采用相匹配的方式才能在以太网中将包发往目的地,而 MAC 头部就是干这个用的,所以,在以太网进行通讯要用到 MAC 地址。

MAC 头部是以太网使用的头部,它包含了接收方和发送方的 MAC 地址等信息,我们可以通过 ARP 协议获取对方的 MAC 地址。

所以说,网络接口层主要为网络层提供「链路级别」传输的服务,负责在以太网、WiFi 这样的底层网络上发送原始数据包,工作在网卡这个层次,使用 MAC 地址来标识网络上的设备。

总结

综上所述,TCP/IP 网络通常是由上到下分成 4 层,分别是应用层,传输层,网络层和网络接口层

img

网络接口层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。但这些名词并没有什么本质的区分,可以统称为数据包。