网络七层协议
应用层 HTTP FTP SMTP TelNet
表示层 JPEG
会话层 RPC SQL
传输层 TCP UDP
网络层 IP 路由器
数据链路层 交换机
物理层 光缆
TCP四层协议
应用层 HTTP FTP SMTP TelNet JPEG RPC SQL
传输层 TCP UDP
网际互联层 IP 路由器
网络接口层 交换机 光缆
TCP为什么合并应用层
因为应用层 表示层 会话层一般都在一个应用服务中一起实现,不大好区分,所以干脆就合并到一起
TCP三次握手四次挥手
- 三次握手
客户端发送 SYN seq=x 进入SYN-SEND状态
服务端接收之后发送 SYN ACK ack=x+1 seq=y 进入SYN-RECV状态
客户端接收之后发送 ACK ack=y+1 seq=x+1 进入LISENTED状态
服务端接收之后进入LISENTED状态 - 四次挥手
客户端发送 FIN seq=u 进入FIN-WAIT状态
服务端接收之后发送 ACK ack=u+1 seq=v 进入CLOSE-WAIT状态
客户端接收之后进入FIN-WAIT2状态
服务端处理完连接关闭之后发送 FIN ACK seq=w ack=u+1 进入LAST-ACK状态
客户端接收之后发送 ACK ack=w+1 seq=u+1 进入TIME-WAIT状态
服务端接收之后关闭连接
客户端等待两个传输周期后关闭连接
TCP如何保证可靠
- 数据分块 数据被分割成tcp认为合理的数据块
- 序列号和确认应答 每一个包都有各自的编号和对上一次接收的确认,每次发送都需要接收方ack
- 校验和 校验部首和数据部分
- 流量控制 接收方和发送方都有一个缓冲区,当接收方缓冲区快满,会提示发送方慢一点,防止丢包,滑动窗口控制
- 拥塞控制 当网络拥堵时减少数据发送,一开始不知道网络是否拥堵,就发少量数据,一点一点增大
- 超时重传 定时器,如果没有收到响应就再发
- ARQ停止等待协议 发送一段就停止,等待响应
TCP最大连接数
操作系统使用socket封装tcp,socket本质上是一个CIP+C端口与SIP+S端口的映射关系
发送方 跟端口数量有关 最多65535;接收方就可以接受IP数量*65535个链接了
如果接收方滑动窗口满了,发送方会怎么做
接收方返回给发送方的ACK包中,会返回当前接收方缓冲区的窗口大小,发送方会通过坚持计时器周期性的询问接收方
CLOSS-WAIT 和 TIME-WAIT
服务器在接受到客户端发起的关闭链接请求之后,响应客户端,然后进入CLOSE-WAIT状态,因为服务器缓存区可能还有东西没有发送完,要等到数据发送完之后才能关闭连接
客户端在接收到服务端确认关闭连接后进入TIME-WAIT状态,防止还有数据发送过来,如果快速关闭,再吃创建连接有可能复用到刚才的端口接收到上一个连接的数据
TIME-WAIT状态有什么问题
高并发下,占用文件描述符,使新连接无法释放;修改配置或设置 SO_REUSEADDR 套接字,使得服务器处于 TIME-WAIT 状态下的端口能够快速回收和重用。
TIME-WAIT为什么是2MSL
客户端发送最后ACK之后,为了确认服务端接收到了,启动一个2MSL的定时器,如果2MSL没有接收到服务端的FIN保温,说明服务端已经close连接,完成了第四次挥手
TCP流量控制和拥塞控制
- 流量控制 接收方和发送方都有一个缓冲区,当接收方缓冲区快满,会提示发送方慢一点,防止丢包,滑动窗口控制,ACK包中返回窗口大小
- 拥塞控制 当网络拥堵时减少数据发送,一开始不知道网络是否拥堵,就发少量数据,一点一点增大;一旦报文失序,快速响应,连续失序恢复慢开始门限一半
慢开始、拥塞避免、快重传、快恢复
UDP和TCP的区别
TCP是面向连接的,UDP不是面向连接的
TCP实现可靠传输,UDP不可靠
TCP发送的是字节流,UDP发送的是数据报文
TCP传输慢,UDP快
TCP需要资源多,UDP少
TCP首部20~60,UDP8字节
UDP为什么是不可靠的
UDP只有一个socket接收缓存区,没有发送缓冲区,所以有数据就发,不管对方是否接收到,对方接收缓冲区满了,就会丢弃新消息,也没有流量控制和重传机制,所以不可靠
HTTP协议
超文本传输协议 通用头+请求头+响应头+实体
什么是长链接
长链接是为了规避多次请求同一个服务每次都要进行三次握手和四次挥手,客户端通过通用头中的Connection: keep-alive 告诉服务端,这个链接我要维持一会儿
Http1.1默认长链接
长短链接使用场景
长:操作频繁,点对点通讯,即时通讯,网络游戏
端:用户数量较多,电商网站,因为长链接会占用大量资源
HTTP有哪些Method
1.0 GET, POST 和 HEAD
1.1 OPTIONS, PUT, PATCH, DELETE, TRACE CONNECT GET, POST HEAD
GET和POST区别
get参数放在url之后,参数会出现在地址栏,不安全;post是放在请求实体中
get编码只支持URL编码
get只支持ASCII 字符格式的参数
get提交数据长度有限制,一般由浏览器控制,chrome8182、火狐65535、IE2000
HTTP1.0 HTTP1.1 HTTP2 HTTP3
- 1.1比1.0 增加了多种缓存策略;range头允许客户端请求部分数据;增加24中状态码:414地址太长 410资源删除;host头支持虚拟主机;默认长链接
- 2.0比1.x 二进制传输,数据分成数据流,有ID表示唯一;多路复用,使用流ID判断是来自哪个http的;压缩头部,传输头部表示,从头部信息表找到对应头部(双方都会维护);服务器推送
- 3.0 是在 QUIC 基础上发展起来的,其底层使用 UDP 进行数据传输
HTTPS
以安全为目标的 HTTP 协议,在 HTTP 的基础上通过传输加密和身份认证的方式保证了传输过程的安全性
- 客户端发起https请求,链接服务端433接口,发送本身支持的算法类型和秘钥长度
- 服务端接到消息,从自身支持的算法中选择一个发送给客户端
- 服务端发送包含数字证书的报文,证书内容、公钥
- 服务端发送一个完成报文给客户端,第一阶段协商完成。
- 客户端发送一个由公钥加密过的报文,包含一个随机密码串pre_master_secre
- 客户端发送finish 等待服务端解密后的回执
- 服务端解密之后发送finish给客户端,自己可以正确解密
- 之后进入TCP握手阶段,报文都以pre_master_secre进行对称加密传输
HTTP和HTTPS区别
端口,http80 https443
内容 http明文 https密文
https 除了握手还要有ssl协商
对称加密和非对称加密
对称加密指同一个秘钥进行加密解密
非对称加密指一个密钥对,私钥加密数据可以用公钥解密,
RSA
RSA是一个非常经典的非对称加密算法
原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥;
素数选择的越大,越安全,但是素数越大,加密和解密耗时也越长;
所以在一般场景,RSA用于传递对称加密的秘钥
什么是Restful
select poll epoll
操作系统提供的NIO方式,IO多路复用,同步不阻塞IO
select()方法会返回已经准备好的数据流,有1000个的限制
poll()比select(),没有限制
epoll()是基于信号通知的机制,首先创建一个epoll文件描述符,想epoll描述符中添加监听事件,比如某socket的read()操作,然后调用epoll_wait()方法,等待通知
水平触发,只要有就发 边缘触发,只要改变就发 epoll默认是水平
转发与重定向
转发一般指servlet之间的请求传递,会携带request和response内容,地址栏无变化
重定向只通过response返回一个302状态码+location地址头,浏览器获取之后,再次发起访问,两次请求,独立req和resp,地址栏变化
servlet
servlet是java对web开发指定的web服务器功能组件。
servlet可以处理动态资源的请求,扩展web服务器的功能。
tomcat原理
tomcat是一个servlet容器,同时也是一个http服务器
tomcat架构
server 一个tomcat实例
service 一个server至少包含一个service
Connector 用于处理连接相关的事情,并提供Socket与Request和Response相关的转化;一个service可以有多个;http https
Endpoint处理socket;Processor封装request;Adapter将reqeust交给container
Container 用于封装和管理Servlet,以及具体处理Request请求;一个service只有一个
Engine引擎,管理多个站点;
Host 代表一个站点;
Context 代表一个应用,一个war包就是一个context;一个host下可以有多个context
Wrapper 是一个servlet的包装,一个context包含多个
tomcat请求执行流程
tomcat在Container是通过责任链模式调用的
tomcat中最大可以有多少链接
connector上可以配置maxConnections和acceptCount
tomcat的最大连接数参数是maxConnections,这个值表示最多可以有多少个socket连接到tomcat上。
maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200
acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100
BIO模式下默认最大连接数是它的最大线程数(缺省是200),NIO模式下默认是10000,APR模式则是8192(windows上则是低于或等于maxConnections的1024的倍数)。如果设置为-1则表示不限制。
tomcat使用的是什么链接框架
NIO:非阻塞 I/O,采用 Java NIO 类库实现。
NIO2:异步 I/O,采用 JDK 7 最新的 NIO2 类库实现。
APR:采用 Apache 可移植运行库实现,是 C/C++ 编写的本地库。
单点登录
单点登录指,在分布式系统中的会话跟踪,以前我们使用session保存在服务器上,在分布式中需要解决session共享分问题,一种是使用另外的存储介质统一存储session,一种是使用token
cookie和session
cookie是一种客户端状态管理技术,支持服务器将一些信息埋到浏览器对应的域名之下,浏览器在访问此域名的资源时会自动携带,在response中通过set-cookie的header
cookie随意复制,伪装成用户
session是一种服务端状态管理技术,有web服务器创建,并保存在web服务器上,将sessionId通过set-cookie写入浏览器cookie
会话跟踪技术
http请求是无状态的,很多情况需要确认http发起方的身份,又不能总让用户传递用户名和密码,所以需要会话跟踪技术
JWT
token是一种客户端状态管理技术,用户验证身份后,服务端发给客户端一个token,客户端保存次token,每次请求的时候将token写入header 的Authorization=
'Bearer' + token,服务端拿到请求的token,进行解析,只是本地解析,不进行记录
json web token,是一种基于json的token,分为三部分 header(声明加密算法)、playload(有效信息用户身份)、signature(签名)
XSS攻击
跨站脚本注入攻击,向正常网站的表单中注入恶意脚本代码,窃取网站私有内容,比如窃取cookies、localstorage、sessionstorage的内容。或是注入一些代码,指令等。
设置cookies为HttpOnly 使cookie不可被js读取操作。
使用XSSFilter过滤此类请求参数。
CSRF攻击
跨站请求伪造,诱导用户在恶意网站内点击链接,链接请求正常网站的功能业务,会自动携带正常网站的cookies,在用户不知情的情况下完成一些操作。
- 健强服务端逻辑,严格restful风格,可以防御一些低端的攻击。
- 利用请求头中的refer内容,refer是浏览器在发起请求是设置的当前请求来源网站的信息,可以防御绝大部分的攻击。
- 每次请求需要用户填写验证码,可以防御所有攻击,当然这种方式体验太差。
- x-xsrf-token,在发起请求前由前端从cookie中读取一个随机token,这个token可能是之前种下的,写到header中,因为只有同一个域下的js才能访问cookie(未设置httponly的),可以防御所有攻击。
跨域请求
浏览器对网站的一种保护,非原网站发起的请求,需要跨域资源共享,才被允许访问
1.jsonp
2.服务端允许跨域Access-Control-Allow-Origin 、Access-Control-Allow-Credentials:true
Request中attr和param的区别
param为请求传入的参数,attr是主动设置的参数
param不可以修改,attr可以修改可以删除
param只能是string,attr可以是对象
网友评论