HTTP 是一个属于应用层的面向对象的协议,HTTP 协议一共有五大特点:
1、支持客户/服务器模式;2、简单快速;3、灵活;4、无连接;5、无状态。
客户/服务器模式, 请求/响应模式
客户向服务器请求服务时,只需传送请求方法和路径。
HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
无连接
TCP连接是否断开,HTTP/1.0之后的版本默认为持久连接
限制每次连接只处理一个请求。请求时建连接、请求完释放连接,以尽快将资源释放出来服务其他客户端。容量小时,可节省传输时间。容量大时,则会增加通信量的开销,使得传输效率降低。
只要任意一端没有明确提出断开连接,则保持TCP连接状态。在建立连接后可进行多次请求与响应
HTTP是一种不保存状态,即无状态协议,不对请求和响应之间的通信状态进行保存。HHTP协议的每个请求都是独立的,Keep-Alive 没能改变这个结果。
更快地处理更多事务,确保协议可伸缩性 | 没法保存客户机信息,阻碍了交互式应用程序的实现 |
减少服务器CPU及内存资源消耗 | 每次请求会传输大量重复的内容信息。 |
cookie机制采用的是在客户端保持状态的方案.
session机制采用的是在服务器端保持状态的方案,典型的场景比如购物车。Tomcat中将session叫jsession
包含用户信息和计算机浏览器信息,根据生命期不同分成两种:会话cookie和持久cookie;会话cookie保存在内存里,浏览器退出即消失。持久cookie为硬盘cookie,设置了过期时间,在过期时间内,存储在硬盘上的cookie可以在不同的浏览器进程间共享。
故根据硬件分类,又分为内存cookie和硬盘cookie,主要用于解决HTTP无状态、无法实现交互式web应用程序的问题,服务器读取cookie,维护用户和服务器会话的状态。Cookie具有不可跨域名性。
主要用途:会话状态管理、个性化设置、浏览器行为跟踪跨站点脚本攻击,cookie盗贼(搜集用户cookie)和cookie投毒(修改传入服务器的cookie)
第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session
ID,以后每次请求把这个会话ID发送到服务器。Session就是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过SessionID来区分不同的客户,Session是以Cookie或URL重写为基础的,默认使用Cookie来实现,系统会创造一个名为JSESSIONID的输出Cookie,我们叫Session
cookie
是存储于浏览器内存中的,并不是写到硬盘上的,即JSESSIONID,通常是看不到JSESSIONID的。
虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。cookie携带session
id后,到服务端session做验证。
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中
窃取途径:XSS(恶意代码)、CSRF(钓鱼网站),攻击防御
防窃取方案:cookie不存放敏感信息和用户不应知道的信息,只存放session id
客户端发生变化时,要求用户重新登录。例如使用User-Agent、IP地址、MAC地址等检测请求的一致性,并且加入Token进行检验。
更改SessionID名称。例如PHP中SessionID的默认名称是PHPSESSID,此变量会保存在Cookie中,如果攻击者不分析站点,就不能猜到SessionID的名称,阻挡部分攻击。加大SessionID的安全长度,加大暴力猜解难度。
为每一次请求生成新的SessionID,特别是登陆前后的 SessionID需要有所不相同,只接受服务器生成的SessionID。
设置会话超时属性,设定阈值强制会话过期。
HTTP/1.0
:多媒体处理,HTTP请求头支持多种请求;连接无法复用,请求分离,线头阻塞(请求无法响应,后面的请求被阻塞)。
HTTP/1.1
:可扩展性、缓存处理、带宽优化、持久连接、Host头、错误通知、消息传递、内容协商等。
2. 增加了请求头和响应头来扩充功能:
4. Host 域:一台物理?主机对应多个虚拟主机->共享?一个ip
HTTP/2.0
:把解决性能问题的方案内置在了传输层,添加二进制帧分层,通过多路复用来减少延迟,通过压缩 HTTP首部降低开销,同时增加请求优先级和服务器端推送的功能。
每个来源一个连接,多路复用允许同时通过单一的 HTTP 2.0 连接发起多重的请求-响应消息,即所有HTTP 2.0
连接都是持久化的,而且客户端与服务器之间也只需要一个连接即可,所有数据流共用同一个连接,减少了因http链接多而引起的网络拥塞(在 HTTP1.1
协议中,同一时间,浏览器会针对同一域名下的请求有一定数量限制),解决了慢启动针对突发性和短时性的http链接低效的问题。
流控制是一种阻止发送方向接收方发送大量数据的机制,以免超出后者的需求或处理能力。
2.将通信的基本单位缩小为帧
请求和响应复用:客户端和服务器可以将 HTTP
消息***为互不依赖的帧,然后交错发送,最后再在另一端把它们重新组装起来。
HTTP/2 支持DEFLATE和HPACK 算法的压缩,经过专门设计,可以解决发现的安全问题、实现起来也更高效和简单,可以对 HTTP
标头元数据进行良好压缩。(动态索引表)
客户端请求之前发送数据的机制,在 HTTP 2.0 中,服务器可以对客户端的一个请求发送多个响应,可推送额外的信息。
HTTP 2.0 使用一个31比特的优先值,0表示最高优先级,
2(31)-1表示最低优先级,服务器端就可以根据优先级,控制资源分配,优先处理和返回最高优先级的请求帧给客户端。
HTTP 2.0服务器推送不是诸如Server-Sent Events (SSE)或WebSocket的技术替代品。通过HTTP 2.0服务器推送传递过来的资源由浏览器来处理,但却不能上升到程序代码的层面 - 因为没有JavaScript API来获取这些事件的通知。不过,解决这个难题的方法却很简单,因为我们可以把一个SSE通道和服务器推送结合起来,使两者都达到最佳效果。通过HTTP 2.0,服务器有机会变得非常非常智能,包括如何优化传送一些具体的资源,更重要的是,也包括优化对整个应用的传送。类似的,浏览器可能增加额外的API和能力来使这个过程更加高效。
在HTTP/2中,在场景后面使用服务器推送来提高客户端从浏览器加载资源的能力。作为一个开发人员,你在开发过程中并不真正关心它。但是,使用WebSocket,开发人员可以使用API,该API能够使用唯一的全双工连接来使用和推送消息。
1 补充关系 二者侧重点不同。SPDY更侧重给Web页面的加载提速,而websocket更强调为web应用提供一种双向的通信机制以及API
2 竞争关系,二者解决的问题有交集,比如在服务器上推送上SPDY和Websocket都提供了方案
3 承载关系,SPDY若标准化早于websocket,则websocket完全可以侧重于API,利用SPDY的帧机制和多路复用机制实现该API
#每通过一层都进行一次封装
链路层 网络 → 网络 #网络架构 以太网首部
1.实际发生位置不同,地址栏不同
3.能够去往的URL的范围不一样
4.传递数据的类型不同
负载均衡技术、TCP连接复用(多个客户端的HTTP请求复用到一个服务器端TCP连接上)、HTTP复用(管道pipelining)、内容缓存、TCP缓冲(解决后端服务器网速与客户的前端网络速度不匹配而造成的服务器资源浪费的问题)、HTTP压缩(对客户端的响应请求进行压缩处理:gzip、compress、deflate、identity)、SSL加速。
报文首部+(CR+CF)+报文主体
请求行 首部字段 其他(如cookie等)
状态行 首部字段 其他(如cookie等)
GET - 请求来自指定资源的数据
POST - 将要处理的数据提交给指定的资源
POST请求永远不会被缓存 | |
GET请求保留在浏览器历史记录中 | POST不保留在浏览器历史记录中 |
POST请求不能加书签 | |
在处理敏感数据时绝不能使用GET请求 | POST请求对数据长度没有限制 |
GET请求只能用于检索数据 |
GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器。
POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。
PUT: 传输文件,报文主体中包含文件内容,保存到对应URI位置。
HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。
MOVE:请求服务器将指定页面移至另一台服务器。
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
200:请求被正常处理
204:请求被受理但没有资源可以返回
206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源。
3xx:重定向--要完成请求必须进行更进一步的操作
303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上
304:发送附带条件的请求时,条件不满足时返回,与重定向无关
307:临时重定向,与302类似,只是强制要求使用POST方法
4xx:客户端错误--请求有语法错误或请求无法实现
400:请求报文语法有误,服务器无法识别
403:请求的对应资源禁止被访问
404:服务器无法找到对应资源
5xx:服务器端错误--服务器未能实现合法的请求
500:服务器内部错误
502:错误网关,作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。,
503:临时的服务器维护或者过载,服务器当前无法处理请求
a、通用首部字段
(请求报文与响应报文都会使用的首部字段)
Date:创建报文时间
b、请求首部字段
(请求报文会使用的首部字段)
Host:请求资源所在服务器
Accept:可处理的媒体类型
c、响应首部字段
(响应报文会使用的首部字段)
d、实体首部字段
(请求报文与响应报文的的实体部分使用的首部字段)
Content-Range:实体主体的位置范围,一般用于发出部分请求时使用
1 通信使用明文(不加密)可能被窃听
2 不验证通信方身份 有可能遭遇伪装
3 无法证明报文完整性 有可能已遭篡改
HTTPS=HTTP+加密处理(一般是SSL安全通信线路)+认证+完整性保护
1 HTTPS协议需要申请到ca***,一般免费***较少,因而需要一定费用。
2 HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的ssl加密传输协议。
3 HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4 HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全
-> 客户端向服务端发送请求
-> 服务端返回数字***(hash(服务器身份和公钥)-->信息摘要-->CA私钥加密信息摘要-->数字签名;数字签名+原始信息=数字***)
-> 客户端用自己的CA[主流的CA机构***一般都内置在各个主流浏览器中]公钥去解密***,验证信息摘要,如果***有问题会提示风险
-> 如果***没问题客户端会生成一个对称加密的随机秘钥然后再和刚刚解密的服务器端的公钥对数据进行加密,然后发送给服务器端
-> 服务器端收到以后会用自己的私钥对客户端发来的对称秘钥进行解密
-> 之后双方就拿着这个对称加密秘钥来进行正常的通信
SSL 慢:处理通信量增加,通信慢;处理速度慢,SSL必须进行加密处理,消耗了大量的CPU及内存资源,负载增强
SSL解决方案:使用SSL加速器(专用服务器)
SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
1)认证用户和服务器,确保数据发送到正确的客户机和服务器;
2)加密数据以防止数据中途被窃取;
3)维护数据的完整性,确保数据在传输过程中不被改变。
安全传输层协议 :TLS记录协议是一种分层协议。每一层中的信息可能包含长度、描述和内容等字段。记录协议支持信息传输、将数据分段到可处理块、压缩数据、应用MAC
、加密以及传输结果等。对接收到的数据进行解密、校验、解压缩、重组等,然后将它们传送到高层客户机。TLS连接状态指的是TLS记录协议的操作环境。它规定了压缩算法、加密算法和MAC算法。TLS记录层从高层接收任意大小无空块的连续数据。密钥计算:记录协议通过算法从握手协议提供的安全参数中产生密钥、 IV 和MAC密钥。
TLS 握手协议由三个子协议组构成,允许对等双方在记录层的安全参数上达成一致、自我认证、例示协商安全参数、互相报告出错条件。
TLS的主要目标是使SSL更安全,并使协议的规范更精确和完善。TLS 在SSL v3.0 的基础上,提供了以下增强内容:
1)更安全的MAC算法
3)“灰色区域”规范的更明确的定义
TLS对于安全性的改进
1)对于消息认证使用密钥散列法:TLS 使用“消息认证代码的密钥散列法”(HMAC),当记录在开放的网络(如因特网)上传送时,该代码确保记录不会被变更。SSLv3.0还提供键控消息认证,但HMAC比SSLv3.0使用的(消息认证代码)MAC 功能更安全。
2)增强的伪随机功能(PRF):PRF生成密钥数据。在TLS中,HMAC定义PRF。PRF使用两种散列算法保证其安全性。如果任一算法暴露了,只要第二种算法未暴露,则数据仍然是安全的。
3)改进的已完成消息验证:TLS和SSLv3.0都对两个端点提供已完成的消息,该消息认证交换的消息没有被变更。然而,TLS将此已完成消息基于PRF和HMAC值之上,这也比SSLv3.0更安全。
4)一致***处理:与SSLv3.0不同,TLS试图指定必须在TLS之间实现交换的***类型。
5)特定警报消息:TLS提供更多的特定和附加警报,以指示任一会话端点检测到的问题。TLS还对何时应该发送某些警报进行记录。
详见白帽子讲Web安全
今日早间,戴尔科技集团正式公布其2019年财年Q2季度财报,报告显示:戴尔2019财年第二季度收入为229亿...
近日,浪潮商用机器与第四范式联手推出了一款名为“Prophet AIO”的AI软硬件一体机,希望以此来打造端...
近日,据Fast Company报道,挪威Lyseparken镇正在尝试利用社区的新数据中心产生的多余热量为居民和企业...
近日,据外媒报道,数据中心服务提供商Digital Realty公司继此前在德克萨斯州加兰市购置16英亩土地建设...
没错,你没看错,微软确实将数据中心变成了"海底捞",但此刻请不要脑补排队两小时,吃上两小时的某知名...
CPU这一名词对大家来说并不陌生,其中文名称叫中央处理器,在物理结构上,CPU主要包括运算逻辑部件、寄...
近日,恒大集团与中国科学院在北京举行首批合作项目签约仪式,此次签约合作项目共计6个,涉及人工智能...
十八年前,我拿着大哥大期望到山区也能接收到信号;十年前,我希望上网刷图片能不卡;八年前,我希望在...
销售手里还有堆积如山的Excel没做,文案还攒着几篇文章没写,策划的PPT已经开始推到下个月……中关村创...
云计算、大数据和人工智能时代来了,这是近五年来各个国家、企业、IT部门叫嚣的事情,这也确实成为现在...
7月18日,紫光旗下新华三集团(以下简称“新华三”)与杭州剑齿虎信息技术有限公司(以下简称“杭州剑...
“双通”并购案、中兴门等事件的爆发,都在为服务器产业发展走向加上注脚;在x86硬件同质化背景下,云...
北京,2018年7月10日——在今日召开的紫光旗下新华三集团(以下简称新华三)“融绘数字未来——2018新...
你一般会选择什么样的交通工具出行?公交?打车?还是地铁?公交比较笨重,但是安全系数更高;打车具备...
当人们走过荆棘、河流时,总希望有个先行者能完成了搭桥开路的工作。如今,当企业面临数字化转型问题是...
随着应用程序的不断增长,内存被迫承担着更大压力。目前不管是服务器还是PC领域,DDR4内存技术依旧是主...
近日,2018年世界移动大会-上海(以下简称“MWC上海”)在上海新国际博览中心落下帷幕。作为数字化解决方...
在未来科技发展路途中,开源一定扮演了重要的角色。这个在闭源后兴起的技术理念,正在更积极的影响着科...
数字化转型大潮的来临,为企业带来了全新发展机遇。在世界移动大会-上海(以下简称“2018 MWCS”)期间...
当“三高”这一名词出现在视野时,相信大家和笔者一样,第一反应就是“高血脂、高血压、高血糖”。如今...
数字化转型,物联网先行。在世界移动大会-上海(以下简称“2018 MWCS”)的“物联网峰会”上,紫光旗下新...
服务器过去半年间发生了四大变化,使传统数据中心在管理方式和智能运维方面发生改变;超融合设备在私有...
人工智能毫无疑问是当前最热的商业话题之一,从上层的语音识别、翻译及机器学习,到Python等适用于深度...
企业的快速发展,自然离不开全体员工的精诚协作,但千万别忘了,还有一位昼夜不停、默默服务的无声英雄...
技术的发展让企业的数字边界不断拓宽,数据安全开始不存在内外部之分,不再存在边界过程中,长期的安全...
服务器术语里,大家经常会听到1U、2U,单路、双路,机架式、塔式及刀片式等常用名词。其中,机架式、塔...
A同事:哎,你们有没有英特尔至强处理器借我玩一玩,我这儿要做个芯片横评。笔者:印象中不是第一次来...
作为新兴的应用领域,深度学习(DeepLearning)是近年来机器学习的热点。GPU服务器凭借出色的图形处理...
不甘于在原有范围影响技术和世界的开源,在数据中心、公有云、私有云场景下,用户根据需求编制系统软件...
一年的时间能够做些什么?对于个人和企业来说,一年的时间有什么不同;对于一个产品而言,一年的时间能...
版权声明:本文为博主原创文章,未经博主允许不得转载。 /canot/article/details/
前几天在面试阿里的时候面试官问这么一个问题:
在Nginx+Tomcat的负载均衡场景中,如果某台服务器意外宕机的时候,Nginx对于将要分发到这台服务器的处理策略是怎么样的?
笔者当时这个问题没有回答后,面试介绍后马上做了实验并查询了相关的Nginx的负载均衡的配置项。
这个比较简单,负载均衡算法指定为轮循法,Tomcat为了启动方便使用Spring Boot内嵌的Tomcat。
上述的Nginx配置完成了一个最简单的配置,没有任何附加参数。
关于Nginx日志的配置简单描述一下:
- $
msec
日志写入时间。单位为秒,精度是毫秒。- $
request_length
请求的长度(包括请求行,请求头和请求正文)。- $
request_time
请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。- $
time_local
通用日志格式下的本地时间。
如果未获取到,则日志输出为-
浏览器上请求127.0.0.1/set。当返回为Two!Yes的时候,表示会造成内存溢出的线程已经开始运行。(如果返回的不是,则继续请求,直到返回Two!Yes)
此时继续请求127.0.0.1/set,你会发现最后请求都会返回One!Yes+时间,但你会发现有的请求发送之后要整整1分钟左右才响应One!Yes+时间。
这个1分钟时间便是请求被nginx的负载均衡算法分配到此时内存溢出的二号机上,而该机无法处理,nginx等待了1分钟后便把请求转发给了其他机器
从Nginx的日志中也能看到这一点:
因此在默认的情况下,nginx在前一次尝试连接9090端口失败后,在10秒之后才会再次去尝试。
proxy_connect_timeout
后端服务器连接的超时时间_发起握手等候响应超时时间(默认为60s)
proxy_read_timeout
连接成功后等候后端服务器响应时间其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)(默认为60s)
而9090端口的tomcat在内存溢出的情况下,仍然能够与nginx完成握手,但是却不能处理结果,所以等待的一分钟时间是耗费在proxy_read_timeout了.如果能设置一个合适的值,就可以在可接受的时间范围内,完成集群的故障迁移。
修改proxy_read_timeout为10s
继续重复上述的测试过程,发现次数延迟只有10s