# 概念
# 互联网 Internet
互联网是一个全球性的网络,由无数个私人网、公共网、学术网和政府网所组成,这些网络通过一系列标准的协议和技术服务相互连接,互联网的核心包括:全球性、开放性、互联性和服务多样性。
# 广域网 WAN
广域网是一种覆盖地理区域的计算机网络,通常跨越多个城市、州或国家。广域网
# PPP 链路
广域网在数据链路层通过 PPP 协议来传输数据。
PPP 点对点协议
# 路由器
路由器又称为网关
- 一台路由器对应多个网卡
- 路由器可以拥有多个 IP 地址,常见有内部 IP 地址、外部 IP 地址和其他 IP 地址。
- 路由器还可以支持网络地址转换(NAT 协议),可以将局域网划分为多个独立的子网,每个子网都有自己的 IP 地址范围。
- 路由器 WAN 口 IP 是 ISP 提供的 IP 地址,可能由 ISP 动态分配,也可能是静态分配的,用于路由器与互联网之间的通信。
- 路由器 LAN 口 IP 是路由器为其管理的局域网分配的 IP 地址,每一个 LAN 口对应一个端口号,用于设备与路由器之间通信。
# IP 地址
- IP 地址按照划分大小分为 IPv4 和 IPv6。
- IP 地址按照网络类型分为:公网 IP 和私网 IP。
- 局域网内的 IP 地址是由路由器进行分配的。
- 路由器的 IP 地址是由 ISP 动态分配的,也可能是静态分配的。
# 局域网
局域网在数据链路层通过以太网协议传输数据。
局域网是一种计算机网络,通常覆盖的范围较小,局域网允许连接到网络上的设备(计算机打印机等)之间相互通信和共享资源,特点是传输速度快,延迟低。
- 局域网除了以太网还有无线局域网、令牌环网等网络技术。
# 以太网
以太网是一种局域网技术,定义了数据在局域网中的传输方式,以太网使用 MAC 地址进行设备间的通信,并且支持多种传输介质,包含双绞线、光纤等。
# 以太网链路
概念
- 以太网链路是指:在以太网技术中,两个网络设备之间的物理连接或逻辑连接。
- 物理连接通过:双绞线、光纤等
- 逻辑连接通过:交换机或路由器等设备
# 以太网协议
以太网链路传输过程
- 封装成帧(帧头(包含目的地址和源 MAC 地址)、数据载荷(承载上层协议的数据)和帧尾(包含 CRC 循环冗余校验的字段,用于错误检测))
- 访问控制(多个设备同时发送数据会导致冲突,以太网链路使用载波监听多路访问协议来控制设备的访问)
- 传输(通过物理介质发送封装好的以太网帧)
- 接收(网络接口卡捕获物理介质传输过来的比特流,将物理信号转换为电子信号)
- 解封装(通过帧尾 CRC 字段确认是否存在错误,如果数据无误则将其传递给上层协议进一步处理)
- 确认(全双工通信中,接收设备可能会发送一个确认信号回发送设备,告知数据成功接收)
# 集线器
概念
- 一种基本的网络设备,用于将多个网络设备连接到一个单一的物理网络段,主要功能用于转发,但是由于各个端口之间不记录与设备间的映射关系,所以要以广播的方式转发、传输效率很低。
# 交换机
概念
- 交换机是一种更高级的网络设备,记录了每个端口对应设备的 MAC 地址,进而实现针对性的转发。它可以通过:MAC 地址学习,帧转发和交换机端口来管理数据流。
MAC 地址学习
- 交换机能够学习并维护一个 MAC 地址表,记录每个端口上连接设备的 MAC 地址。
- 帧转发:当交换机接收到一个帧数据流时,它会查看帧内的 MAC 地址,并根据 MAC 地址表决定将帧转发到哪一个端口,如果目的 MAC 地址不在表中,交换机会通过地址解析协议(广播所有端口)找到对应的 MAC 地址,并更新 MAC 地址表
- 交换机端口:交换机每个端口可以独立工作在全双工模式,这意味着数据可以同时双向传输,提高了传输效率。
# MAC 地址
每台设备都有自己唯一的 MAC 地址,出厂就已经指定了。
# 地址解析协议 ARP
地址解析协议 ARP 用于将 IP 地址解析到 MAC 地址,当通信发生在不同网络时,ARP 可以结合路由信息通过代理 ARP 或路由器的 ARP 表来解析目标 MAC 地址。
# 网际报文控制协议 ICMP
ICMP 网际报文控制协议是 TCP/IP 协议族的一种网络层协议,是一个面向无连接的协议,不保证消息的可靠性只发送控制信息,用于在 IP 主机和路由器之间传递控制信息。
ICMP 和 UDP 的区别
- UDP 工作在传输层,
# 内网穿透
- 内网穿透的原因是因为内网 IP 是由路由器分配的,内网可以访问外网(公网),但是外网由于没有这个路由器上对应到该内网的端口映射关系,因此外网访问不到内网
- 内网穿透的原理就是:内网的服务主动访问外网的某个服务器,主动被这个外网的服务器所代理。
# 分层
# 应用层(应用之间、传输数据)
最上层的应用就是应用层
- 我们直接接触的就是应用层,电脑或手机使用的
应用软件就是在应用层实现 - 应用层只需要专注于为用户提供应用功能,如:
HTTPFTPDNS等 - 应用层不用关系数据是如何传输的,应用层工作在操作系统中的用户态,传输层及以下工作在内核态
# 传输层(主机之间、分段)
传输层并不直接负责将数据从一个设备传到另一个设备,因为实际的网络传输环节是错综复杂的,中间有很多线路和选择,传输层的设计理念是简单、高效和专注,传输层只需要服务好应用即可.
- 传输层用于处理应用层的数据包,为应用层提供网络支持
- 传输层有两个协议:
TCP和UDP
UDP (用户数据报协议),是无连接的不可靠服务
- UDP 只负责发送数据包,不保证数据包的可靠性,因此它的
实时性更好,传输效率更高
TCP (传输控制协议),面向连接的可靠服务
- TCP 在传输数据之前,要先进行
三次握手建立连接,最少三次握手才能保证接收方和发送方具有正常的收发能力 - TCP 在断开连接时,要进行
四次挥手断开连接,断开时,发送方会先发送数据,然后再发送一个断开的消息,这两次不能合并的原因就是:一旦接收方返回的数据包丢失,就会导致接收方认为连接断开,而发送方还要发送数据,从而导致半开连接的状态 - TCP 相比于 UDP 多了:
流量控制、超时重传、拥塞控制等特性,目的是保证数据包能可靠的传输给对方 - 当传输层的数据包大小超过
TCP最大报文段时,就要重新进行数据包分块,这样即使中途有一个分块丢失了,也只需要重新发送这一个分块,而不必重新发送整个数据包。其中的每个分块被成为TCP段 - 设备作为接收方时,传输层要负责将数据包传给应用,但是一台设备上可能有很多应用在接收或者传输数据,因此需要一个编号进行区分,这个编号就是
端口 - 传输层并不直接负责传输,他只负责处理好应用数据的传输功能,作为应用数据的传输媒介,实际的传输功能由下一层网络层来处理
# 网络层(主机设备之间、分组、数据报)
网络层负责将数据从一个设备传输到另一个设备
- 网络层最常用的协议是 IP
协议,用于得到一个发送到网络的 IP 报文 - IP 协议会将
传输层的报文作为数据部分,再加上IP包头组成IP报文,如果 IP 报文大小超过 MTU, 就会再次进行分片,得到一个即将发送到网络的 IP 报文
ip 地址寻址 (选择方向)
- 由于设备太多,因此网络层需要有一个区分设备的编号,即
ip地址 - ip 地址通过子网掩码被分为两种意义:
网络号和主机号 网络号标识该 ip 地址属于哪个子网主机号标识同一子网下的不同主机- 区分 ip 地址时需要子网掩码才能计算出 ip 地址的网络号和主机号,
网络号 = IP地址 & 子网掩码,主机号 = IP地址 & ~子网掩码
ip 地址路由 (选择路径)
- 两台设备不是直接通过网线相连的,而是通过很多网关、路由器、交换机等多种网络连接起来的,从而形成了很多网络路径,当数据包到达一个网络节点,就需要通过路由算法决定下一步走哪一条路径
- ip 地址路由就是先找到目标地址的子网,再将数据包转发到对应的网络中
# 数据链路层(以太网设备之间、封装成帧)
在 IP 头部的前面加上 MAC 头部,并封装成数据帧发送到网络上
# 物理层(物理媒介之间、物理信号变为电子信号)
以太网
- 以太网就是一种在局域网内,将附近的设备连接起来,使他们之间可以进行通讯的技术
- 常见的以太网有:
wifi接口以太网交换机路由器以太网接口 MAC地址用于标识以太网上的设备,它和网络接口卡相绑定- 以太网在判断网络包的目的地时,必须采用相匹配的方式才能在以太网中将包发往目的地,而
MAC地址就是这个作用 - 通过
ARP地址解析协议就可以获得到MAC地址
无线局域网 WLAN
- 和以太网的工作大致相同,不同在于
无线局域网使用无线电波进行数据传输
# url 输入网址后,发生了什么
- 补全 url
补全 url 协议、端口号和默认文件名,http 默认 80 端口,https 默认 443 端口,index.html
- 检查浏览器缓存
- 生成 http 请求
- 进行 DNS 解析
生成 http 请求之后,如果浏览器和本地 DNS 服务器中没有相应的缓存,就会通过本地 DNS 服务器进行请求,询问域名对应的 ip 地址。
DNS 用于查询域名对应的 ip 地址,在域名中,越靠右其层级越高,实际上域名末尾还有一个 . ,他表示根域名,.com 表示顶级域名,baidu 表示权威域名
- 跟域名(DNS)服务器(.)
- 顶级域名(DNS)服务器(.com)
- 权威域名(DNS)服务器(dmqweb.com)
- 本地 DNS 服务器。
- 得到 IP 地址后,发生系统调用,交给
操作系统网络协议栈,找到其使用的协议为TCP协议
操作系统协议栈就是一组网络通信协议的集合,用于标准化通信,分层处理,模块化设计,网络管理和接口定义等。
- 加上 TCP 首部封装为 TCP 报文(操作系统的 TCP 协议模块、传输层)
- 加上 IP 首部封装为 IP 数据报(操作系统 IP 协议模块、网络层)
- 加上 MAC 地址帧头帧尾,封装为网络包(将 IP 数据包封装成网络帧、数据链路层)
- 交给网卡,网卡驱动程序将网络包转为电信号,通过网线发送出去
- 网络包被交换机和路由器中转,最后被转发到目的 ip 地址对应的路由器
- 路由器根据 IP 地址找到 MAC 地址对应的设备
- 设备(服务器)通过端口号找到对应的服务
- 服务端处理请求的数据,通过相同的方式,返回 html 给请求方的浏览器
- 浏览器解析 html 为 DOM 树,解析 css 为 CSSOM 树,两者不冲突,当遇到 js 文件就会去请求并执行 js 文件,js 文件由于会操作 DOM 树,因此和渲染主线程互斥。
- 将 DOM 树和 CSSOM 树合并为渲染树。
- 浏览器进行分层、布局、光栅化生成绘制指令。
- 最后调用 GPU 渲染像素点。
# HTTP
# 概念
超文本传输协议,计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。
# 常见状态码
1xx 提示信息,表示协议处理的中间状态
2xx 成功
- 200 OK
- 204 无内容
- 206 分块下载或断点上传
3xx 资源变动
- 301 永久重定向
- 302 临时重定向
4xx 请求有误
- 400 请求有误(笼统)
- 403 禁止访问
- 404 未找到资源
5xx 服务器错误
- 500 服务器错误(笼统)
- 501 不支持该请求
- 502 网关或代理错误
- 503 服务器繁忙
# HTTP 字段
- Host,指定服务器域名
- Content-Length 数据长度
- Connection 连接机制
- Content-Type 数据类型
- Content-Encoding、Accept-Encoding 压缩方法
# HTTP 缓存
强制缓存,用于长时间不会变化的资源
通过资源的 Cache-Control(资源有效期)响应头和 Expires(缓存到期时间)字段来判断资源是否过期,如果资源没有过期,浏览器直接使用缓存的资源,而不发送网络请求。
- Cache-Control 优先级大于 Expires。
- 最开始使用 Expires 表示资源的过期时间,但是由于客户端和服务器端时间可能不一致,从而导致一些问题
- 后来出现 Cache-control 表示资源的过期时长。
协商缓存,用于不定时变化,但不会经常变化的资源
浏览器正常发送网络请求,服务端通过请求头判断是否要返回 304 状态码,表示浏览器可以使用本地缓存的资源。
- Etag 优先级大于 Last-Modified。
- 最开始使用 Last-Modified(资源最后修改时间)和 If-Modified-Since(上一次从服务器获取的 Last-Modified 值),但是 last-Modified 是以秒级别记录的,当资源在一秒内发生改变的话,last-modified 是无感知的。
- 后面使用 Etag(资源唯一标识)和 If-None-Match(上一次从服务器获取的 Etag),比对服务器的 Etag,如果比对相同就返回 304 状态码。
# HTTPS 和 HTTP 的不同
HTTPS 就是在 HTTP 的基础之上,进行了 TLS 加密(前身是 SSL),进行信息加密和身份验证。
- SSL 证书,就是保存在服务器的证书文件,服务端需要向 CA 证书授权中心申请
- SSL 加密过程先通过非对称加密获取密钥,然后通过对称加密进行通信,从而避免了非对称加密繁琐的过程
具体加密的过程就是:
- 客户端发送自己支持的加密方式,并给出第一随机数
- 服务端发送自己的加密方式、证书、并给出第二随机数
- 客户端根据两个随机数随机生成预主密钥,通过证书中的公钥对预主密钥进行加密,发送给服务端
- 服务端通过私钥对加密的预主密钥进行解密,获取到预主密钥
- 双方通过第一随机数、第二随机数和预主密钥混合,得到会话密钥,双方的相同
对称加密的过程就是:
- 后续双方都使用会话密钥进行加密,会话密钥只在当前会话中有效。
# HTTP 版本
HTTP1.1
- 核心:pipeline 管道模式,请求到一个之后才能去请求下一个,其中有一个没有收到就会导致后面的都接收不到,从而导致 HTTP 队头阻塞
- 持久连接,保持连接状态,每个域有最大的持久连接数(HTTP 队头阻塞):chrome 为 6 个,其他浏览器各不相同(减少请求次数:域名分片、精灵图和 base64 图片)
- 首部重复发送(尤其是 cookie)
- 明文传输,报文进行压缩,但是首部不压缩
HTTP2
- 多路复用(用于解决 HTTP 队头阻塞问题,但没有解决 TCP 层面的队头阻塞问题,由于 TCP 数据包中没有数据帧,为了可靠性需要需要等到全部的数据包响应完成)
- 头部压缩,多个请求相同时,会帮助消除重复的部分。
- 服务器推送(将浏览器需要的文件提前发送)
- 报文变为二进制的帧格式,增加了传输效率
HTTP3
- 基于 UDP 协议和 TLS 构建出 QUIC 协议,没有 TCP 的三次握手,解决了 TCP 队头阻塞的问题,QUIC 帧中就有数据帧,解决了 TCP 层面的队头阻塞的问题,实现多路复用
- 具体解决方式是使用:
流帧,QUIC 的流帧分别跟踪每个流的字节范围,当一个 QUIC 数据包丢失时,只有属于那个特定流的数据会被阻塞,其他流可以正常处理
# ipv4 和 ipv6
ipv4 使用 4 个字节,大小有限不够使用了,所以有了 ipv6,ipv6 使用 16 个字节