JVM
Java平台无关性
compile once,run anywhere
编译:javac指令,将源码编译成字节码,生成.class文件(字节码文件)
运行:java指令,JVM解析.class文件,加载进内存,转化成特定平台的执行指令
javap -c对代码反汇编
JVM如何加载.class文件
Runtime Data Area:JVM内存空间结构模型
谈谈反射
Java反射机制是在运行状态中,对于任意一个类,都能够知到这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
类从编译到执行的过程
ClassLoader
ClassLoader在Java中有着非常重要的作用,它主要工作在Class装载的加载阶段,其主要作用是从系统外部获得Class二级制数据流。它是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过将Class文件里的二进制数据流装载进系统,然后交给Java虚拟机进行连接、初始化等操作。
ClassLoader的种类
public class Launcher{
static class ExtClassLoader extends URLClassLoader {
private static volatile Launcher.ExtClassLoader instance;
}
}
自定义ClassLoader的实现
关键函数
protected Class<?> findClass(String name) throws ClassNotFoundException {
throw new ClassNotFoundException(name);
}
protected final Class<?> defineClass(String name, byte[] b, int off, int len) throws ClassFormatError{
return defineClass(name, b, off, len, null);
}
类加载器的双亲委派机制
作用:避免多份同样字节码的加载
双亲委派模型的工作过程是: 如果一个类加载器接收到了类加载的请求,它首先不会自己去尝试去加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载都是如此,因此所有的类加载请求都应该传送到顶层启动类加载器中,只有当父加载器反馈自己无法加载这个请求,子类加载器才会去尝试自己加载。
loadClass和forName的区别
Class.forName得到的class是已经初始化完成的
Classloader.loadClass得到的class是还没有链接的
类的加载方式
隐式加载:new
显式加载:loadClass,forName等
内存模型
地址空间的划分
内核空间、用户空间
add(1,2)的执行过程
本地方法栈(Native Method Stack)
与虚拟机栈类似,只不过虚拟机栈是服务Java方法的,而本地方法栈是为虚拟机调用Native方法服务的
元空间(MetaSpeace)与永久代(PermGen)的区别
1、JDK8以后把类的元数据放在本地堆内存中,这一块区域叫元空间MetaSpace,该区域在JDK7及以前属于永久代。 2、元空间和永久代均是方法区Method Area的实现 3、方法区只是JVM的规范,在Java7之后原先位于方法区中的字符串常量池移动到了Java堆中,并且在JDK8以后使用元空间替代了永久代。 4、元空间使用本地内存,永久代使用的是JVM中的内存。
Java堆(Heap)
Java虚拟机所管理的内存中最大的一块,是被所有线程共享的,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例,所有的对象实例都在这里分配内存。
- 当前主流的虚拟机都是按照可扩展实现的,即通过
-Xmx和-Xms控制。 - 若在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出
OutOfMemoryError异常。 Java堆是垃圾收集器管理的主要区域,因此很多时候也被称为GC堆。- 从内存回收的角度看,现在收集器都是采用分代收集算法,所以
Java堆中还可以细分为新生代和老年代。
JVM三大性能调优参数-Xms、-Xmx、-Xss
-Xss规定了每个线程虚拟机栈(堆栈)的大小,一般情况下256K足够,此配置将会影响此进程中并发线程数的大小。-Xms初始的Java堆的大小,该进程刚创建出来时它的专属Java堆大小。一旦对象容量超过Java堆的初始容量,Java堆将会自动扩容,扩容到-Xmx大小。-Xmx表示Java堆可以扩展到的最大值。
很多情况下通常将
-Xms和-Xmx设置成一样的,因为当heap不够用发生扩容时会发生内存抖动,影响程序运行时的稳定性。
Java内存模型中堆和栈的区别–内存分配策略
- 静态存储:是指在编译时就能够确定每个数据目标在运行时的存储空间需求,因而在编译时就可以给它们分配固定的内存空间。 这种分配策略要求程序代码中不允许有可变数据结构的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间。
- 栈式存储:栈式存储分配是动态存储分配,是由一个类似于堆栈的运行栈来实现的,和静态存储的分配方式相反。 在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到了运行的时候才能知道,但是规定在运行中进入一个程序模块的时候,必须知道该程序模块所需要的数据区的大小才能分配其内存。和我们在数据结构中所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。
- 堆式存储:堆式存储分配专门负责在编译时或运行时,无法确定存储要求的数据结构的内存分配。 比如可变长度串和对象实例,堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放。
看一个实例
不同JDK版本之间的intern
Redis
1、存储方式上:Memcache 会把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。Redis 有部分数据存在硬盘上,这样能保证数据的持久性。
2、数据支持类型上:Memcache 对数据类型的支持简单,只支持简单的 key-value,,而 Redis 支持五种数据类型。
3、使用底层模型不同:它们之间底层实现方式以及与客户端之间通信的应用协议不一样。Redis 直接自己构建了 VM 机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4、Value 的大小:Redis 可以达到 1GB,而 Memcache 只有 1MB。
多路I/O复用模型
FD:File Descriptor,文件描述符
一个打开的文件通过唯一的描述符进行引用,该描述符是打开文件的元数据到文件本身的映射;
传统的阻塞I/O模型:BIO
多路I/O复用模型 Select系统调用
Redis采用的I/O多路复用函数:epoll/kqueue/evport/select
从海量数据里查询某一固定前缀的key
keys patten 可能阻塞
如何使用Redis实现分布式锁
分布式锁需要解决的问题
互斥性
安全性
死锁
容错
使用 SETNX key value:如果不存在,则创建并赋值
如何实现异步队列
使用List作为队列,RPUSH生产消息,LPOP消费消息
缺点:没有等待队列里有值就直接消费
弥补:可以通过在应用层引入Sleep机制去调用LPOP重试
BLPOP key [key ...] timeout阻塞直到消息队列有消息或者超时
缺点:只能供一个消费者消费
pub/sub:主题订阅者模式
- 发送者(pub)发送消息,订阅者(sub)接收消息
- 订阅者可以订阅任意数量的频道
client1:subscribe myTopic
client2:subscribe myTopic
client3:subscribe anotherTopic
client1:publish myTopic "hello"
缺点
消息的发布是无状态的,无法保证可达。
持久化方式之RDB
RDB(快照)持久化:保存某个时间点的全量数据快照
redis.conf配置
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
# save "" 禁用rdb配置
rdbcompression yes # 将rdb文件压缩存储
src/dump.rdb文件
lastsave:查看上一次创建rdb文件时间
mv dump.rdb dumpxxxx(时间戳).rdb创建一个基于某个时间点的全量备份文件。
BGSAVE原理
AOF(Append-Only_File)持久化:保存写状态
RDB备份数据库状态,AOF记录下除了查询以外的所有变更数据库状态的指令。- 以
append的形式追加保存到AOF文件中(增量)
redis.conf
appendonly yes(默认no)
appendfilename "appendonly.aof"
appendfsync everysec(always、no) # 每次、每秒、交给操作系统
日志重写解决AOF文件大小不断增大的问题,原理如下:
Redis数据的恢复
RDB和AOF文件共存情况下的恢复流程
RDB-AOF混合持久化方式
BGSAVE做镜像全量持久化,AOF做增量持久化
Pipeline及主从同步
Pipeline和linux的管道相识Redis基于请求/响应模型,单个请求处理需要一一应答Pipeline批量执行指令,节省多次IO往返时间
Redis的同步机制
Redis Sentinel
流言协议Gossip
Redis的集群原理
如何从海量数据里快速找到所需?
分片:按照某种规则去划分数据,分散存储在多个节点上。
常规的按照哈希划分无法实现节点的动态增减
一致性哈希算法:对2^32取模,将哈希值空间组织成虚拟的圆环
计算机网络
OSI开放式互联参考模型
物理层
首先解决两台物理机之间的通信需求,具体就是机器A往机器B发送比特流,机器B能收到比特流。
主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。
主要作用是传输比特流(0101二进制数据),将比特流转化为电流强弱传输,到达目的后再转化为比特流,即常说的数模转化和模数转换。这层数据叫做比特。网卡工作在这层。
数据链路层
在传输比特流的过程中,会发生错传、数据传输不完整的可能,定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。
将物理层的比特数据封装成帧,交换机可以对帧解码,并根据帧中的信息把数据发送到正确的接收方,网络节点不断增加,点对点通信时要经过多个节点,如何找到目标节点、寻找最佳路径成为首要需求,便有了网络层。
它的主要功能是如何在不可靠的物理线路上进行数据的可靠传递。为了保证传输,从网络层接收到的数据被分割成特定的可被物理层传输的帧。帧是用来移动数据的结构包,它不仅包括原始数据,还包括发送方和接收方的物理地址以及检错和控制信息。其中的地址确定了帧将发送到何处,而纠错和控制信息则确保帧无差错到达。 如果在传送数据时,接收点检测到所传数据中有差错,就要通知发送方重发这一帧。
数据链路层(DataLinkLayer):在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路,通过差错控制提供数据帧(Frame)在信道上无差错的传输,并进行各电路上的动作系列。
数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。
网络层
其主要功能是将网络地址翻译成对应的物理地址,并决定如何将数据从发送方路由到接收方。 在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
网络层通过综合考虑发送优先权、网络拥塞程度、服务质量以及可选路由的花费来决定从一个网络中节点A 到另一个网络中节点B 的最佳路径。由于网络层处理,并智能指导数据传送,路由器连接网络各段,所以路由器属于网络层。在网络中,“路由”是基于编址方案、使用模式以及可达性来指引数据的发送。数据包
网络层负责在源机器和目标机器之间建立它们所使用的路由。这一层本身没有任何错误检测和修正机制,因此,网络层必须依赖于端端之间的由D L L提供的可靠传输服务。
传输层
随着网络通信需求的进一步扩大,通信过程中需要发送大量数据,如海量文件传输等可能需要很长时间,而网络在通信过程中可能会中断很多次,为了保证对传输大量文件的准确性,需要对数据进行切分为一个一个段落(sagement)进行发送;
传输协议同时进行流量控制或是基于接收方可接收数据的快慢程度规定适当的发送速率。除此之外,传输层按照网络能处理的最大尺寸将较长的数据包进行强制分割。例如,以太网无法接收大于1 5 0 0 字节的数据包。发送方节点的传输层将数据分割成较小的数据片,同时对每一数据片安排一序列号,以便数据到达接收方节点的传输层时,能以正确的顺序重组。该过程即被称为排序。现在保证给正确的计算机发送正确的封装过后的信息了,但用户级别体验(TCP找包,IP找路由)差,自动收发包、自动寻址的功能——会话层。
表示层
自动收发包,自动寻址。
会话层作用是建立和管理应用程序间的通信。
建立、管理、终止会话,对应主机进程,指本地主机与远程主机正在进行的会话。
表示层
Linux给WIndows发包,不同系统语法不一致,如exe不能在Linux下执行,shell不能在Windows不能直接运行。于是需要表示层。
解决不同系统之间通信语法问题,在表示层数据将按照网络能理解的方案进行格式化,格式化因所使用网络的不同而不同。
应用层
规定发送方和接收方必须使用一个固定长度的消息头,消息头必须使用某种固定的组成,消息头中必须记录消息体的长度等信息,方便接收方正确解析发送方发送的数据。应用层旨在更方便应用从网络中接收的数据,重点关注TCP/IP协议中的HTTP协议。
TCP
IP负责将每个包路由至目的地。IP协议没有确认包是否按顺序发送,或包是否被破环,因此IP数据包是不可靠的。需要它的上层协议做出控制。
传输控制协议TCP简介
- 面向连接的、可靠的、基于字节流的传输层通信协议
- 将应用层的数据流分割成报文段并发送给目标节点的TCP层
- 数据包都有序号,对方收到则发送ACK确认,未收到则重传
- 使用校验和来检验数据在传输过程中是否有误
应用层向TCP层发送数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元MTU的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认ACK;如果发送端实体在合理的往返时延RTT内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
TCP和UDP在发送报文时,所采用的方式完全不同。TCP不关心应用进程一次把多长的报文发送到TCP缓存中,而是根据对方给出的窗口值和当前网络拥塞来决定一个报文段应该包含多少字节;UDP发送的报文长度是应用进程决定的
如果应用进程传送到TCP缓存的数据块太长,TCP就可以把它划分短一些再传送。如果应用进程一次只发送一个字节,TCP也可以等待累积足够多字节后再传送
TCP下层网络提供的是不可靠的传输。因此:TCP必须采用适当的措施才能变得可靠
理想传输条件有两个特点:
- 传输信道不产生差错
- 不管发送方多快的发送数据,接收方总是来得及处理收到的数据
停止等待协议、连续ARQ协议、
TCP虽然是面向字节流的,但TCP传送的数据单元却是报文段 【首部+数据】
TCP报文头
端口:两个进程在计算机内部进行通信,有管道、内存共享、信号量、消息队列等方法。两个进程通信最基本的前提是唯一标识一个进程,通过唯一标识找到对应的进程。在本地进程通信中可以通过pid,但pid只在本地唯一。如果把两个进程放到两台计算机通信,pid实现不了。解决这个问题的方法就是在传输层使用协议端口号,简称端口。IP地址可以唯一标识主机,TCP协议和端口号可以唯一标识主机中的一个进程,利用IP地址+协议+端口号唯一标识去标识网络中的一个进程,这种唯一标识的模式称为Socket。
seq序号:占4字节,TCP连接中传送的字节流中的每个字节都按顺序编号。
ack确认号:4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。
数据偏移:TCP报文的首部长度
保留:保留今后使用的,被标为1。
URG紧急指针标志,为1表示紧急指针有效,为0忽略紧急指针。
ACK确认序号标志,为1表示确认号有效,为0表示报文不含确认信息,忽略确认号字段。上面的确认号是否有效就是通过该标识控制的。
PSHpush标志,为1表示带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将该报文段交给应用程序,而不是在缓冲区排队。
RST重置连接标志,重置因为主机崩溃或其他原因而出现错误的连接,或用于拒绝非法的报文段或非法的连接。
SYN同步序号,用于建立连接过程,在连接请求中SYN=1和ACK=0表示该数据段没有使用捎带的确认域,连接应答捎带一个确认即SYN=1和ACK=1。
FIN终止标志,用于释放连接,为1时表示发送方没有发送了。
窗口:滑动窗口大小,用来告知发送端接收端缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。
校验和:奇偶校验,此校验和是对整个的TCP报文段(包括TCP头部和TCP数据),以16位进行计算所得,由发送端计算和存储,接收端进行验证。
紧急指针:只有控制位中的URG为1时才有效。指出本报文段中的紧急数据的字节数。
选项:其长度可变,定义其他的可选参数。【最长可达40字节】,当没有使用选项时,TCP的首部长度是20字节。
最大报文长度MSS【Maximum Segment Size】:是每一个TCP报文段中的数据字段的最大长度
TCP三次握手
当应用程序希望通过TCP与另一个应用程序通信时,会发送一个通信请求,这个请求必须发送到一个确切的地址,双方握手之后,TCP建立一个全双工的通信(计算机A能给B发送信息,在发送信息的同时B也能给A回发信息。半双工通信:双向交替通信,即通信的双方都可以发送信息,但不能双方同时发送和接收),这个通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。握手即为TCP三次握手。
为何需要三次握手?重要考点
主要是为了初始化Sequence Number的初始值 通信的双方要互相通知对方 自己的初始化的Sequence Number,也就是上图中的x和y,这个号要作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输问题而乱序,即TCP会用这个序号来拼接数据。 因此,在服务器回发它的Sequence Number,即第二次握手之后,客户端还需要发送确认报文给服务器,告知服务器说“客户端已经收到你的初始化的Sequence Number。
TCP的四次挥手
为什么会有TIME_WAIT状态?为什么不直接为CLOSE状态?
1、确保有足够的时间让对方收到ACK包(被动关闭的一方没有收到ACK,会触发被动端重发FIN包,一来一回就是2MSL)
2、避免新旧连接混淆(有些路由器会缓存IP数据包,如果连接被重用,延迟收到的包有可能会跟新连接混在一起)
为什么需要四次挥手才能断开连接?重要考点
全双工的意思是允许数据在两个方向上同时传输, 因为TCP是全双工,发送方和接收方都需要FIN报文和ACK报文。即各自需要两次挥手,只不过有一方是被动的。 看上去就成了所谓的四次挥手。
服务器出现大量CLOASE_WAIT状态的原因
对方关闭socket连接,我方忙于读和写,没有及时关闭连接。
- 检查代码,特别是释放资源的代码
- 检查配置,特别是处理请求的线程配置
查看机器网络状况指令
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
TCP和UDP的区别
1、面向连接VS无连接 TCP面向连接,UDP面向无连接。TCP有三次握手的连接过程;UDP适合消息的多播发布,从单个点向多个点传输信息。
2、可靠性 TCP可靠,利用握手确认和重传机制提供可靠性保证;UDP可能丢失,不知道到底有没有接收。
3、有序性 TCP利用序列号保证消息报的顺序交付,到达可能无序,但TCP最终排序;UDP不具备有序性
4、速度 TCP速度慢,因为需要创建连接,保证消息的可靠性、有序性,需要做额外的操作;UDP更适合对速度比较敏感的应用,比如在线视频媒体、电视广播、多人在线游戏。
5、量级 TCP属于中级,UDP属于轻量级。体现在源数据的头大小,TCP是20个字节,UDP是8个字节。
TCP的滑窗
-
RTT:发送一个数据包到收到对应的ACK,所花费的时间 -
RTO:重传时间间隔(TCP在发送一个数据包后会启动一个重传定时器。RTO即定时器的重传时间) 开始预先算一个定时器时间,如果回复ACK,重传定时器就自动失效,即不需要重传;如果没有回复ACK,RTO定时器时间就到了,重传。RTO是本次发送当前数据包所预估的超时时间,RTO不是固定写死的配置,是经过RTT计算出来的。基于RTO便有了重传机制。 -
TCP使用滑动窗口做流量控制和乱序重拍
- 保证TCP的可靠性
- 保证TCP的流控特征
窗口数据的计算过程
TCP发送端缓存区四种状态:
1、已经发送并且得到端的回应的,即为受到确认ACK 2、已经发送但还没收到端的回应的 3、未发送但对端允许发送的 4、未发送且由于达到window的大小对端不允许发送的。
1.已接收并且已经发送 ACK 回执的数据 2.未接收但可以接收状态 -- 即在滑动窗口内 3.未接收且不能接收的状态 - 达到窗口阈值
ACK 直接由 TCP 回复,默认没有应用延迟,不存在已接收未回复 ACK 的状态
HTTP简介
主要特点
1、支持客户/服务器模式
2、简单快速:客户端向服务器请求服务时只需传送请求方法和路径
3、灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记
4、无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。 目前的技术如keep-alive使用长连接优化效率,但这些属于HTTP请求之外。
5、无状态:协议对事务处理没有记忆能力,如果后面状态需要前面信息,则需要重传
请求响应的步骤
1)客户端连接到web服务器: HTTP客户端通常是浏览器,与web服务器的HTTP端口(默认端口号80)建立TCP套接字连接。
2)发送HTTP请求: 通过TCP套接字客户端向web服务器发送文本请求报文。
3)服务器接受请求并返回HTTP响应: web服务器解析该请求定位请求资源,服务器将资源副本写入TCP套接字,由客户端读取。
4)释放TCP连接 若连接模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接。 若连接模式为Keep-Alive,则该连接会保持一段时间,在该时间内可以继续接收请求。
5)客户端浏览器解析HTML内容: 客户端浏览器首先解析状态行,查看表明请求是否成功的状态码,解析每个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML根据HTML语法对其进行格式化,并在浏览器窗口中显示。
在浏览器地址栏键入URL,按下回车之后经历的流程
1)DNS解析: 浏览器会依据URL逐层查询DNS服务器缓存,解析URL中的域名对应的IP地址,DNS缓存从近到远依次是浏览器缓存、系统缓存、路由器缓存、IPS服务器缓存、域名服务器缓存、顶级域名服务器缓存。从哪个缓存找到对应的IP直接返回,不再查询后面的缓存。
2)TCP连接: 结合三次握手
3)发送HTTP请求: 浏览器发出读取文件的HTTP请求,该请求发送给服务器
4)服务器处理请求并返回HTTP报文: 服务器对浏览器请求做出响应,把对应的带有HTML文本的HTTP响应报文发送给浏览器
5)浏览器解析渲染页面
6)连接结束: 浏览器释放TCP连接,该步骤即四次挥手。 注:第5步和第6步可以认为是同时发生的,哪一步在前没有特别的要求。
常见的HTTP状态码
1XX:指示信息,表示请求以接收,继续处理
2XX:成功,表示请求已经被成功接收、理解、接受。常见200
3XX:重定向,要完成请求必须进行进一步操作。常见303,304
4XX:客户端错误,请求由语法错误或请求无法实现。常见404,400,403
5XX:服务器错误,服务器未能实现合法的请求。常见500
200 OK:正常返回信息
400 Bad Request:客户端请求有语法错误,不能被服务器所理解。此时需要分析客户端的代码,去看看请求为什么出现服务器无法理解的错误。
401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。表示客户端没有权限去请求某些资源。
403 Forbidden:服务器收到请求但是拒绝提供服务。
404 Not Found:请求资源不存在,检擦URL或路径配置。
500 Internal Server Error:服务器发生不可预测的错误。检查服务器日志,看看里面的代码哪里错误,进而抛出异常。
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
GET请求和POST请求的区别
1、Http报文层面:GET将请求信息放在URL,POST放在报文体中。 GET请求信息与URL之间用?隔开,请求信息的格式为键值对。 POST想获得请求信息必须解析报文。GET中的请求信息放在URL中,长度有限制,浏览器会对URL的长度做出限制。POST请求对数据长度没有限制
2、数据库层面:GET符合幂等性和安全性,POST不符合。 幂等性:对数据库的一次操作和多次操作获得的结果是一致的。 安全性:对数据库的操作没有改变数据库中的数据。 GET操作一般是查询操作,不会改变数据库中原有的数据,大致认为符合安全性和幂等性。 POST请求既不幂等也不安全,POST请求会往数据库中提交数据,会改变数据库中的数据; POST请求每次获得的结果都有可能不一样,因为POST作用在上一级的URL,每一次请求都会添加一份新资源
3、其他层面:GET可以被缓存,被存储,而POST不行。 GET请求被保存在浏览器的浏览记录中,GET请求的URL能保存为浏览器书签; POST方式不具备上述功能,需要别web服务器处理。 缓存也是GET请求被广泛应用的根本,减少服务器的负担。 get很多被cdn缓存
Cookie和Session的区别
http是无状态的,引入c和s
Cookie简介: 1、是由服务器发送给客户端的特殊信息,以文本的形式存放在客户端。 2、客户端再次请求的时候,会将Cookie回发,即再次发给服务器 3、服务器接手后,会解析Cookie并生成与客户端相对应的内容,如登录
session简介:浏览器退出清空相关session,服务器端也删除
1、服务器端的机制,服务器采用类似散列表的结构来保存信息。 2、解析客户端请求,并操作session id,按需保存信息
Cookie和Session的区别
1)Cookie数据存放在客户的浏览器上,Session数据放在服务器上。
2)Session相对Cookie更安全
3)Session会在一定时间保存在服务器上,考虑到服务器性能的开销,应到使用Cookie
HTTP和HTTPS的区别
HTTPS超文本传输安全协议,以计算机网络安全通信为目的的传输协议。 在HTTP协议下加入了SSL层,从而具有了保护交换数据隐私和完整性,提供对网上服务器身份认证的功能。 简单来说就是安全版的HTTP。
SSL(Security Socket Layer)安全套接层
- 为网络通信提供安全及数据完整性的一种安全协议。
- 位于TCP和各应用层之间,是操作系统对外的API,SSL3.0以后更名为TLS
- 采用身份验证和数据加密保证网络通信的安全和数据的完整性。
加密的方式
对称加密:加密和解密都使用同一个密钥。
非对称加密:加密使用的密钥和解密使用的密钥是不相同的,分为称为公钥和私钥。公钥算法公开,私钥保密。非对称加密算法性能较低,安全性强,能加密的数据长度有限。区块链很多都用到非对称加密。
哈希算法:将任意长度的信息转换为固定长度的值,算法不可逆。如MD5算法。
数字签名:证明某个信息或者文件是某人发出认同的。签名即在信息的后面加上一段内容,内容经过HashCode值可以证明信息没有被修改过。
HTTPS采用证书配合各种加密手段的方式。
1、HTTPS协议是由SSL+HTTP协议构建的可进行加密传输身份认证的网络协议 2、因为SSL是有状态的,所以HTTPS有状态
HTTPS真的很安全吗
浏览器默认填充http://,请求需要进行调整,有被劫持的风险
可以使用HSTS(HTTP Strict Transport Security)优化