七层网络协议模型及常见协议?
第一层:物理层:直接在物理传输介质上发送和接收数据
第二层:数据链路层:负责信息从一个节点到另一个节点的物理传输
1):vlan(虚拟局域网)
第三层:网络层:负责数据从一个节点到另一个节点的传输
1):IP(网络互联协议,无连接,不可靠的数据包传输服务)
第四层:传输层:负责数据传输时发送主机和目的主机之间的完整性
1):tcp(传输控制协议:基于字节流的,传输层可靠通信协议)
2):udp(用户数据报协议:面向事务的简单不可靠信息传送服务)
3):tls(传输层安全协议:在两个通信应用程序之间提供保密性和数据完整性)
第五层:会话层:负责应用程序之间的会话,协调系统和服务之间的交流,使其有序通信
第六层:表示层:统一应用层数据格式,使数据可在两个系统中传输
1):lpp(轻量级会话协议)
第七层:应用层:提供应用层协议,为用户和网络提供交互接口
1):dns(域名解析协议:域名解析ip地址)
2):http(超文本传输协议:规定web服务端和客户端的数据传输格式)
3):https(超文本传输安全协议:http加上tls/ssl协议构成的可加密传输)
4):ftp(文件传输协议:网络共享文件传输)
tcp和udp的区别?
1:tcp面向连接,提供可靠服务,udp无连接,不保证可靠交付
2:udp实时性高,工作效率高,适合高速传输和实时性较高的通信
3:tcp连接只能一对一,udp支持一对一、一对多、多对一的交互
4:tcp面向字节流,udp面向报文,不可分割,一次交付一个报文
5:udp适合一次性传输较小数据的网络应用,如:dns,snmp
http状态中302、403、500代码含义?
一二三四五原则:一:消息系列,二:成功系列,三:重定向系列,四:请求错误系列,五:服务器错误系列
301:永久重定向
302:临时重定向
401:未授权
403:禁止访问
404:请求资源不存在
500:服务器内部错误,在php错误日志中查看
502:网关得到无效响应,服务端连接mysql出错或nginx接收到不完整数据
504:网关超时
一次完整的网页请求?
1:请求一个域名
2:dns解析域名得到IP和端口号
3:tcp三次握手连接到服务器
4:nginx 80端口监听到请求
5:加载nginx的fast-cgi模块
6:PHP-fpm监听并接收请求
7:启用worker进程处理请求
8:将代码交由zend引擎语法解析并执行
9:nginx得到结果通过http返回给浏览器
10:浏览器进行解析
tcp连接的三次握手和四次挥手?
三次握手:
1:客户端发送一个请求包,等待确认;
2:服务端收到请求包,发送确认包并携带一个自己的请求包;
3:客户端收到请求和确认包,再发送一个确认包
四次挥手:
1:客户端发送断开请求
2:服务端接收到断开请求,断开客户端到服务端的连接
3:服务端等待数据传输完成,发送断开请求
4:客户端收到请求,并断开
https和http的区别?
1:端口不同,http是80;https是443;
2:传输方式不同,http明文传输,无状态连接;https加密传输,身份认证,更安全
3:https需要申请ssl证书
4:http只需交换3个包(三次握手);https需要交换12个包(包含ssl的9个)
5:seo排名上https更优,但也更耗资源,加载更慢
https为什么是安全的?
因为它使用了ssl证书,对数据进行加密和身份认证
**1:数据加密:**客户端和服务器通过非对称加密交换密钥,使用对称加密,加密传输数据
**2:身份验证:**使用数字证书对服务器的身份进行认证,ca证书,客户端连接服务器时,服务器将证书发给客户端,客户端校验证书合法性
**3:数据完整性:**使用消息摘要对传输数据进行签名,确保没被篡改,客户端接收到数据时,会根据签名验证数据的完整性
https交换了几对密钥?
两次密钥交换
**1:对称密钥:**https握手中,客户端和服务器会协商出一个对称密钥,用于加密和解密传输的数据。只存在当前连接
**2:非对称密钥:**https握手中,服务器向客户端发送证书,证书中包含了服务器公钥,客户端使用这个公钥加密一个随机数,发送给服务器,服务器收到后,使用自己的私钥进行解密,得到随机数,接下来,客户端和服务器使用随机数计算出一个新的对称密钥,用于加密和解密数据。这个过程涉及到非对称密钥的使用,但实际上只有一对非对称密钥
http1.0,1.1,2.0的区别?
1.0:短连接(一次请求完成,立刻断开),无状态(客户端不记录过去的请求),没有host
1.1:默认长连接,请求管道化(并行),增加缓存处理,增加host字段,支持断点传输
2.0:多路复用(基于二进制分帧),头部压缩,服务器推送
get和post的区别?
1:本质区别:get是获取资源,post一般用于改变资源
2:安全性方面:get一般在地址栏,会被浏览器缓存,可回退,可刷新,post在body中,不会被缓存,无法回退,刷新会重复提交
3:数据包:get将header和data合并发送一个tcp数据包,post分开发送两个包
4:数据类型:get只能发送ascii字符,post多种数据类型
5:数据大小:get url不超过2048个字符,post可修改配置文件
为什么post比get安全?
1:数据传输方式:post参数在请求体中,get参数直接暴露在url后面
2:请求限制:get没有限制请求数据大小,post可以设置,可以避免请求数据过大导致的安全问题
3:缓存机制:get容易被缓存,post不会被缓存
4:防止篡改:get请求,可以通过修改url,更改请求数据;post的请求数据在请求体中,不能随意更改,如果需要修改,必须对请求体进行修改,更难实现
5:post只是相对安全,并不是绝对安全,可以对参数加密、校验、权限控制等
session和cookie的区别?
1:安全性:cookie在浏览器,可以通过分析本地文件进行cookie欺骗;session在服务器更安全
2:性能:session保存在服务器,访问增多,影响性能
3:限制:cookie有大小和个数的限制(4k,20个)
4:生命周期:cookie在关闭浏览器时消亡,session为防止内存溢出,会删除长时间未活跃的session
5:session是基于cookie的,禁用cookie会导致session失效,但可以通过别的方式实现
禁用cookie,实现session的正常使用?
1:URL重写,将session ID作为参数,通过URL传输到服务端
2:隐藏表单,通过表单形式,将session ID提交到服务端
session共享的目的,及实现方法?
为了解决负载均衡时,session信息不共享,也就是不能跨服务器访问的问题
实现:
1:服务器文件同步(文件重复,资源浪费)
2:存数据库(数据库压力大)
3:存cookie(不安全)
4:ip绑定(nginx进行ip_hash计算,将ip绑定到指定服务器)
5:存redis缓存(推荐)
公钥、私钥?
采用rsa算法对网络数据进行加密传输的方式。一个用来加密,另一个用来解密。
通过支付宝提供的openssl工具,在本地生成公钥和私钥,公钥上传到支付宝商家后台;
支付:我们用私钥,对订单加密,支付宝用我们上传的公钥解密
回调:支付包用它的私钥对回调信息加密,我们收到信息,用支付宝公开的公钥进行解密
前后端分离,如果保证鉴权?
1:token认证:前端登录后,向后端请求授权token,后端返回给前端,前端存储在本地,每次请求时将token放在请求头中,后端通过校验确定用户身份和权限,为了避免token泄漏或被盗用,应对token进行加密和过期处理
2:oauth2认证:微信登录,qq登录,前端将用户跳转到认证服务器,用户登录授权后,认证服务器返回授权码,前端发送给后端,后端使用授权码向认证服务器请求访问令牌,后端再使用访问令牌进行数据请求
3:session认证:前端登录后,后端将用户信息存到session中,前端每次请求将sessionid放在请求头中传给后端,后端通过校验确认用户身份