不是完整版也不是非常深入,属于是极简速成为了秋招没办法的版本,背完了考到就皆大欢喜,考到不会的就拉倒自认倒霉。
网络体系结构
TCP/IP 与 ISO/OSI 网络模型
OSI:应用 表示 会 传输 网络 数据 哩
TCP/IP网络模型
· 应用层
专注于为用户提供应用功能。
· 传输层
在传输层会有两个传输协议,分别是 TCP 和 UDP。
· 网络层
在各种各样的路径和节点进行选择。最常使用的是 IP 协议(Internet Protocol)
· 网络接口层
在 IP 头部的前面加上 MAC 头部,并封装成数据帧(Data frame)发送到网络上。
键入url网址到网页显示,期间发生了什么?
- 对
URL
进行解析,从而生成发送给Web
服务器的请求信息。 - 检查浏览器缓存里面是否缓存了该资源,有则返回,没有则准备发送网络请求。
- DNS解析,查询域名对应的 IP 地址。
- 浏览器与服务器建立TCP连接
- 消息封装TCP头部、IP头部和Mac头部,在交换机和路由器的转发下,抵达服务器
- 服务器接受请求信息,生成响应数据
- 浏览器解析返回数据
HTTP
HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。
HTTP 常见的状态码
1xx
类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。2xx
类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。3xx
类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。- 「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
- 「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
- 「304 Not Modified」表示自最近一次访问该页面以来,浏览器中存储(缓存)的资源没有被修改。
4xx
类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。- 「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。
- 「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
- 「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
5xx
类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。- 「500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
- 「501 Not Implemented」表示客户端请求的功能暂不支持,类似“即将开业,敬请期待”的意思。
- 「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
- 「503 Service Unavailable」表示服务器当前很忙,暂时无法响应客户端,类似“网络服务正忙,请稍后重试”的意思。
GET 与 POST
安全和幂等
- 「安全」是指请求方法**不会「破坏」**服务器上的资源。
- 「幂等」是多次执行相同的操作,**结果都是「相同」**的。
区别
-
作用
-
GET 的语义是从服务器获取指定的资源
-
POST 的语义是根据请求负荷(报文body)对指定的资源做出处理或提交数据
-
-
安全性
-
GET 方法就是安全且幂等的,因为它-是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。所以,可以对 GET 请求的数据做缓存,这个缓存可以做到浏览器本身上(彻底避免浏览器发请求),也可以做到代理上(如nginx),而且在浏览器中 GET 请求可以保存为书签。
-
POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的。所以,浏览器一般不会缓存 POST 请求,也不能把 POST 请求保存为书签。
-
-
参数
-
GET参数放在URL中,数据量较小
-
POST参数放在请求体中,不限制数据量
-
强制缓存与协商缓存
对于一些具有重复性的 HTTP 请求,把这对「请求-响应」的数据都缓存在本地。
· 强制缓存
强缓存指的是只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边。
过期判断的两个 HTTP 响应头部(Response Header)字段:
Cache-Control
, 是一个相对时间;Expires
,是一个绝对时间;
· 协商缓存
协商缓存就是与服务端协商之后,通过协商结果来判断是否使用本地缓存。
协商缓存可以基于两种头部来实现。
- 请求头部中的
If-Modified-Since
字段与响应头部中的Last-Modified
字段实现:
Last-Modified
:资源的最后修改时间;
If-Modified-Since
:服务器收到If-Modified-Since
则与被请求资源的最后修改时间进行对比(Last-Modified),资源又被改过,则返回最新资源,HTTP 200 OK;资源无新修改,响应 HTTP 304 走缓存。
- 请求头部中的
If-None-Match
字段与响应头部中的ETag
字段,这两个字段的意思是:
响应头部中 Etag
:唯一标识响应资源;
请求头部中的 If-None-Match
:比较第一次请求资源的Etag
与再次向服务器发起请求时资源的Etag
的值。服务器收到请求后进行比对,如果资源没有变化返回 304,如果资源变化了返回 200。
HTTP/1.0与HTTP/1.1
-
长连接
TCP长连接减少通信开销。
-
缓存
HTTP/1.0用
Last-Modified
字段实现; HTTP/1.1用ETag
字段实现 -
管道
管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间
-
状态码
新增了错误状态码。
HTTP/1.1与HTTP/2.0
-
二进制分帧
头信息和数据体都是二进制,并且统称为帧(frame):头信息帧(Headers Frame)和数据帧(Data Frame),改进传输性能
-
多路复用
针对不同的 HTTP 请求用独一无二的 Stream ID 来区分,可以支持多重请求-响应消息。
-
首部压缩
HPACK
算法:在客户端和服务器同时维护一张头信息表,用表中索引号代替头部字段 -
服务器推送
服务端可以主动向客户端推送的资源。
HTTPS
HTTP 与 HTTPS 有哪些区别?
- HTTP 简单无状态、明文传输;HTTPS 加入了 SSL/TLS 安全协议,使得报文能够加密传输,增加安全性。
- HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
- HTTP 默认端口号是 80,HTTPS 默认端口号是 443。
- HTTPS 协议需要向 CA(证书权威机构)申请数字证书。
公钥与私钥
- 公钥和私钥成对出现
- 公开的密钥叫公钥,只有自己知道的叫私钥
- 用公钥加密的数据只有对应的私钥可以解密;用私钥加密的数据只有对应的公钥可以解密
- 如果可以用公钥解密,则必然是对应的私钥加的密;如果可以用私钥解密,则必然是对应的公钥加的密
**“数字签名”**是用来验证发送方的身份并帮助保护数据的完整性。
例如:一个发送者 A 想要传些资料给大家,用自己的私钥对资料加密,即签名。这样一来,所有收到资料的人都可以用发送者的公钥进行验证,便可确认资料是由 A 发出来的了。(因为只有A使用私钥签名得到的信息,才能用这个公钥来解) 。
HTTPS工作原理
- 客户端生成随机数,向服务器发送请求报文,请求建立链接,
- 服务器生成一对公钥和私钥,并把公钥发送给CA,CA使用自己的私钥对服务器的公钥进行加密,产生一个数字证书,服务器将生成的数字证书发送给客户端,并再附加一个随机数
- 客户端取出服务端的数字证书,使用 CA 的公钥解密 数字证书,验证是否合法,合法则取出服务器的公钥
- 客户端使用公钥生成一个随机数发送给服务器、服务器使用私钥解密获得随机数,这三个随机数生成会话密钥
- 使用会话密钥进行通信
DNS
域名解析系统(Domain Name System),将域名和IP地址相互映射。
查询过程
- 用户输入url后,在浏览器本地缓存中查询域名是否有对应的IP地址
- 浏览器缓存中没有,则查看本地Host文件中是否有缓存对应的IP地址
- Host文件中没有,则向本地 DNS 服务器查询对应的IP地址
- 若本地 DNS 服务器没有,则向根域名服务器查询对应的IP地址
- 根域名服务器指路去哪一个DNS服务器查询
- 直到权威 DNS 服务器查询到以后将对应的 IP 地址返回本地DNS服务器
- 本地DNS服务器缓存下url对应的IP地址,并将结果返回浏览器
TCP与UDP
三次握手
三次握手流程
- 客户端向服务器发送SYN请求连接,客户端进入
SYN-SENT
状态 - 服务器收到SYN请求,回复ACK并同时发送一个SYN,服务器进入
SYN-RCVD
状态 - 客户端回复对于ACK报文的ACK,客户端进入
ESTABLISHED
状态 - 服务器收到ACK报文后,也进入
ESTABLISHED
状态
为什么要进行三次握手而不是四次、两次?
普通版:保证双方都具有接受和发送的能力
专业版:
两次:防止旧的重复连接初始化造成混乱。如果是两次连接,在第二次服务器回复ACK以后就会建立连接,但是这个回复有可能是历史连接的回复不是现有连接的回复,三次握手的时候发现服务器发送的是历史连接的回复就会发送RST报文终止连接,两次握手则无法避免这种情况。
两次:**避免资源浪费。**由于没有第三次握手,服务端不清楚客户端是否收到了自己回复的 ACK
报文,所以服务端每收到一个 SYN
就只能先主动建立一个连接,建立多个冗余的无效链接,造成不必要的资源浪费。
四次:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数
四次挥手
四次挥手流程
-
客户端向服务器发送FIN报文,客户端进入
FIN_WAIT_1
状态。 -
向客户端发送
ACK
应答报文,服务端进入CLOSE_WAIT
状态。 -
客户端收到服务端的
ACK
应答报文后,之后进入FIN_WAIT_2
状态。服务器处理数据……
-
服务器处理完数据后,向客户端发送FIN报文,服务器进入
LAST_ACK
状态。 -
客户端收到FIN报文后,向客户端发送
ACK
应答报文,进入TIME_WAIT
状态。 -
服务端收到了
ACK
应答报文后,就进入了CLOSE
状态。 -
客户端在经过 **
2MSL**
一段时间后,自动进入CLOSE
状态。
为什么 TIME_WAIT 等待的时间是 2MSL?
MSL
是 Maximum Segment Lifetime,报文最大生存时间。为了保证客户端最后一次ACK到达服务器,服务器顺利closed。因为如果最后一次ACK丢失了,服务器会重传一次FIN,如果少于2MSL的话,客户端收到重传的FIN会返回RST报文而不是ACK报文使服务器正常关闭。
为什么是四次挥手?
客户端发送FIN表示自己不再发送数据。
服务器收到FIN以后会把现有的数据处理完成才会发送 FIN
报文给客户端来表示同意现在关闭连接。
服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK
和 FIN
一般都会分开发送,因此是需要四次挥手。
TCP与UDP
面向连接否?连接形式是什么?连接以后开始传输、传输方式、传输效率、传输开销怎么样?可靠吗?
三个关键词:连接、传输、可靠
-
面向连接
-
TCP是面向连接的的协议
-
UDP不需要连接
-
-
连接方式
- TCP是点对点的协议
- UDP支持一对一、一对多、多对多的通信
-
传输形式
- TCP是面向字节流的
- UDP是面向报文的
-
传输效率
- TCP连接因为要经过三次握手,以及重传机制,效率比UDP低
-
首部开销
TCP首部开销至少20字节,UDP只有八个字节
-
可靠性
- TCP 是可靠交付数据的,有三次握手建立连接、有重传机制、拥塞控制、流量控制保证数据可以无差错、不丢失、不重复、按序到达。
- UDP 是不保证可靠交付数据。数据传输不需要任何确认,可能会丢包和乱序。可以基于 UDP 传输协议实现QUIC 协议,可靠的传输协议。
重传机制
针对数据包丢失的策略。
-
超时重传
发送一条数据以后,在一定的时间内没有收到对方的
ACK
确认应答报文,会默认该数据丢失而重新发送一份。 -
快速重传
当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。
-
SACK
可以将已收到的数据的信息发送给「发送方」,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。
-
D-SACK
使用了 SACK 来告诉「发送方」有哪些数据被重复接收了
滑动窗口
窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。
窗口的大小是由接收方的窗口大小来决定的。发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。
累计确认或者累计应答:发送方收到了 ACK 700 确认应答,就意味着 700 之前的所有数据「接收方」都收到了。
流量控制
通过调整滑动窗口大小来进行流量控制。
拥塞控制
拥塞控制,目的就是避免「发送方」的数据填满整个网络。
拥塞窗口 cwnd是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。
发送窗口 swnd 和接收窗口 rwnd 是约等于的关系,那么由于加入了拥塞窗口的概念后,此时发送窗口的值是
swnd = min(cwnd, rwnd),也就是拥塞窗口和接收窗口中的最小值。
拥塞的确认:发生了超时重传,就会认为网络出现了拥塞
四个算法:
· 慢启动与拥塞避免
有一个叫慢启动门限 ssthresh
(slow start threshold)状态变量。
- 当
cwnd
<ssthresh
时,使用慢启动算法。- 当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1
- 当
cwnd
>=ssthresh
时,就会使用「拥塞避免算法」。- 每当收到一个 ACK 时,cwnd 增加 1/cwnd
· 拥塞发生
-
发生超时重传的拥塞发生算法
-
ssthresh
设为cwnd/2
, -
cwnd
重置为1
(是恢复为 cwnd 初始化值,我这里假定 cwnd 初始化值 1)
-
-
发生快速重传的拥塞发生算法
cwnd = cwnd/2
,也就是设置为原来的一半;ssthresh = cwnd
- 进入快速恢复算法
· 快速恢复
- 拥塞窗口
cwnd = ssthresh + 3
( 3 的意思是确认有 3 个数据包被收到了); - 重传丢失的数据包;
- 如果再收到重复的 ACK,那么 cwnd 增加 1;
- 如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态;
IP
IP 地址的分类
IP 地址分类成了 5 种类型,分别是 A 类、B 类、C 类、D 类、E 类。
- 主机号全为 1 指定某个网络下的所有主机,用于广播
- 主机号全为 0 指定某个网络
D 类和 E 类地址是没有主机号的,所以不可用于主机 IP,D 类常被用于多播,E 类是预留的分类,暂时未使用。
IP 分类的缺点
缺少地址的灵活性、不能很好的与现实网络匹配
IPv4 与 IPv6
IPv4 地址长度共 32 位,是以每 8 位作为一组,并用点分十进制的表示方式。
IPv6 地址长度是 128 位,是以每 16 位作为一组,每组用冒号 「:」 隔开。
IPv6 相比 IPv4 的首部改进:
- 取消了首部校验和字段。 因为在数据链路层和传输层都会校验,因此 IPv6 直接取消了 IP 的校验。
- 取消了分片/重新组装相关字段。 分片与重组是耗时的过程,IPv6 不允许在中间路由器进行分片与重组,这种操作只能在源与目标主机,这将大大提高了路由器转发的速度。
- 取消选项字段。 选项字段不再是标准 IP 首部的一部分了,但它并没有消失,而是可能出现在 IPv6 首部中的「下一个首部」指出的位置上。删除该选项字段使的 IPv6 的首部成为固定长度的
40
字节。
无分类地址 CIDR
表示形式 a.b.c.d/x
,其中 /x
表示前 x 位属于网络号,剩余的是主机号。
子网掩码及子网划分
将子网掩码和 IP 地址按位计算 AND,就可得到网络号。
- 未做子网划分的 ip 地址:网络地址+主机地址
- 做子网划分后的 ip 地址:网络地址+(子网网络地址+子网主机地址)
IP 地址与路由控制
路由控制表中记录着网络地址与下一步应该发送至路由器的地址。在主机和路由器上都会有各自的路由器控制表。
在发送 IP 包时,首先要确定 IP 包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配。
计算机网络相关协议
应用层
HTTP(超文本传输协议)
HTTPS(安全套接层超文本传输协议):HTTP的安全版本
FTP(文件传输协议):用于在网络上传输文件,使用户可以上传或下载文件到远程服务器。
SMTP与POP3:用于电子邮件的发送
DNS:将域名转换为IP地址的协议
Telnet:用于在网络上远程登录到其他计算机
SSH(安全外壳协议):用于安全远程登录到服务器或网络设备,以加密数据传输和身份验证。
SNMP(简单网络管理协议):用于网络设备之间的监控和管理,例如路由器、交换机等。
传输层
TCP/UDP
网络层
IP
ARP/RARP:从IP地址定位MAC地址的一种协议;从MAC地址定位IP地址的一种协议
DHCP:动态获取 IP 地址
NAT:网络地址转换 NAT 的方法,缓解了 IPv4 地址耗尽的问题
ICMP:互联网控制报文协议,确认 IP 包是否成功送达目标地址,或者报错原因
ICGP:因特网组管理协议,管理组播的
数据链路层
PPP:一种点到点(一根链路两端只有两个接口)链路层协议
物理层:IEEE802