应用层(Application Layer):只关心业务逻辑,不关心数据的传输
比如微信,只关心谁发消息给了谁,不关心发了什么消息
表现层(Presentation Layer):
负责写上用于传输的数据格式,并转换数据格式
会话层(Session Layer):负责管理两个联网实体间的连接
传输层(Transport Layer):负责将数据从一个实体(一个服务或应用)传输到另一个实体,但不负责数据传输的方式。
功能:
网络层():负责把一个封包从一个IP
地址传输到另一个IP
地址
功能
一个结点收到一个封包之后,如何把这个封包传递到下一个节点?
通过路由算法选择路线。
数据链路层:确保两个临近设备间数据的传输,并隐藏底层实现
物理层:封装和隐藏具体的传输手段,并提供稳定的传输接口
OSI的问题:
1.报文拆分
2.增加协议头
3.数据在相邻设备间传递数据
4.路由和寻址
路由算法:通过算法寻找下一个要到达的节点
5.数据重组
拆分后如何重组
五层模型和OSI
的区别:
TCP协议的可选性:
传输层:TPC
协议,UPD
协议,TLS
/SSL
,SCTP
等
网络层:IP
协议(IPV4
/IPV6
),ICMP
协议,IPSec
协议
可靠性指数据保证无损传输
如果TCP段特别多的时候,该如何进行排序?
时间窗口,每次排序固定在一个时间段内的数据,如果错过了时间窗口的数据后面再次到达,就会认为之前的时间窗口的数据不完整,会要求再次重发
IP协议(Internet Protocol):网络层协议
1.封包损坏 2.丢包 3.重发 4.乱序
1.延迟 2.吞吐量 3.丢包率
区别一:地址
区别二:寻址
全称:User Datagram Protocol ,用户数据报文协议
定义:在传输层提供直接发送报文(Datagram)的能力,Datagram是数据层传输最小的协议
目标:发送报文,无法拆分数据?
为什么不直接调用
IP
协议?
IP协议只能把数据从一个网络接口发送到另一个网络接口,无法寻址到应用。而传输层的协议是host到host,IP协议无法存储端口号,所以出现了UDP协议
TCP的本质是为了提供可靠的网络传输,因为要保证可靠性和有序性,所以导致了他的负载会很大,适合多数的web应用,会话,交易,推送,展示信息等等,数据的交换量不是很大,但是需要可靠性。
UDP适合音视频的传输,比如视频或者电话,丢了一两个包一两个像素并没有什么影响,追求的就是速度。UDP适合广播场景,不需要等待别人的ACK。
(1)聊天室是否适合UDP?
意义不大,聊天室的并发场景很大,传输并不是很大,但是必须保证高可用,不允许数据丢失,所以应该用TCP。但是如果能在保证可靠性的情况下,可以考虑用UPD做整合。
(2)HTTP协议是否适合UDP?
HTTP协议是要保证可靠性,按理说是不适合的,但是后面出现了HTTP3.0就是建立UDP上个的,保证了可靠性。
HTTP协议(Hyper Text Transfer protocol):应用层协议
目标:是处理客户端和服务端之间的通信
DNS(Domain Name System):域名解析系统。
DNS Query的分级缓存策略
先查询浏览器的本地缓存(通常在内存中) 本地没缓存, 查找操作系统的hosts文件,该文件在linux中在/etc/hosts里 上述步骤没有找到, DNS会查询本地服务提供商(ISP) ISP没找到,请求指向Root根服务器,根服务器起到的是一个类似目录的作用,返回顶级域名服务器地址,比如www.baidu.com,查询返回的是.com顶级域名服务器的地址 浏览器发送请求给顶级域名服务器,返回权威域名服务器地址 浏览器发送Lookup请求给权威域名服务器, 找到具体DNS记录,返回给浏览器 浏览器缓存+本地服务商缓存就能拦住90%的请求
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(Content Delivery NetWork):将请求分散到全世界各地,分发流量,加快访问速度。
但是CND上无法部署业务逻辑,更新慢,无法保证一致性,所以比较适合纯的静态资源比如图片,视频,脚本文件,样式文件等。
HTTP协议通过请求头和返回头控制协议工作。无论是请求头还是返
回头都是Key/Value的形式。
Content-Length:发送/接收Body内容的字节数。
User-Agent:这个字段可以帮助统计客户端用了什么浏览器、操作系统等
Content-Type: 请求的时候,告知服务端数据的媒体类(MediaType/MIME
Type)。 返回的时候告知客户端,数据的媒体类型。
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
默认是close
Http1.1
后默认是keep-alive
1XX
:提供信息2XX
: 成功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
:服务端错误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?
如果没有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。
出于浏览器的同源策略限制。
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端口,这属于端口不同,跨域了。
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的区别
TCP如何确保数据顺序?
CDN更换图片?缓存更新?
CDN的实现就是只能DNS,重定向到拥有资源的最近的服务器,降低延迟。只能用另一张图片的URL把图片更换掉,相对快一点,缓存更新确实慢一点,就是慢慢的调度。因为本地有浏览器的强制缓存,都是天为级别的。
LRU是什么?
缓存置换:缓存满了后,每次创建新的缓存条目,就会删除最旧最早的缓存条目。
什么是https中间人攻击?
黑客一定要先在客户端安装自己的CA证书。才能做到这一步,就是各种钓鱼
NIO有什么优势
一次DNS查询最快和最慢差距有多大?
最快命中本地浏览器缓存
最慢需要到服务商(ISP) -> Root服务器->顶级域名服务器->权威服务器,链路很长
DNS是分级缓存策略,每级缓存都非常强大。
HTTP keep-alive和http2.0的多路复用有什么区别?
强制缓存和协商缓存的区别
正向代理和反向代理的区别?