概念
计算机网络是由自治系统互联起来的集合体。
计算机网络的资源包括硬件、软件和数据
ARPAnet是最早的计算机网络,他是因特网(Internet)的前身
时延计算:总时延=发送时延+传播时延+排队时延+处理时延
协议是对等层实体之间进行逻辑通信而定义的规则的集合
TCP/IP参考模型的网络层提供的是无连接的不可靠的数据报服务
计算机网络体系
OIS 参考模型
- 应用层(FTP、SMTP、HTTP):提供用户与网络界面
- 表示层:数据解密与加密、压缩、格式转换等
- 会话层:管理不同主机进程的对话,会话管理和同步,使用校验点可使通信失败时从校验点回复,实现数据同步
- 传输层(TCP、UDP):传输单位是报文;提供端到端的可靠传输服务,为端到端提供流量控制、差错控制、服务质量、数据传输管理等服务
- 网络层(IP、IPX、ICMP、IGMP、ARP、RARP、OSPF):传输单位是分组;传输单位是数据报;对分组进行路由选择,并实现流量控制、拥塞控制、差错控制、网际互连等
- 数据链路层(SDLC、HDLC、PPP、STP):传输单位是帧;链路的建立、拆除、分离;帧定界和帧同步;差错检测
物理层:传输单位是比特;以0、1比特流的形式透明传输数据链路层递交的帧
TCP/IP 模型
应用层
- 传输层
- 网际层:无连接不可靠的数据报服务
-
网络设备
中继器:物理层
- 集线器:多端口的中继器,工作在物理层
- 网桥:数据链路层;可以隔离信息,将网络划分为多个网段,隔离出安全网段,防止其他网段的用户非法访问
- 透明网桥(选择的不是最佳路由)
- 源路由网桥(选择的是最佳路由)
- 交换机:多端口的网桥;工作在数据链路层;更够隔离冲突域,VLAN可以隔离广播域,非VLAN不能隔离广播域;独占带宽
- 路由器:工作在物理层、数据链路层、网络层,可以隔离广播域、冲突域
物理层
考虑的是怎样在传输媒体上传输数据比特流,而不是指具体的传输媒体。物理层的作用是尽可能屏蔽传输媒体和通信手段的差异,使数据链路层感觉不到这些差异。
数据链路层
主机之间可以有很多链路,链路层协议就是为同一链路的主机提供数据传输服务;把网络层传下来的分组封装成帧。
CSMA/CD 协议
CSMA/CD 表示载波监听多点接入 / 碰撞检测。
多点接入 :说明这是总线型网络,许多主机以多点的方式连接到总线上。
载波监听 :每个主机都必须不停地监听信道。在发送前,如果监听到信道正在使用,就必须等待。
碰撞检测 :在发送中,如果监听到信道已有其它主机正在发送数据,就表示发生了碰撞。虽然每个主机在发送数据之前都已经监听到信道为空闲,但是由于电磁波的传播时延的存在,还是有可能会发生碰撞。
记端到端的传播时延为 τ,最先发送的站点最多经过 2τ 就可以知道是否发生了碰撞,称 2τ 为 争用期 。只有经过争用期之后还没有检测到碰撞,才能肯定这次发送不会发生碰撞。
当发生碰撞时,站点要停止发送,等待一段时间再发送。这个时间采用 截断二进制指数退避算法 来确定。从离散的整数集合 {0, 1, .., (2^k-1)}0,1,..,(2
k−1) 中随机取出一个数,记作 r,然后取 r 倍的争用期作为重传等待时间。
网络层
IP地址分类
- A类:1~126;8位网络号
- B类:128~191;16位网络号
- C类:192~223;24位网络号
- D类:224~239;多播地址
-
特殊IP地址
私有IP地址
A类:10.0.0.0~10.255.255.255;网段1个
- B类:172.16.0.0~173.31.255.255;网段16个
C类:192.168.0.0~192.168.255.255;网段256个
路由协议
域间路由协议
- BGP:路径向量协议;仅力求找到一条能够到达目的地的网络较好的路由,并非最佳路由;交换的路由信息是到达某个目的网络所要经过的各个自治系统序列;用TCP传输数据
域内路由协议
在同一网段,网络地址(子网掩码和IP地址相与)要相同
-
路由选择与转发
给出路由表,问路由表收到某分组后,应该从哪个接口转发?
先看是否有符合条件的目的网络
- 如果有多个符合条件的,则采用最长前缀匹配原则
- 如果没有符合条件的,则走默认路由
- 如果没有默认路由,则丢弃
网络层
向上只提供简单灵活的、无连接的、尽最大努力交互的数据报服务
IP数据报格式
- 版本 : 有 4(IPv4)和 6(IPv6)两个值;
- 首部长度 : 占 4 位,因此最大值为 15。值为 1 表示的是 1 个 32 位字的长度,也就是 4 字节。因为固定部分长度为 20 字节,因此该值最小为 5。如果可选字段的长度不是 4 字节的整数倍,就用尾部的填充部分来填充。
- 区分服务 : 用来获得更好的服务,一般情况下不使用。
- 总长度 : 包括首部长度和数据部分长度。
- 生存时间 :TTL,它的存在是为了防止无法交付的数据报在互联网中不断兜圈子。以路由器跳数为单位,当 TTL 为 0 时就丢弃数据报。
- 协议 :指出携带的数据应该上交给哪个协议进行处理,例如 ICMP、TCP、UDP 等。
- 首部检验和 :因为数据报每经过一个路由器,都要重新计算检验和,因此检验和不包含数据部分可以减少计算的工作量。
- 标识 : 在数据报长度过长从而发生分片的情况下,相同数据报的不同分片具有相同的标识符。
- 片偏移 : 和标识符一起,用于发生分片的情况。片偏移的单位为 8 字节。
IP地址编制方式
IP 地址的编址方式经历了三个历史阶段:
- 分类
- 子网划分
- 无分类
1. 分类
由两部分组成,网络号和主机号,其中不同分类具有不同的网络号长度,并且是固定的。
IP 地址 ::= {< 网络号 >, < 主机号 >}
2. 子网划分
通过在主机号字段中拿一部分作为子网号,把两级 IP 地址划分为三级 IP 地址。
IP 地址 ::= {< 网络号 >, < 子网号 >, < 主机号 >}
要使用子网,必须配置子网掩码。一个 B 类地址的默认子网掩码为 255.255.0.0,如果 B 类地址的子网占两个比特,那么子网掩码为 11111111 11111111 11000000 00000000,也就是 255.255.192.0。
3. 无分类
无分类编址 CIDR 消除了传统 A 类、B 类和 C 类地址以及划分子网的概念,使用网络前缀和主机号来对 IP 地址进行编码,网络前缀的长度可以根据需要变化。
IP 地址 ::= {< 网络前缀号 >, < 主机号 >}
CIDR 的记法上采用在 IP 地址后面加上网络前缀长度的方法,例如 128.14.35.7/20 表示前 20 位为网络前缀。
CIDR 的地址掩码可以继续称为子网掩码,子网掩码首 1 长度为网络前缀的长度。
一个 CIDR 地址块中有很多地址,一个 CIDR 表示的网络就可以表示原来的很多个网络,并且在路由表中只需要一个路由就可以代替原来的多个路由,减少了路由表项的数量。把这种通过使用网络前缀来减少路由表项的方式称为路由聚合,也称为 构成超网 。
在路由表中的项目由“网络前缀”和“下一跳地址”组成,在查找时可能会得到不止一个匹配结果,应当采用最长前缀匹配来确定应该匹配哪一个。
路由器分组转发流程
从数据报的首部提取目的主机的 IP 地址 D,得到目的网络地址 N。
- 若 N 就是与此路由器直接相连的某个网络地址,则进行直接交付;
- 若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给表中所指明的下一跳路由器;
- 若路由表中有到达网络 N 的路由,则把数据报传送给路由表中所指明的下一跳路由器;
- 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;
-
路由选择协议
路由选择协议都是自适应的,能随着网络通信量和拓扑结构的变化而自适应地进行调整。
互联网可以划分为许多较小的自治系统 AS,一个 AS 可以使用一种和别的 AS 不同的路由选择协议。
可以把路由选择协议划分为两大类: 自治系统内部的路由选择:RIP 和 OSPF
- 自治系统间的路由选择:BGP
内部网关协议 RIP
RIP 是一种基于距离向量的路由选择协议。距离是指跳数,直接相连的路由器跳数为 1。跳数最多为 15,超过 15 表示不可达。
RIP 按固定的时间间隔仅和相邻路由器交换自己的路由表,经过若干次交换之后,所有路由器最终会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器地址。
距离向量算法:
- 对地址为 X 的相邻路由器发来的 RIP 报文,先修改报文中的所有项目,把下一跳字段中的地址改为 X,并把所有的距离字段加 1;
- 对修改后的 RIP 报文中的每一个项目,进行以下步骤:
- 若原来的路由表中没有目的网络 N,则把该项目添加到路由表中;
- 否则:若下一跳路由器地址是 X,则把收到的项目替换原来路由表中的项目;否则:若收到的项目中的距离 d 小于路由表中的距离,则进行更新(例如原始路由表项为 Net2, 5, P,新表项为 Net2, 4, X,则更新);否则什么也不做。
- 若 3 分钟还没有收到相邻路由器的更新路由表,则把该相邻路由器标为不可达,即把距离置为 16。
RIP 协议实现简单,开销小。但是 RIP 能使用的最大距离为 15,限制了网络的规模。并且当网络出现故障时,要经过比较长的时间才能将此消息传送到所有路由器。
内部网关协议 OSPF
开放最短路径优先 OSPF,是为了克服 RIP 的缺点而开发出来的。
开放表示 OSPF 不受某一家厂商控制,而是公开发表的;最短路径优先表示使用了 Dijkstra 提出的最短路径算法 SPF。
OSPF 具有以下特点:
- 向本自治系统中的所有路由器发送信息,这种方法是洪泛法。
- 发送的信息就是与相邻路由器的链路状态,链路状态包括与哪些路由器相连以及链路的度量,度量用费用、距离、时延、带宽等来表示。
- 只有当链路状态发生变化时,路由器才会发送信息。
所有路由器都具有全网的拓扑结构图,并且是一致的。相比于 RIP,OSPF 的更新过程收敛的很快。
外部网关协议 BGP(Border Gateway Protocol,边界网关协议)
AS 之间的路由选择很困难,主要是由于:
- 互联网规模很大;
- 各个 AS 内部使用不同的路由选择协议,无法准确定义路径的度量;
- AS 之间的路由选择必须考虑有关的策略,比如有些 AS 不愿意让其它 AS 经过。
BGP 只能寻找一条比较好的路由,而不是最佳路由。
每个 AS 都必须配置 BGP 发言人,通过在两个相邻 BGP 发言人之间建立 TCP 连接来交换路由信息。
传输层
为进程提供通用数据传输服务
常用端口号
- TELNET:23
- SMTP:25
- HTTP:80
- FTP:21
-
首部长度
MAC帧头长度:14B
- 目的地址:6B
- 源地址:6B
- 类型地址:2B
- 数据部分长度(IP数据报长度):46B~1500B
- IP报文首部长度:20B
- 协议帧长
- TCP报文首部长度:20B
- UDP报文首部长度:8B
- 应用层数据长度
- MAC帧尾长度(FCS):4B
TCP
字段含义
- 确认位 ACK:ACK=1时确认自动才有效
- 同步位 SYN:连接请求或连接接受报文
- SYN=1,ACK=0 是一个连接请求报文
- SYN=1,ACK=1 是一个连接同意报文
- 终止位 FIN:FIN=1时此报文的发送数据已经发送完毕,并要求释放连接
- ack:期望接受的对方下一个报文的第一个自己的序号
-
连接的建立
连接的释放
报文段
TCP采取的是对报文段的确认机制
协议字段:IP首部字段,指明上层协议是TCP还是UDP,17代表UDP,6代表TCP。
-
拥塞控制
拥塞窗口:cwnd
- 接收窗口:rwnd
- 慢开始门限:ssthresh
- 一个最大报文长度:MSS
发送方发送窗口的实际大小由流量控制和拥塞控制共同决定。当同时出现接收窗口(rwnd)和拥塞窗口(cwnd)时,发送方窗口大小是由rwnd和cwnd中较小的那个确定。
网络拥塞的处理
快重传
在接收到三个重复的ACK时,直接重传对方尚未接收的报文段,无需等待重传计时器超时
快恢复
GBN TCP SR 协议确认机制的区别
- GBN和TCP都采用累积确认机制,SR协议不是
- 关于ACK序号的问题:
FTP
在服务器端,控制连接使用TCP的21号端口,数据连接使用TCP的20号端口
电子邮件
- SMTP(简单数据邮件协议):TCP连接;25端口;
- POP3(邮局协议):TCP连接;110端口;明文传输,并不对密码进行加密;基于ACSII码,传输非ACSII码数据要转为ACSII码。
熟知端口号
复杂的网络过程
DNS
每台主机都必须在授权域名服务器处注册登记,授权域名服务器一定能够将其管辖的主机名转换为IP地址
DNS传输采用无连接的UDP服务
DNS查找过程
- 浏览器域名缓存->
- 系统域名缓存->
- 域名服务器解析(本地DNS域名服务器->权威域名服务器->顶级域名服务器->根域名服务器)
域名解析的两种方式
- 递归查询:如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户端的身份,向其他根域名服务器继续发出查询请求报文,即替主机继续查询,而不是让主机自己进行下一步查询,如上图步骤(1)和(10)。
迭代查询:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地服务器下一步应该找哪个域名服务器进行查询,然后让本地服务器进行后续的查询,如上图步骤(2)~(9)。
缓存
浏览器缓存
浏览器缓存:
cookie
- Local Storage
- Session Storage
- Service Worker
浏览器判断缓存是否过期方法:
- 强缓存
- Expires:客户端请求的时间在Expires之前会直接触发缓存,不需要发送请求
- Cache-Control:优先级大于Expires
- public
- private
- max-age
- 协商缓存
HTTP
HTTP请求
- 请求行
- 消息报头
-
HTT响应
状态行
- 消息报文
-
请求方法
get 请求指定页面信息,并返回主体
- head 不返回具体内容,只获取报头
- post 创建新的资源
- put 取代原有资源
- patch 局部修改资源
- deldete 删除原有资源
- connect
- options 允许客户端查看性能
- trace 回显服务器收到的请求,主要用于测试
状态码
| 分类 | 分类描述 | | —- | —- | | 1 | 信息,服务器收到请求,需要请求者继续执行操作 | | 2 | 成功,操作被成功接收并处理 | | 3 | 重定向,需要进一步的操作以完成请求 | | 4 | 客户端错误,请求包含语法错误或无法完成请求 | | 5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
HTTPS
具体过程是,客户端向一个需要https访问的网站发起请求;服务器将证书发送给客户端进行校验。证书里面包含了其公钥,校验对方发过来的数字证书是否有效;校验成功之后,客户端会生成一个随机串然后使用服务器证书的公钥进行加密之后发送给服务器;服务器通过使用自己的私钥解密得到这个随机值;服务器从此开始使用这个随机值进行对称加密开始和客户端进行通信;客户端拿到值用对称加密方式使用随机值进行解密。
/**
* 在node.js server 配置私钥和公钥
**/
const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8000);
HTTP2
- HTTP/1:每次请求都建立一个TCP连接
- HTTP/1.1:支持长连接,同一个IP对应一个TCP连接
- HTTP/2:TCP多路复用,同一个TCP并发 多个HTTP请求
HTTP3(QUIC)
多路复用
而QUIC是基于UDP的,在传输层层面并没有固定的连接,可以根据需要开辟任意逻辑链路。QUIC一次建立一个Connection,一个Connection下包含多个Stream流(每个stream独自维护一个逻辑连接,因为UDP层面上是无连接的),每个流对应一个文件传输,并将不同的Stream中的数据交付给不同的上层应用。QUIC的一个Connection对应多个Stream,Stream之间相互独立,因此任意一条链路断开都不会导致其他数据阻塞。
参考
【1】计算机面试突击
【2】从输入网址到内容返回解析|前端工程师需要掌握这些知识
【3】校招基础知识详解
【4】QUIC——快速UDP网络连接协议