网络基本概念
协议 主机 端口 路径
参数:某些资源可以根据需求呈现不同的内容,这些额外的信息可以通过参数传递
hash:在网络通信中,hash没有什么用,往往作为浏览器的锚链接出现
http
通过url地址,准确的找到自己想要的服务。
需要通过协议来对话,而互联网中最常见的协议就是http协议
https是在http协议基础上发展起来的,它增加了安全性,其他和http协议完全一样
http是基于 请求 - 响应 的方式完成通信的,每一次通信都是由客户端向服务端发出请求,传递一些消息过去,经过服务器程序处理,响应给客户端一些消息
http协议规定:
markdown
1. 每次 请求 - 响应 都是独立的,相互之间互不干扰,这种模式的协议称为无状态协议
1. 每次 请求 - 响应 传递的消息都是纯文本(字符串),而且文本格式必须按照http协议规定的格式书写
请求的消息格式
请求消息格式有三部分组成
- 请求行:概括了客户端想干什么
- 请求头:描述了请求的一些额外信息
- 请求体:包含了要给服务器传递的正文数据,可以省略的
响应的消息格式
- 相应行
- 响应头
- 响应体
浏览器页面处理流程
- 浏览器自动补全协议、端口
- 浏览器自动完成url编码
- 浏览器根据url地址查找本地缓存,根据缓存规则看是否命中缓存,若有缓存直接使用缓存,不再发出请求
- 如果没有缓存,就通过DNS服务器解析找到服务器的ip地址
- 浏览器向服务器发出建立TCP连接的申请,完成三次握手后,连接通道建立
- 若使用https协议,则会进行SSL握手,建立加密信道,使用SSL握手时,会确定是否使用http2
- 浏览器决定要附带哪些cookie到请求头中
- 浏览器自动设置好请求头、协议版本、cookie、发出GET请求
- 服务器处理请求,进入后端处理流程。完成处理后,服务器响应一个HTTP报文给浏览器
- 浏览器根据使用的协议版本,以及Connection字段的约定,决定是否要保留TCP连接
- 浏览器根据响应状态码决定如何处理这一次响应
- 浏览器根据响应头中的Content-type字段识别响应类型,如果是text/html,则对响应体的内容进行HTML解析,否则做其他处理
- 浏览器根据响应头的其他内容完成缓存、cookie的设置
- 浏览器开始从上到下解析HTML,若遇到外部资源链接,则进一步请求资源
- 解析过程中生成DOM树,CSSOM树,然后一边生成,一边把二者合并为渲染树(rendering tree),随后对渲染树中的每个节点计算位置和大小(feflow),最后把每个节点利用GPU绘制到屏幕(repaint)
- 在解析过程中还会触发一系列的事件,当DOM树完成后会触发DOMContentLoaded事件,当所有资源加载完成后会触发load事件
五层网路模型
跟具体应用相关的消息格式 应用层 HTTP、FTP、DNS、SMTP
如何保证消息的可靠转递 传输层 TCP、UDP
如何在互联网中找到对方 网络层 IP、路由器
如何在一个子网中找到对方 数据链路层 MAC 、交换机
上面给我的信息如何用信号表示 物理层 光纤,双绞线
从上到下分别为:应用层、传输层、网络层、数据链路层、物理层。在发送消息时,消息从上到下进行打包,每一层会在上一层基础上加包,而接受消息时,从下到上进行解包,最终得到原始信息
cookit和session的区别是?
- cookie 的数据保存在浏览器 session 数据保存在服务器
- cookie 存储空间有限 session 存储空间不限
- cookie 只能保存字符串 session 可以保存任何数据类型
- cookie 数据容易被获取 session 数据难以获取
如何消除 session
-
设置过期时间
当客户端长时间没有传递 sessionid 时,服务器可以在过期时间之后清除session
-
客户端主动通知
可以使用js监听客户端页面关闭或退出操作,再通知服务器清除session
http缓存协议
缓存大的基本原理
HTTP和TCP的关系:
- 客户端发送消息给服务器叫请求,服务器发送消息给客户端叫响应
- 使用HTTP协议的服务器不会主动发送消息给客户端(尽管TCP可以),只对请求进行响应
- 每一个HTTP请求-响应,都要先建立TCP连接(三次握手),然后完成 请求-响应 后,再销毁连接(四次挥手),就导致每次 请求- 响应 都是独立的,无法保持状态
三次握手与四次挥手
TCP协议通过三次握手建立可靠的点对点连接,具体过程:
首先服务器进入监听状态,然后即可处理连接
第一次握手:建立连接时,客户端发送 syn 包到服务器,并进入SYN_SENT 状态,等待服务器确定。在发送的包中还会包含一个初始序列号 seq。此次握手的含义是客户端希望与服务器建立连接
第二次握手:服务器收到 syn 包,然后回应给客户端一个 SYN+ACK 包,此时服务器进入 SYN_RCVD 状态。此次握手的含义是服务端回应客户端,表示已收到并同意客户端的连接请求。
第三次握手:客户端收到服务器的 SYN 包后,向服务器再次发送 ACK 包,并进入 ESTAB_LISHED 状态
最后,服务器收到客户端的 ACK 包,于是也进入 ESTAB_LISHED 状态,至此,连接建立完成。
当需要关闭连接时,需要进行四次挥手才能关闭:
- Client向 server 发送 FIN 包,表示 Client 主动要关闭来连接,然后进入 FIN_WAIT_1状态,等待 server 返回 ACK 包。此后 Client 不能再向 Server 发送数据,但能读取数据
- Server 收到 FIN 包后向 Client 发送 ACK 包,然后进入 CLOSE_WAIT 状态,此后 Server 不能再读取数据,但可以继续向 Client 发送数据。
- Client 收到 Server 返回的ACK 包后进入 FIN_WAIT_2 状态,等待 Server 发送 FIN包
- Server 完成数据的发送后,将 FIN 包发送给 Client,然后进入 LAST_ACK 状态,等待 Client 返回 ACK包,此后 Server 既不能读取数据,也不能发送数据
- Client 收到 FIN 包后向 Server 发送 ACK 包,然后进入 TIME_WAIT状态,接着等待足够长的时间以确保 Server 接收到 ACK包,最后回到 CLOSED 状态,释放网络资源
- Server 收到 Client 返回的 ACK 包后便回到 CLOSED状态,释放网络资源
CSRF攻击 (跨站请求伪造)
一种挟制用户在当前已登录的eb应用上执行非本意的操作攻击方法
首先引导用户访问一个危险网站,当用户访问网站后,网站会发送请求到被攻击的站点,这次请求会携带用户的cookie发送,因此就利用可用户身份信息完成攻击
防御手段:
- 不使用cookie
- 为表单添加校验的token校验
- cookie中使用sameSite字段
- 服务器检查referer字段
XSS攻击 (跨站脚本攻击)表单输入恶意攻击代码
防御:服务器端对用户提交的内容进行过滤 (去掉一些危险的标签,去掉一些危险的属性)或编码(对危险的标签进行HTML实体编码)
网络性能优化
-
优化打包体积
利用一些工具压缩最终打包代码,减少包体积
-
多目标打包
-
压缩
-
CDN
-
缓存
-
HTTP2
利用多路复用、头部压缩
-
雪碧图
-
defer、async
-
prefetch、preload
-
多个静态资源域
域名
帮助人类记忆网站地址
域名类型的几种:
- 根域名
- 顶级域名
- 一级域名
- 二级域名
- 三级域名
简述域名解析过程:
- 查找本机hosts文件是否有解析记录,有直接使用
- 查找本地域名服务器中是否有解析记录,有直接使用
- 查询根域名服务器,得到顶级域名服务器ip
- 查询顶级服务器中是否有解析记录,有直接使用
- 根据顶级域名服务器ip,查村权限域名服务器,有解析记录,直接使用
- 都找不到,域名解析失败
本机和域名服务器一般会有高速缓存,存在的目的是为了减少查询次数和时间
HTTP不同版本
TCP协议的特点:慢启动,即开始传输的数据量少,一段时间之后达到传输的峰值
HTTP 0.9 1991年
只支持简单的请求 - 响应模式,不支持复杂的HTTP头部和消息体
HTTP 1.0 1996年
HTTP头部、消息体和请求方法,及持久连接 (每个连接只能处理一个请求)
无法复用连接 - 每个请求都是独立的连接
对头阻塞
HTTP 1.1 1997年
长连接:让同一个tcp连接服务于多个 请求 - 响应 (默认开启长连接 Connection: keep-alive
连接关闭的情况三种
客户端在某一次请求中设置了Connection:close ,服务器收到此请求后,响应结束立即关闭TCP
在没有请求时,客户端会不断对服务器进行心跳检测,一旦心跳检测停止,服务器立即关闭TCP
当客户端长时间没有新的请求到达服务器,服务器会主动关闭tcp,可设置时间
管道化和对头阻塞
减少文件数量
通过开辟多个tcp连接 (对于同一个域名的连接最多6个,要突破这个限制,就需要把资源放到不同的域中
管道化会带来对头阻塞造成非常多的问题,现代浏览器默认关闭这种模式
HTTP 2 2015年
二进制分帧 (多路复用)
可以允许更小的单元传输数据,每个传输单元称之为帧,而每一个请求 或响应的完整数据称为流,每个流有自己的编号,每个帧会记录所属的流
头部压缩 (静态表)
大部分头部信息都有很多重复
服务器推
允许在客户端没有主动请求的情况下,服务器预先把资源推送给客户端
HTTP 3 2022年
完全抛弃了TCP协议,转而使用UDP协议
为了保证传输的可靠性,使用了 QUIC 协议