计算机网络
OSI七层模型:
-
应用层(Application Layer):只关心业务逻辑,不关心数据的传输
比如微信,只关心谁发消息给了谁,不关心发了什么消息
-
表现层(Presentation Layer):
负责写上用于传输的数据格式,并转换数据格式
-
会话层(Session Layer):负责管理两个联网实体间的连接
-
传输层(Transport Layer):负责将数据从一个实体(一个服务或应用)传输到另一个实体,但不负责数据传输的方式。
功能:
- 数据分隔重组:将数据拆分后按顺序重组
- 纠错:在数据传输过程出现问题后才去方式进行纠正
- 管理链接:处理数据的频繁交换
- 流量控制:控制传输数据的速率
- 端口寻址:标明参与传输的实体的端口号
- 数据的加密解密等
-
网络层():负责把一个封包从一个
IP
地址传输到另一个IP
地址功能
一个结点收到一个封包之后,如何把这个封包传递到下一个节点?
通过路由算法选择路线。
-
数据链路层:确保两个临近设备间数据的传输,并隐藏底层实现
- 帧同步:两个设备之间传输时的协商数率问题
- 数据纠错
-
物理层:封装和隐藏具体的传输手段,并提供稳定的传输接口
OSI的问题:
TCP/IP 互联网协群
需要解决的五个问题
1.报文拆分
- 数据量大,网络底层设备不支持
- 数据量大,复用路径
2.增加协议头
- 数据分块后在接收端需要重组,所以需要使用头部来添加一些描述字段
- 数据块 =》 头部(协议头) +数据(消息体)
3.数据在相邻设备间传递数据
4.路由和寻址
路由算法:通过算法寻找下一个要到达的节点
5.数据重组
拆分后如何重组
五层模型
五层模型和OSI
的区别:
- 删除了会话层,会话是虚拟概念,不是必须的
- 删除了表示层,数据压缩,数据格式转换不是应用必须的
TCP协议的可选性:
传输层:TPC
协议,UPD
协议,TLS
/SSL
,SCTP
等
网络层:IP
协议(IPV4
/IPV6
),ICMP
协议,IPSec
协议
TCP协议
什么是链接?
- 是虚拟、抽象的概念
- 能让两个通信的程序间确保彼此都在线
- 加快响应请求速度
- 连接也被称为会话(Session)
- 使通信更稳定、安全
- 消耗更多资源
全双工的概念
可靠性:
可靠性指数据保证无损传输
- 使无序的数据复原为有顺序
- 多播时每个接收方都获得无损副本
建立连接(三次握手)
断开链接(四次握手)
传输数据-报文拆分
- 应用层数据很大时无法一次传输完
- 拆分后可以实现并行传输
传输数据-顺序保证
如果TCP段特别多的时候,该如何进行排序?
时间窗口,每次排序固定在一个时间段内的数据,如果错过了时间窗口的数据后面再次到达,就会认为之前的时间窗口的数据不完整,会要求再次重发
流控能力
- 主要目标,让发送方和接收方协商一个合理的收发速率,让两边都可以稳定的工作
- 利用滑动窗口
IP协议
IP协议(Internet Protocol):网络层协议
IP协议可能遇到的问题
1.封包损坏 2.丢包 3.重发 4.乱序
网络层要解决的三个问题
1.延迟 2.吞吐量 3.丢包率
IP协议的工作原理
- 分片(Fragmentation)
- 增加协议头(IP Header)
- 延迟、吞吐量、丢包率
- 寻址(Addressing)
- 路由(Routing)
IPv6和IPv4的主要区别
区别一:地址
区别二:寻址
Ipv6的主要优势:
- 解决了IP地址耗尽的问题
- 解决了网络区域、站点划分的问题。
- 协议层支持多播。Ipv6可以有专门的地址用作多播。
- 支持邻居发现协议,自动分配地址,做到了无状态接入设备。
UDP协议
全称:User Datagram Protocol ,用户数据报文协议
定义:在传输层提供直接发送报文(Datagram)的能力,Datagram是数据层传输最小的协议
目标:发送报文,无法拆分数据?
为什么不直接调用
IP
协议?
IP协议只能把数据从一个网络接口发送到另一个网络接口,无法寻址到应用。而传输层的协议是host到host,IP协议无法存储端口号,所以出现了UDP协议
UDP和TCP的区别
TCP的本质是为了提供可靠的网络传输,因为要保证可靠性和有序性,所以导致了他的负载会很大,适合多数的web应用,会话,交易,推送,展示信息等等,数据的交换量不是很大,但是需要可靠性。
UDP适合音视频的传输,比如视频或者电话,丢了一两个包一两个像素并没有什么影响,追求的就是速度。UDP适合广播场景,不需要等待别人的ACK。
(1)聊天室是否适合UDP?
意义不大,聊天室的并发场景很大,传输并不是很大,但是必须保证高可用,不允许数据丢失,所以应该用TCP。但是如果能在保证可靠性的情况下,可以考虑用UPD做整合。
(2)HTTP协议是否适合UDP?
HTTP协议是要保证可靠性,按理说是不适合的,但是后面出现了HTTP3.0就是建立UDP上个的,保证了可靠性。
HTTP协议
-
HTTP协议(Hyper Text Transfer protocol):应用层协议
目标:是处理客户端和服务端之间的通信
-
DNS(Domain Name System):域名解析系统。
DNS工作原理:
-
DNS Query的分级缓存策略
先查询浏览器的本地缓存(通常在内存中) 本地没缓存, 查找操作系统的hosts文件,该文件在linux中在/etc/hosts里 上述步骤没有找到, DNS会查询本地服务提供商(ISP) ISP没找到,请求指向Root根服务器,根服务器起到的是一个类似目录的作用,返回*域名服务器地址,比如www.baidu.com,查询返回的是.com*域名服务器的地址 浏览器发送请求给*域名服务器,返回权威域名服务器地址 浏览器发送Lookup请求给权威域名服务器, 找到具体DNS记录,返回给浏览器 浏览器缓存+本地服务商缓存就能拦住90%的请求
DNS解析
DNS的数据以记录形式存储,就叫DNS记录。DNS记录的种类非常多,
有30多种。每条DNS记录描述了网址(URL)的一种关系。
-
A记录:定义主机的IP地址
-
AAAA记录:定义主机的IPv6地址
-
CNAME记录:定义域名的别名
-
MX记录(Mail exchanger record):定义邮件服务器所在的位置。
-
NS记录(Name Server Record):定义DNS服务器所在的位置
-
SOA记录(Start of Authority Record):定义多个NS服务器中哪个是主服务器
-
TXT记录 :提供一个文本信息
一般用来在自己的网站添加规定的文本信息来证明这个网站是自己的。
内容分发网络(CDN)
cdn(Content Delivery NetWork):将请求分散到全世界各地,分发流量,加快访问速度。
但是CND上无法部署业务逻辑,更新慢,无法保证一致性,所以比较适合纯的静态资源比如图片,视频,脚本文件,样式文件等。
请求头/返回头
HTTP协议通过请求头和返回头控制协议工作。无论是请求头还是返
回头都是Key/Value的形式。
-
Content-Length:发送/接收Body内容的字节数。
-
User-Agent:这个字段可以帮助统计客户端用了什么浏览器、操作系统等
-
Content-Type: 请求的时候,告知服务端数据的媒体类(MediaType/MIME
Type)。 返回的时候告知客户端,数据的媒体类型。- text/html: HTML格式
- text/css: css文本
- application/json: JSON数据格式
- image/jpeg: /jpg图片格式
-
Origin:描述请求来源地址,可以为null,
scheme://host:port
-
Accept:是HTTP协议协商能力的体现,用于建议服务端返回何种媒体类型
(MIME Type)比如:accept: application/json, Text/javascript, * /* ,q=0. 01
*/ *代表所有类型(默认)
多个类型用逗号隔开例如: text/html, application/jison
Accept-Encoding:建议服务端发送哪种编码(压缩算法)
deflate, gzip; q=1 .0, * ;q=0.5
Accept-L anguage:建议服务端传递哪种语言信 -
Referer:告诉服务端打开当前页面的上一张页面的URL
非浏览器环境有时候不发送Referer (或者虚拟Referer,通常是爬虫)
常用于用户行为分析
-
Connection:决定HTTP链接(不是TCP链接)是否在当前事务完成后关闭
Http1.0
默认是closeHttp1.1
后默认是keep-alive
HTTP的方法
- GET:从服务器获取资源
- POST:在服务器创建资源
- PUT:在服务器修改资源(幂等性)
- DELETE:在服务器删除资源
- OPTION :跨域部分讲解
- TRACE :用于显示调试信息多数网站不支持
- CONNECT:代理部分讲解
- PATCH :对资源进行部分更新(极少用)
状态码
1XX
:提供信息
- 100 continue
- 101 切换协议(switch protocol)
2XX
: 成功
- 200-OK
- 201 - Created 已创建
- 202 - Accepted 已接收
- 203 - Non-Authoritative Information 非权威内容
- 204 - No Content 没有内容
- 205 - Reset Content 重置内容
- 206 - Partial Content 服务器下发了部分内容(ranger header)
3XX
:重定向
-
300 - Multiple Choices用户请求了多个选项的资源(返回选项列表)
-
301 -
Moved Permanenty
永久转移 -
302 -Found资源被找到(以前是临时转移)
-
303 - See Other可以使用GET方法在另一-个URL找到资源
-
304 - Not Modified没有修改(缓存部分特别说明)
-
305 - Use Proxy需要代理
-
307 - Temporary Redirect临时重定向
-
308 - Permanent Redirect永久重定向
301和308
共同点:资源被永久的移动到新的地址
差异:客户端收到308请求后,沿用旧的method(post/get/put)到新网址
客户端收到301请求后,通常用户会向新地址发起GET请求
302 / 303 / 309
共同点:资源临时放到新地址
差异:302是
http1.0
提出的)最早叫做Moved Temporarily;很多浏览器实现的时候没有遵照标准,把所有请求都重定向为GET,1999年标准委员会增加了303和307,并将302重新定义为Found。303告诉客户端使用GET方法重定向资源
4XX
:客户端错误
-
400 - Bad Request请求格式错误
-
401 - Unauthorized没有授权一
-
402一Payment Required请先付费
-
403-- Forbidden禁止访问
-
404 - Not Found没有找到
-
405 - Method Not Allowed方法不被允许
-
406 - Not Acceptable服务端可以提供的内容和客户端期待的不一样
比如客户端Accept希望拿到一个
json
,但是服务器返回的是一个jpg
5XX
:服务端错误
- 500 - Internal Server Error(内部服务器错误)
- 501 - Not Implemented (没有实现)
- 502 - Bad Gateway(网关错误)
- 503 - Service Unavailable(服务不可用)
- 504 - Gateway Timeout(网关超时)
- 505 - HTTP Version Not Supported (版本不支持)
HTTP缓存
HTTP缓存最重要的配置项为Cache-Control HTTP返回头。不仅浏览器可
以缓存,浏览器和服务器之间的HTTP代理服务器也可以缓存。
强制缓存:
协商缓存:
协商缓存的行为是基于变更协商的。在缓存条目对应的资源发生生变化前,都使用浏览器缓存。因此协商缓存必须每次都请求服务端.
Etag:服务端想实现协商缓存时可返回ETag,资源不变,ETag的数值也不会改变。
Last-Modifed(Depreciated):基于变更时间的协商缓存方案。
Keep-Alive:多次请求复用-个TCP连接。
为什么要用keep-alive?
因为TCP三次握手和证书还有协商密匙的传递都需要时间,所以为了节省网络成本,会考虑多次复用一个TCP请求链接。
Keep-alive的断开
单个请求:请求完成后,在timeout时间内没第二E个请求进来则会关闭。
多个请求:在一个请求响应之后,在timeout时间内有另一个请求进来, 就会
利用相同的TCP连接继续响应这个请求,直到没有更多请求进来,可以通过
max字段设定最多响应的请求数。
keep-alive不是长链接,webSocket
是长链接
-
keep-alive
并不是长连接 -
WebSocket
:长连接,提供在HTTP协议退化成TCP协议
的方式。让客户端和服务器之间保持很长时间的连接且不中断
加密、加密和证书
加密:将明文信息变成不可读的密文内容,只有拥有解密方法的对象才能够
将密文还原成加密前的内容。
对称加密:加密/解密用一个秘钥,且加密方和解密方都知道秘钥,如DES ,3DES等。
当秘钥丢失的时候,信息容易泄露,或者被伪装成接收方发送方。
非对称加密:加密用一一个秘钥,解密用另一个秘钥且加密方- -般有2个秘钥,解密方有一个解密秘钥.非对称加密安全性高,但速度慢,如RSA算法.
摘要算法:就是将原文和摘要同时传输给接收方。
因为算法加密涉及到效率问题,如果原文不担心被看到,只担心被纂改的情况下,就可以把摘要和原文一起发送,因为两个东西不可能一起修改,而且摘要一般是密文。
HTTPS和HTTP2.0
为什么需要HTTPS?
如果没有https协议,黑客就可以从任意一个结点获取这个明文,甚至纂改重发。
HTTPS (HTTP Over SecureSocket Layer) :应用层协议
工作原理
HTTPS采用对称加密的方式加密传输的数据,然后对称加密的秘钥,采用非对称加密的方式进行协商。
HTTP 1.1 keep-alive的问题
HTTP1.1协议的KeepAlive让多个请求复用一个TCP连接,非多路复用。优点:节省
TCP握手时间;缺点:一个请求阻塞,其它请求也全都阻塞。
HTTP 2.0的解决方案
HTTP2.0协议,使用多路复用,优点: 一个请求阻塞了,其它请求依旧可以相应。
HTTP的头部压缩
同源策略、跨域
已拦截跨源请求:同源策略禁止读取位于http://locaLhost:8080/user/list 的远程资源。 (原因: CORS 头缺少’Access-Control Allow-Origin’) 。状态码: 200。
1、为什么会出现跨域问题?
出于浏览器的同源策略限制。
http的一个禁止协议,禁止当前网站的js脚本使用跨域资源的协议(防止跨站攻击),但是该禁止协议不作
用于浏览器。除非,http请求中已经加入了允许跨域的协议。
所谓同源(即指在同一个域)就是两个地址具有相同的协议(protocol)、主机(host)和端口号(port)
以下情况都属于跨域:
跨域原因说明 | 示例 |
---|---|
二域名不同 | www.jd.com 与 www.taobao.com |
域名相同,端口不同 | www.jd.com:8080 与 www.jd.com:8081 |
一级域名不同 | miaosha.baidu.com 与 miaosha.baidu.cn |
协议不同 | http和https |
http和https也属于跨域。
一级二级域名不同则跨域,三四五及一下域名不同不跨域。
如果域名和端口都相同,但是请求路径不同,不属于跨域,如:www.jd.com/item 和 www.jd.com/goods
同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。
而我们刚才是从localhost:5500端口去访问localhost:8080端口,这属于端口不同,跨域了。
2、解决跨域问题
-
Cors,Http允许跨域协议
Spring早就给我们提供了解决方案,我们只需要在对应controller上添加一个注解就可以了
我们在 UserController 类上添加跨域标签@CrossOrigin,再进行测试,则测试成功!
@CrossOrigin //解决跨域问题
-
jsonp,利用js标签的一个漏洞
-
利用Ngnix的反向代理
Axios经常使用的拦截器
在前后端分离的系统中,难以避免会出现跨域,在跨域情况下,cookie是不共享的,这样导致后端无法获取前端请求中的cookie,于是就不可避免的要求前端在发送请求时携带一些必要的cookie信息,如token用户凭证或者jsessionid会话id等信息,这就产生了前端拦截器的需求
常见面试题
IPv4和IPv6的区别
- 地址不同(
Ipv4
32位、Ipv6
128位) -> 地址空间、数目不同 - 地址分配不同(
IPv4
资源是稀缺的,分配需要竞争IPv6
可以给每个人分配很多地址) - 寻址方式不同:
IPv4
通过子网掩码计算网络地址;IPv6
有 固定的计
算方式划分网络。 - 地址解析策略不同(
IPv4
需要ARP
,IPv6
通过无状态的邻居发现)DNS
不同(IPv4
是A记录,IPv6
是AAAA
记录)
为什么是三次握手四次挥手?
TCP互联网协群的功能
TCP和UDP的区别
- 面向流VS面向报文
- 会话vs无会话
- 头(大vs小)
- TCP保证正确性(可靠性) ,UDP不保证
- UDP实现广播成本低
- UDP的简约型没有约束它的构架模式,HTTP3.0是基于UDP建立的
TCP如何确保数据顺序?
- 为什么需要保证: TCP拆分封包的时候是顺序拆分的,但是包会无序的到达目的地。
- 方法:利用(SEQ, ACK )编号确定封包的唯一性
- 方法:利用滑动窗口存放没有排好序的封包,直到窗口中完全有序才发送ACK。如果有包丢失,就会一直不发ACK。 如果窗口大小是4,发送ABCD,如果只有BD到目的地,那么滑动窗口中是_ B D。
CDN更换图片?缓存更新?
CDN的实现就是只能DNS,重定向到拥有资源的最近的服务器,降低延迟。只能用另一张图片的URL把图片更换掉,相对快一点,缓存更新确实慢一点,就是慢慢的调度。因为本地有浏览器的强制缓存,都是天为级别的。
LRU是什么?
缓存置换:缓存满了后,每次创建新的缓存条目,就会删除最旧最早的缓存条目。
什么是https中间人攻击?
黑客一定要先在客户端安装自己的CA证书。才能做到这一步,就是各种钓鱼
NIO有什么优势
- Reactive模型+非阻塞(减少线程切换)
- 内核级别拷贝内存到JVM (减少系统调用)
- 缓冲区增加数据处理的灵活性(clear/flip等操作)
- 处理I/O场景有明显性能优势 比如RPC调用,日志。
一次DNS查询最快和最慢差距有多大?
-
最快命中本地浏览器缓存
-
最慢需要到服务商(ISP) -> Root服务器->*域名服务器->权威服务器,链路很长
DNS是分级缓存策略,每级缓存都非常强大。
HTTP keep-alive和http2.0的多路复用有什么区别?
- keep-alive :复用TCP连接发送请求,节省了握手时间,本质还;是串行。
- http2.0多路复用:数据被打散成为小块,本质是并行。
强制缓存和协商缓存的区别
- 强制缓存强制执行,强制缓存不需要再发送请求给服务端。
- 协商缓存需要发请求给服务端验数据版本,如果有新版本的数据就需要重新下发数据,如果没有就返回304 Not Modified。
正向代理和反向代理的区别?