前言
计算机网络知识本身是庞大而高深,近期整理了一些必备的计算机网络知识,也算是自己的计算机知识体系,分享给大家一起来学习。如有问题,欢迎指正。
1. HTTP协议的理解
HTTP超文本传输协议: 是一种基于TCP/IP应用层的通信协议,规定了浏览器和服务器之间互相通信的规则。客户端浏览器发出请求,发送数据,请求报文,服务器返回数据,响应报文。
特点:
- 简单快速:客户端只传送请求方式和路径,然后通过浏览器或其他方式将该请求进行发送即可。
- 灵活:允许客户端和浏览器传输任意类型数据对象。
- 无连接:每次只处理一个请求,收到客户应答后,断开连接。
- 无状态:任意请求之间没有依赖关系。
HTTP历史:
2. HTTP1.0和HTTP1.1区别
(1)长连接
TCP连接不可复用,每进行一次HTTP通信,都需要三步走——TCP连接、HTTP通信、断开TCP连接,这就是短连接。
当多次请求就要多次消耗TCP连接资源,当通信频率比较高时,CPU和内存的使用就会比较高。
HTTP1.1实现的优化就是一个TCP连接可以进行多次HTTP通信机制,实现长连接。
(2)管线化
管线化主要是解决队头阻塞问题(请求与请求间是串行的,只有当A请求响应回来,B请求才能发送。
在HTTP1.1中,允许将多个 HTTP 请求批量地提交给服务器。但是仍然没有解决串行相应问题。
3. 对Keep-Alive的理解
长连接使用就是keep-Alive模式,keep-Alive功能是客户端到服务器端连接持续有效,当出现对服务器后继请求时,避免了建立或者重新建立连接。
开启Keep-Alive优点:
- 较少的CPU和内存使用(由于同时打开的连接减少了)
- 允许请求和应答HTTP管线化
- 降低阻塞控制(TCP连接减少了)
- 减少了后续请求和延迟(无需再进行握手)
- 报告错误无需关闭TCP连接
开启Keep-Alive缺点:
- 长时间的TCP连接容易导致系统资源无效占用,浪费系统资源。
4. HTTP1.1和HTTP2.0的区别
(1)二进制分帧
1版本中,数据是以文本格式进行传输,解析起来效率低。 2版本中,将消息划分为更小的消息和帧,然后在采取二进制格式编码,更加高效解析。
(2)头部压缩
2版本中,客户端和服务器分别会维护一份相同的静态字典,字典存储头部名称和值,同时还会同时维护一份相同的动态字典,动态字典可以实时更新。
这样以来,第一次通信后,后面的请求只需要发送前面请求头部不同的地方,其他的头部信息可以从字典中获取,节省网络开销。
(3)服务端推送
1版本中,当请求A资源发现需要资源B,需要在消耗一个请求去请求B。
2版本中,允许服务器主动向客户端push资源,当服务器发现客户端请求A资源时,却忘了请求A资源依赖的B资源时,会主动将B资源推送给客户端。
(4)多路复用
解决队头阻塞问题,一次连接建立后,只要这个连接还在,那么客户端就可以在一个连接中批量发起多个请求。同时请求与请求间不阻塞。
5. HTTP3.0聊一聊
基于UDP 封装一层QUIC 协议进行实现,集成TLS加密功能,快速握手,多路复用,彻底解决了TCP阻塞问题。
6. HTTP和HTTPS的区别
- HTTP信息是明文传输,HTTPS则是具有安全性的SSL/TLS加密传输。
- HTTPS协议需要申请CA证书,免费的证书比较少,因此需要一定的费用。
- HTTP端口是80,HTTPS端口是443。
- HTTPS相比HTTP握手阶段比较费时,会使页面加载时间延长50%。
- HTTPS缓存不如HTTP高效,会增加数据开销。
7. SSL/TLS的理解
HTTPS经由HTTP进行通信,利用SSL/TLS来加密数据包,相比于HTTP更加安全。
TLS/SSL全称安全传输层协议(Transport Layer Security),是介于TCP和HTTP之间的一层安全协议,不影响原有的TCP协议和HTTP协议,所以使用HTTP基本上不需要对HTTP页面进行太多改造。
主要职责:对发起的HTTP请求数据进行加密操作和对接收HTTP内容进行解密操作。
8. 对称加密和非对称加密
对称加密:一个key负责加密和解密
非对称加密:一对kye,A加密之后,只能用B来解密
9. HTTPS 协议解析流程
客户端在使用 HTTPS 方式与 Web 服务器通信时主要包括三个步骤:证书验证、非对称加密、对称加密。
- 证书验证:
1、客户端请求网址
2、服务端在第三方机构申请证书,证书包含(key/pubKey),传递给客户端
- 非对称加密:
3、客户端验证证书合法性 ,取出公钥生成随机数并且加密,传递服务端
4、服务端用私钥随机数进项解密
- 对称加密:
5、客户端,服务器端都有了随机数,以后的对话过程都使用这个秘钥来加密信息,对称加密进行传输。
10. HTTPS一定安全吗
Https不是绝对的安全,是现在构架下最流行的解决方案,它大幅增加了中间人攻击的成本。 网络安全防御的目的是提高攻击成本,并不能做到滴水不漏。就算你的网站主动防御武装到牙齿,外部因素都会影响到你网站的安全,只是实施攻击需要更高的成本,如果收益不远超成本,攻击者一般不会实施。
可能存在的隐患:
- 在某些国家可以控制CA 根证书的情况下,中间人攻击一样可行。中间人攻击常发生在公共WIFE或路由上。
- 证书有问题,但用户继续访问或设置授信,也会发生“中间人”攻击可能性。
- 在本地随机数( 秘钥) 安全方面,HTTPS也无能为力,只能借助杀毒软件、漏洞升级等来防护。
- 同时,在黑客攻击、拒绝服务攻击、服务器劫持等方面,HTTPS几乎起不到作用。
11. HTTP常见请求头
Resquest Headers
- Accept 浏览器可接受的数据格式
- Accept-Encoding 浏览器可接受的压缩算法 ,如gzip
- Accept-Language 浏览器可接受的语言,如zh-CN
- Connection:keep-alive 一次TCP连接重复使用
- Cookies 每次请求都会带着
- Host 请求的域名
- User-Agent (UA) 浏览器信息
- Content-type 发送数据的格式,如application/json
Response Headers
- Content-type 返回数据的格式,如:application/json
- Content-length 返回数据的大小,多少字节
- Content-Encoding 返回数据的压缩算法,如gzip
- set-Cookies
12. 缓存相关的请求头
Resquest Headers
- If-Modified-Since
- If-None-Match
Response Headers
- Last-Modified
- Etag
13. HTTP状态码
由三个数字组成,第一个数字定义了响应类别。
1:临时响应 2:成功响应 3:跳转响应 4:客户端错误 5:服务器错误
- 200:请求成功,客户端的请求已被服务器处理完毕
- 301:重定向,永久性跳转,表示请求的资源已被分配新的URL
- 302:重定向,临时性跳转,表示请求的资源临时被分配新的URL
- 304:请求的资源未被修改,浏览器将会读取缓存。
- 403:请求的页面被禁止访问。
- 404:请求的资源没有找到。
- 500:请求资源找到了,但服务器内部出现了错误。
- 500 内部错误、502 网关错误、504 网关超时
14. 产生304状态码的原因及影响
状态码304不认为是一种错误,而是客户端有缓存情况下服务端的一种响应。
原因:页面长时间不更新或者纯静态页面。
影响:主要是对seo的影响,收录减少,权重下降。
15. TCP与UDP的辨析
TCP协议下,连接需要建立三次握手,四次挥手,TCP别成为面向连接的可靠传输。UDP没有这些,相比较比较随意,无连接的不可靠传输,UOD适用于络电话、视频会议、在线直播。而像文件传输这样对可靠性和稳定性要求比较高适用于TCP。
| UDP | TCP | |
|---|---|---|
| 是否连接 | 无连接 | 面向连接 |
| 是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输(数据顺序和正确性),使用流量控制和拥塞控制 |
| 连接对象个数 | 支持一对一,一对多,多对一和多对多交互通信 | 只能是一对一通信 |
| 传输方式 | 面向报文 | 面向字节流 |
| 首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
| 适用场景 | 适用于实时应用,例如视频会议、直播 | 适用于要求可靠传输的应用,例如文件传输 |
16. HTTP请求方法
- GET:获取数据,参数在query 中
- POST:提交数据,参数在body中
- PUT:与POST请求类似,指向的具体资源,可以理解为put为更新数据,post为创建数据
- DELETE:删除指定资源
- HEAD:只请求页面的头部,不请求页面内容,允许我们单纯获取服务器响应头
- OPTIONS:询问支持的请求方法,用来跨域请求
17. GET/POST的区别
GET和POST都是http请求方法。
- GET主要是用户获取数据,POST主要是用户来提交数据
- 安全性,GET参数是暴露在url中,相对来说不是特别安全,POST参数是放在请求体中,较为安全
- GET传递的数据大小有限制,一般是4k,而POST没有限制
- 是否缓存:浏览器一般会对get请求缓存,很少对post缓存
- 参数类型:post的参数传支持更多的数据类型
- GET请求报文请求方法为GET,POST请求报文方法为POST
18. Get方法URL限制原因
HTTP协议规范并没有对get方法请求的url长度进行限制,这个限制是特定的浏览器和服务器对它的限制。
不同浏览器,服务器对url长度是不同的,其中ie限制运行的字符最小,ie规定get方法url长度不超过2083字符,也就是说,在2083这个范围下,所有的浏览器和服务都可能正常工作。
19. 输入UTL到页面展示全过程
大概分为三个步骤:网络请求、解析渲染、断开连接。
1、网络请求
-
DNS解析:将域名解析为IP地址 -
客户端与服务器建立
TCP连接:三次握手 -
客户端发送请求
-
服务器处理请求,得到
HTML源代码。(遇到静态资源css/js/视频/图片会继续请求)
2、解析页面
-
浏览器解析并渲染页面,浏览器根据
HTML文件构建DOM树 -
根据
CSS文件构建CSSDOM树(style tree) -
两者结合,形成
Render Tree -
将
Render Tree渲染到界面
3、断开连接,四次挥手
20. TCP的三次握手和四次挥手
三次握手
浏览器发出请求,请求报文为:SYN=1,ACK=0,seq=x(记录序号)
服务器进行确认,报文内容为:SYN=1,ACK=1,seq=y(自己的初始化序号),确认号ack=x+1
浏览器再一次进行确认,ACK=1,seq=x+1,ack=y+1
TCP为什么一定要握手三次?
因为这样更加保险,安全,稳定,通过三次握手,浏览器和服务器端都经历请求和响应,确保双方都具有发送和响应的能力。
四次挥手
浏览器数据发送完毕,请求释放链接。发送FIN =1,seq=x。
服务器确认,回复ACK=1,确认码ack=x+1,自己的序列号seq=y。
浏览器觉得是时候该结束了,抛出FIN=1,确认标识 ACK=1、确认码 ack=x+1,以及自己的新序列号 seq=z。
服务器抛出ACK=1 的报文。当然啦,一起过去的还有确认码 ack=z+1,确认标识 ACK=1,以及自己的新序列号 seq=x+1。
TCP为什么一定要握手三次?
因为这样更加保险,安全,稳定,通过三次握手,浏览器和服务器端都经历请求和响应,确保双方都具有发送和响应的能力。
21. OSI七层网络模型详解
计算机网络为什么要分层?
不同层实现不同的功能,识别目标计算机、确定目标计算机的状态、数据错误勘测等,保证计算机与计算机之间数据通路顺畅。
谐音记忆:答应表哥会传输网络数路物流人员。
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
(1)应用层:
最靠近用户的一层,为计算机提供应用接口,为用户提供各种服务。我们常见的网络服务协议有:HTTP、HTTPS、FTP、POP3、SMTP等
-
HTTP:超文本传输协议,常用于客户端与服务器的数据请求
-
FTP:文件传输协议,常见的就是一些资源网站,,例如:百度网盘、迅雷
-
SMTP:简单邮件传输协议 用户邮箱验证码登录的功能时,会用到这个协议
(2)表示层
为应用层提供数据编码和转化功能
在项目开发中,为了方便数据传输,可以使用base64对数据进行编解码,
按功能来划分,base64应该是工作在表示层。
(1)会话层
负责建立、管理、终止表示层之间的通信会话,该层的通信由不同设备中应用程序之间服务请求和响应组成。
(2)传输层
为上层协议提供端到端的可靠透明的数据传输,包括处理差错控制和流量控制等问题。该TCP,UDP就在这一层。
(3)网络层
通过IP寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。
网络层规定了数据包的传输路线,而传输层则规定了数据包的传输方式。这一层就是我们经常说的IP协议层。IP协议是Internet的基础。
(4)数据链路层
将比特组成字节,再将字节组合成帧,使用链路层地址来访问介质,并进行差错检测。
网络层是规划了数据包的传输路线,而数据链路层就是传输路线。不过,在数据链路层上还增加了差错控制的功能。
(5)物理层
实际最终信号传输是通过物理层实现的,通过物理介质传输比特流。规定了电平、速度和电缆针脚。常用设备有(各种物理设备)集线器、中继器、调制解调器、网线、双绞线、同轴电缆。这些都是物理层的传输介质。
通信特点:对等通信
源端OSI模型的每一层与目的端的对等层进行通信,在每一层通信过程中,使用本层自己协议进行通信。
22. TCP/IP四层网络模型
相比OSI模型,TCP/IP模型更加简单,它把应用层、表示层、会话层,整合在了应用层。我们在日常开发也是使用TCP/IP来进行网络理解的。
每一层服务不同,对应的协议也不同:
23. 域名与域名解析系统
域名:
- 域名是由.字母和数字组成
- 点分割不同的域
- 域名可以分为顶级域、二级域、三级域
顶级域名:
- 国家:cn、us、uk、ca
- 通用:com、net、gov、org
二级域名:
- aliyun
- baidu
域名解析系统:
将域名解析为ip地址,比如在URL中输入www.baidu.com 的 IP 地址,对应查找出对应的域名。
- 根域名服务器:最高层次服务器,每个国家自行维护,知道所有顶级服务器ip地址和域名
- 顶级域名服务器:不同国家地区维护,解决顶级域名解析
- 本地域名服务器:一些机构公司去维护
24. DNS 服务器解析域名的过程
- 检查浏览器的缓存中否有这个域名对应的ip地址
- 如果没有,检查本地DNS本地服务器是否缓存过ip地址
- 本地域名服务器向根域名解析服务器发起域名解析,根域名服务器返回顶级域名解析服务器地址
- 本地服务器向顶级域名服务器查询,顶级域名查询服务器返回本地域名服务器
- 本地服务器向本地域名服务器发送请求,域名服务器返回对应的结果
- 本地服务器将返回结果保存在缓存中,并将返回结果返回给浏览器
首先访问根域名服务器—>顶级域名服务器——>本地域名服务器,从而拿到域名,一个迭代的过程。
25. 什么是WebSocket
WebSocket是H5新增网络通信协议,他和HTTP属于交集。它最大的特点是:允许服务器主动推送数据给客户端。
服务器端,借助ws创建服务:
Const { WebSocketServer } = require ('ws');
Const wsServer = new WebSocket({port:3000})
wsServer.on('connection',ws=>{
console.log('connected')
ws.on('message',msg=>{
console.log('收到了信息',msg.toString())
// 服务器向客户端发送消息
setTimeout(()=>{
ws.send('服务器已经收到了信息:'+msg.toString())
},2000
})
})
客户端:
// 首先new一个websocket对象,通过ws协议连接上服务端
Const ws =new WebSocket('ws://127.0.0.1:3000')
// 客户端与服务端建立连接后触发
Ws.onopen=()=>{
console.log('Connection open');
ws.send('hello');
}
// 服务端给客户端发来消息时候触发
ws.onmessage = function(res) {
console.log(res); // 打印的是MessageEvent对象
console.log(res.data); // 打印的是收到的消息
};
// 在客户端与服务端关闭连接后触发
ws.onclose = function(evt) {
console.log('Connection closed');
};
WebSocket 连接过程:
-
先发起一个
http请求 -
成功之后再升级到
WebSocket协议,在通信, 与 HTTP 协议有着良好的兼容性。
26. WebSocket和HTTP的区别
WebSocket是双向的,HTTP是单向的WebSocket协议名是ws:// ,(如果加密,则为wss)WebSocket默认端口也是80和443WebSocket没有跨域限制
27. Websocker、短轮询、长轮询区别
1、WebSocktet
连接一旦建立,不存在请求和响应的区别,可以相互发送数据。
请求—连接—互相交互
2 、短轮询
在特定的时间间隔内, 由浏览器对服务器发出HTTP请求。
请求—响应 —请求—响应 —请求—响应
var xhr = new XMLHttpRequest();
setInterval(function(){
xhr.open('GET','/user');
xhr.onreadystatechange = function(){
};
xhr.send();
},1000)
3、长轮询
客户端向服务器发送请求,服务器接到请求后hold连接,直到有新消息才返回响应信息并关闭连接。
function ajax(){
var xhr = new XMLHttpRequest();
xhr.open('GET','/user');
xhr.onreadystatechange = function(){
ajax();
};
xhr.send();
}
请求—保持挂起—有内容或超过时间才响应
三者比较:
- 从性能方面考虑,
WebSocket>长轮询>短轮询。 - 从兼容性角度考虑,短轮询>长轮询>
WebSocket