《图解HTTP》学习笔记

第一章 了解web及网络基础

TCP IP协议的分层管理?
应用层:决定向用户提供应用服务时通信的活动,HTTP NDS协议
传输层:提供处于网络链接中的两台计算机直接的数据传输,TCP UDP协议
网络层:处理在网络上流动的数据包,数据包是网络传输的最小数据单位;该层规定了通过怎样的传输路线将数据包送达对方的计算机;IP协议
链路层:用来处理链接网络的硬件部分,如网卡光纤等;

TCP IP DNS 的理解?
TCP协议:为方便传输,将大块数据分割成报文段为单位的数据包,为准确无误的将数据送达目的地,TCP协议采用了三次握手和四次挥手;

什么是三次握手?
三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。第一次客户端将标有SYN的数据包发送给服务器,第二次服务器收到后回传一个带SYN/ACK标志的数据报以确认信息,最后客户端再回传一个带ACK的数据包,握手完成;

为什么要握手三?
需要三次握手才能确认双方的接收与发送能力是否正常。

只握手两次会怎样?
如果服务端的回应有延迟,客户端再次发送,服务端再次建立连接,客户端发送不必要的请求,而客户端第一次建立的连接并没有发送数据,服务端等待,浪费资源;

三次握手过程中可以携带数据吗?
第一次、第二次握手不可以携带数据,会让服务器更加容易受到攻击(攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文)第三次可以传;

SYN攻击是什么?
SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。

什么是四次挥手?
TCP 的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),客户端或服务器均可主动发起挥手动作。
主动发起关闭请求方发送一个FIN报文,对方收到后回传ACK报文,确认需要关闭时再传一个FIN报文,最后请求关闭的一方发送ACK报文再断开连接;

为什么要四次?
关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。
四次挥手释放连接时,需要经过2MSL才能返回到CLOSE状态,等待2MSL的意义?
保证客户端发送的最后一个ACK报文段能够到达服务端。可能网络是不可靠的,有可能最后一个ACK丢失
IP 协议:作用是将数据包准确的准送给对方,满足的重要条件是IP地址和MAC地址,MAC地址是网卡所属的固定地址,基本不会改变;双方在同一局域网的情况是很少的,通过经过多台计算机和网络设备的中转,才能连接;
DNS解析:提供域名到IP地址之间的解析服务;

从发送请求到返回发生了什么?
首先用户输入地址,使用DNS域名解析对应的IP地址,通过HTTP协议生成针对目标服务器的请求报文;TCP协议为了方便通信将请求报文分割成不同的文本端,按序号可靠的传给对方;IP协议拼接ARP协议根据对方的ip地址查出对方的MAC地址并传输;服务器收到请求报文端按序号重组并将返回的结果以同样的方式回传;

URL URI?
URI是用字符串标识某一互联网资源,URL是表示资源的地址,前者包含后者;
Url组成部分
协议 域名 端口号 虚拟目录从第一个/到最后一个/ 文件名部分 参数部分

TCP与UDP区别?
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

浏览器从输入URL到渲染完页面的整个过程
第一步 (解析url) => 会根据域名去找服务器ip地址,先在浏览器缓存中找,然后去本地的host,然后去DNS解析器缓存中查找,然后去根服务器发起请求获得顶级域名服务器请求的地址,顶级域名服务器再获得权威域名服务器地址然后发送请求。
作用: 将域名解析为IP地址,客户端向DNS服务器(DNS服务器有自己的IP地址)发送域名查询请求,DNS服务器告知客户机Web服务器的 IP 地址。
第二步 => 获取MAC地址: 当浏览器得到 IP 地址后,数据传输还需要知道目的主机 MAC 地址,通过 ARP 协议来获取目的机器的 MAC 地址。当通信的双方不在同一个局域网时,需要多次中转才能到达最终的目标,在中转的过程中需要通过下一个中转站的MAC地址来搜索下一个中转目标。
第三步=> 找到了之后就tcp三次握手,第一次客户端向服务器发送请求,第二次服务器响应,第三次客户端向服务器发送确认信号
第四步 => 浏览器就开始发送http请求了,包括请求头和请求体,如果是get请求会把浏览器header和data一起发送出去,产生两个数据包,如果是post请求,浏览器先发送一个header,服务器响应100 contine,然后再发送data
如果请求的是静态资源,服务器查找对应路径的文件返回,如果是动态资源那么需要查询数据库的操作再返回给浏览器
第五步 => 浏览器首先会根据 html 文件构建 DOM 树,根据解析到的 css 文件构建 CSSOM 树,如果遇到 script 标签,则判端是否含有 defer 或者 async 属性,有的话就下载脚本,继续解析文档;没有defer和async 的话浏览器会立即解析脚本,停止解析文档(可能造成页面的渲染的阻塞)脚本解析会将脚本中改变的DOM和CSS的地方分别解析出来,追加到DOM Tree和Style Rules上。
当 DOM 树和 CSSOM 树建立好后,根据它们来构建渲染树。渲染树构建好后,会根据渲染树来进行布局。布局完成后,系统会遍历呈现树,并调用呈现器的“paint”方法,将呈现器的内容显示在屏幕上。
第六步 => 客户端没有请求需要发送,四次挥手与服务器断开连接

第二章 简单的http协议

http的特点?
无状态:http是无状态的,不保存之前的请求和响应报文信息;
持久连接:在早期的版本中,每次请求只有断开后才能发送下一个请求,当页面资源较多时会造成无谓的连接建立和断开;在1.1版本中提出了keep-alive持久化连接,只有一方明确提出断开才会断开;减少了重复连接和断开所造成的额外开销,减轻了服务器的负载,web页面响应速度更快;
管线化:以前发送请求后需要等待收到响应才可以发送一下请求,管线化出现后可以并发多个请求不需要等待;
cookie状态管理: 为保留状态,服务端在报文中写入set-Cookie 来设置cookie,客户端将返回的cookie保存并且在以后的请求中都岛上cookie

对keep-alive的理解
HTTP1.0 中默认是在每次请求/应答,客户端和服务器都要新建一个连接,完成之后立即断开连接,这就是短连接。当使用Keep-Alive模式时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接,这就是长连接。其使用方法如下:

HTTP1.0版本是默认没有Keep-alive的(也就是默认会发送keep-alive),所以要想连接得到保持,必须手动配置发送Connection: keep-alive字段。若想断开keep-alive连接,需发送Connection:close字段;
HTTP1.1规定了默认保持长连接,数据传输完成了保持TCP连接不断开,等待在同域名下继续用这个通道传输数据。如果需要关闭,需要客户端发送Connection:close首部字段。

Keep-Alive的建立过程:

客户端向服务器在发送请求报文同时在首部添加发送Connection字段
服务器收到请求并处理 Connection字段
服务器回送Connection:Keep-Alive字段给客户端
客户端接收到Connection字段
Keep-Alive连接建立成功

服务端自动断开过程(也就是没有keep-alive):

客户端向服务器只是发送内容报文(不包含Connection字段)
服务器收到请求并处理
服务器返回客户端请求的资源并关闭连接
客户端接收资源,发现没有Connection字段,断开连接

客户端请求断开连接过程:

客户端向服务器发送Connection:close字段
服务器收到请求并处理connection字段
服务器回送响应资源并断开连接
客户端接收资源并断开连接

开启Keep-Alive的优点:

较少的CPU和内存的使⽤(由于同时打开的连接的减少了);
允许请求和应答的HTTP管线化;
降低拥塞控制 (TCP连接减少了);
减少了后续请求的延迟(⽆需再进⾏握⼿);
报告错误⽆需关闭TCP连;

开启Keep-Alive的缺点:

长时间的Tcp连接容易导致系统资源无效占用,浪费系统资源。

请求方法?
GET 获取资源
POST 传输实体主体
PUT 传输文件
HEAD 获得报文首部
DELETE 删除文件
TRACE 追踪路径
OPTIONS 询问支持的方法

GET和POST的区别?
GET和POST本质上就是TCP链接,并无差别。
①get参数会放在url上;post参数放在请求体里面
②在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。但是在实际开发过程中,对于GET,特定的浏览器和服务器对URL的长度有限制。因此,在使用GET请求时,传输数据会受到URL长度的限制。
对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置。
③post比get更安全
④get一般用于查找,浏览器会对get请求缓存,post一般用于新增和修改,必须和数据库交互,一般不使用缓存。
⑤GET产生一个TCP数据包;POST产生两个TCP数据包。

POST和PUT请求的区别

PUT请求是向服务器端发送数据,从而修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同。(可以理解为时更新数据)
POST请求是向服务器端发送数据,该请求会改变数据的种类等资源,它会创建新的内容。(可以理解为是创建数)

HTTP协议 的有点和缺点?
HTTP协议具有以下优点:
①支持客户端/服务器模式
②简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。
③无连接:无连接就是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间。
④无状态:HTTP 协议是无状态协议,这里的状态是指通信过程的上下文信息。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能会导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就比较快。
⑤灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记。

HTTP协议具有以下缺点:
无状态: HTTP 是一个无状态的协议,HTTP 服务器不会保存关于客户的任何信息。
明文传输: 协议中的报文使用的是文本形式,这就直接暴露给外界,不安全。
(1)通信使用明文(不加密内容可能会被窃听;
(2)不验证通信方的身份因此有可能遭遇伪;
(3)无法证明报文的完整性有可能已遭篡改;

http和https的区别?
http: 超文本传输协议,是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
https: 是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
简单来说https协议是由http和ssl协议构建的可进行加密传输和身份认证的网络协议,比http协议的安全性更高。
①Https协议需要SSL证书,费用较高。
②http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
③使用不同的链接方式,端口也不同,一般而言,http协议的端口为80,https的端口为443
④http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

https协议的工作原理
客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤,如图所示。
①客户使用https url访问服务器,则要求web 服务器建立ssl链接。
②web服务器接收到客户端的请求之后,会将网站的证书(证书中包含了公钥),返回或者说传输给客户端。
③客户端和web服务器端开始协商SSL链接的安全等级,也就是加密等级。客户端浏览器通过双方协商一致的安全等级,建立会话密钥,然后通过网站的公钥来加密会话密钥,并传送给网站。
④web服务器通过自己的私钥解密出会话密钥;web服务器通过会话密钥加密与客户端之间的通信。

https协议的优缺点
缺点
①https握手阶段比较费时,会使页面加载时间延长50%,增加10%~20%的耗电。
②https缓存不如http高效,会增加数据开销。
③SSL证书也需要钱,功能越强大的证书费用越高。
④SSL证书需要绑定IP,不能再同一个ip上绑定多个域名,ipv4资源支持不了这种消耗。
优点:
①使用HTTPS协议可以认证用户和服务器,确保数据发送到正确的客户端和服务器;
②使用HTTPS协议可以进行加密传输、身份认证,通信更加安全,防止数据在传输过程中被窃取、修改,确保数据安全性;
③HTTPS是现行架构下最安全的解决方案,虽然不是绝对的安全,但是大幅增加了中间人攻击的成本;

第三章 HTTP报文内的信息

报文分请求报文和响应报文,由报文首部和报文主体组成;
请求报文首部由请求行(方法,地址,版本),请求首部字段,通用首部字段,实体首部字段等组成;
响应报文首部由状态行(状态码和原因短语),响应首部字段,通用首部字段,实体首部字段等组成;
报文和实体的区别?
通常报文就是实体,只有传输中进行编码操作,实体的内容由变化,才不一样;

第四章 返回结果的状态码

状态码的类别?
1xx 信息状态码,接收的请求正在处理
2xx 成功状态码 ,请求处理完成
3xx 重定向状态码,需要附加操作完成请求
4xx 客户端错误,服务器无法处理请求
5xx 服务端错误,服务器处理请求出错

常见状态码?
200 请求成功
204请求成功,但响应报文中不含实体主体;
206 返回了范围请求
301 资源永久移动
302 资源临时移动
304 使用缓存
400 请求报文中存在语法错误
401 需要认证
403 服务器理解请求客户端的请求,但是拒绝执行此请求
404 找不到资源
500 服务器内部错误
503 服务器正在停机维护
100 Continue 继续。客户端应继续其请求
101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
200 OK 请求成功。一般用于GET与POST请求
201 Created 已创建。成功请求并创建了新的资源
202 Accepted 已接受。已经接受请求,但未处理完成
203 Non-Authoritative Information 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206 Partial Content 部分内容。服务器成功处理了部分GET请求
300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303 See Other 查看其它地址。与301类似。使用GET和POST请求查看
304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305 Use Proxy 使用代理。所请求的资源必须通过代理访问
306 Unused 已经被废弃的HTTP状态码
307 Temporary Redirect 临时重定向。与302类似。使用GET请求重定向
400 Bad Request 客户端请求的语法错误,服务器无法理解
401 Unauthorized 请求要求用户的身份认证
402 Payment Required 保留,将来使用
403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
405 Method Not Allowed 客户端请求中的方法被禁止
406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求
407 Proxy Authentication Required 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408 Request Time-out 服务器等待客户端发送的请求时间过长,超时
409 Conflict 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
410 Gone 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411 Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息
412 Precondition Failed 客户端请求信息的先决条件错误
413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414 Request-URI Too Large 请求的URI过长(URI通常为网址),服务器无法处理
415 Unsupported Media Type 服务器无法处理请求附带的媒体格式
416 Requested range not satisfiable 客户端请求的范围无效
417 Expectation Failed 服务器无法满足Expect的请求头信息
500 Internal Server Error 服务器内部错误,无法完成请求
501 Not Implemented 服务器不支持请求的功能,无法完成请求
502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求
505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理

第五章 web服务器

如何用一个主机实现多个域名?
虚拟主机
通信数据的转发?
代理:接收请求后转发给服务器,不改变请求uri,转发时,附加via首部字段标记经过的主机信息,代理服务器可以使用缓存技术;
网关:和代理类似,网关能使通信的服务器提供非http协议服务,提高通信的安全性;
隧道:可以建立一个和远距离服务器的通信线路,使用ssl等加密手段进行通信;

第六章 http首部

首部字段的分类:通用首部、请求首部、响应首部、实体首部
通用首部字段:
Cache-Control 控制缓存的行为 Cache-Control: no-cache
Connection 浏览器优先使用的连接类型 Connection: keep-alive
Connection: Uprade
Date 报文创建日期时间 Date: Sat, 19 Sep 2020 06:13:42 GMT
Pragma 另一种报文指令,但不专用于缓存 Pragme: no-cache
Trailer 报文采用了分块传输编码(chunked transfer encoding)方式 Trailer: Max-Forwards
Transfer-Encoding 报文的传输编码方式:chunked、compress、deflate、gzip 和 identity Transfer-Encoding: chunked
Upgrade 要求升级为另一个协议 Upgrade: HTTP/2.0, STTP/1.3, IRC/6.9, RTA/x11
Via 代理服务器相关信息,告知请求代理是哪个 Via: 1.0 fred, 1.1 example.com (Apace/1.1)
Warning 一般性错误警告,告知内容中哪里可能存在错误
请求首部:
首部字段名 说明 例子
Accept 告知服务器能发送哪些媒体类型 Accept: application/json, text/javascript, /; q=0.01
Accept-Charset 告知服务器能发送哪些字符集 Accept-Charset: utf-8
Accept-Encoding 告知服务器能发送哪些编码方式 Accept-Encoding: gzip, deflate
Accept-Language 告知服务器能发送哪些语言 Accept-Language: en-GB,en-US;q=0.9,en;q=0.8,zh-CN;q=0.7,zh;q=0.6
Authorization 提供信息给服务器对其身份认证 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Expect 要求服务器对某请求需要做出的行为 Expect: 100-continue
From 提供客户端 E-mail 地址 From: test@test.com
Host 提供接受请求的服务器主机号和端口号(如果是标准端口即可忽略) Host: test.test.com
Host: test.test.com:1111
If-Match 字段值与服务器特定资源标记值(ETag)匹配才处理请求 If-Match: “123456”
If-Modified-Since 确认本地资源是否有效,如果有更新就处理请求,否则响应返回 304 Not Modified If-Modified-Since: Sat, 19 Sep 2020 06:13:28 GMT
If-None-Match 与 If-Match 相反,不匹配才处理请求 If-None-Match: “123”
If-Range 对资源的某个范围请求 If-Range: “737060cd8c284d8af7ad3082f209582d”
If-Unmodified-Since 与 If-Modified-Since 相反,未发生更新才处理请求。如果有更新,则响应返回状态码 412 Precondition Failed If-Unmodified-Since: Sat, 19 Sep 2020 06:13:28 GMT
Max-Forwards 限制代理或网关转发次数 Max-Forwards: 5
Proxy-Authorization 提供信息给服务器对代理进行身份认证 Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range 获取部分资源 Range: bytes=500-999
Referer 当前文档的 URL Referer: https://www.baidu.com/
TE 告知服务器可以使用哪些扩展传输编码 TE: trailers, deflate
User-Agent 发出请求的应用程序名称 User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36…

响应首部:
首部字段名 说明 例子
Accept-Ranges 服务器可接受的资源请求范围类型 Accept-Ranges: bytes
Age 资源在代理缓存中存在的时间,单位为秒 Age: 20
ETag 将资源以字符串形式作唯一性标识 ETag: “test”
Location 引导客户端访问另一个 URL,通常配合 3xx 响应,提供重定向 URL Location: http://www.baidu.com/test.html
Proxy-Authenticate 把代理服务器所要求的认证消息发给客户端 Proxy-Authenticate: Basic realm=“Auth”
Retry-After 告知客户端多久(具体日期或秒数)后再发送请求,主要配合状态码 503 Service Unavailable 或 3xx Redirect 响应 Retry-After: 120
Retry-After: Sat, 19 Sep 2020 06:13:28 GMT
Server 告知客户端当前服务器安装的应用程序信息 Server: Apache/2.4.38 (Uos)
Vary 列出所有客户端请求首部,服务器根据这些首部选择文档或产生定制内容。如所提供的文档取决于 User-Agent,那么 Vary 首部必须含有 User-Agent Vary: User-Agent
WWW-Authenticate 告知客户端请求是使用的认证模式(Basic 或 Digest) WWW-Authenticate: Basic

实体首部:
首部字段名 说明 例子
Allow 告知客户端对特定资源能使用的 HTTP 方法。但服务器收到不支持的方法请求时,会返回状态码 405 Method Not Allow. Allow: GET, HEAD
Content-Encoding 用于对特定媒体类型的数据进行压缩。告知客户端要用的解压方式:gzip, compress, deflate, identity, br Content-Encoding: gzip
Content-Language 内容所使用的语言 Content-Language: zh-CN
Content-Length 响应消息体长度,单位为字节(8 位/字节) Content-Length: 15000
Content-Location 报文主体返回资源所对应的 URL(相对/绝对地址). Location 是返回重定义 URL Content-Location: /index.html
Content-Range 数据片段在整个文件中的位置 Content-Range: bytes 200-1000/67589
Content-Type 资源的 MIME 类型 Content-Type: text/html; charset=utf-8
Expires 指定日期/时间,超过即表示已过期。如果 Cache-Control 设置了 max-age 和 s-max-age,那么 Expires 会被忽略 Expires: Mon, 21 Sep 2020 02:16:21 GMT
Last-Modified 该实体最后修改时间 Last-Modified: Mon, 21 Sep 2020 02:16:21 GMT

第七章 确保安全的https

http的缺点?
明文传输,内容可能被窃听,不安全
不验证通信方的身份,因此有可能遭遇伪装
无法证明报文的完整性,可能被篡改
http+加密+认证 = https = http+SSL/TLS
共享密钥?
加密解密使用相同的密钥,当密钥被他人窃取
公开密钥?
一把非对称密钥,私有密钥和公开密钥;服务端可以把公开密钥交给任何人,客户端利用公开密钥加密,服务端使用私钥解密;
问题:无法保证收到的公开密钥没有被攻击者替换
解决:SSL证书。服务器需要申请由数字证书认证机构颁发,客户端收到证书,向认证机构验证公钥上的数字签名确保服务器公钥的真实性;

第八章 确认访问用户身份的认证

http使用的认证方式?
基本认证(将用户名和密码base64编码后发送)、摘要认证(服务器随机发送质询码客户端计算响应码)、客户端认证(SSL证书)、表单认证(服务端根据用户的登录信息发送sessionID并且绑定记录在服务器端,客户端用cookie存入,并携带;实际使用中多为表单认证(用cookie来管理session),还有token(动态令牌,一次性密码)
cookie和 session的区别?
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)
Cookie并不提供修改、删除操作。如果要修改某个Cookie,只需要新建一个同名的Cookie,添加到response中覆盖原来的Cookie。
如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0
Cookie是不可跨域名的。域名www.google.com颁发的Cookie不会被提交到域名www.baidu.com去
domain属性决定运行访问Cookie的域名,而path属性决定允许访问Cookie的路径(ContextPath)。
cookie.setPath(“/session/”);
response.addCookie(cookie);
cookie.setSecure(true);

Session对象是在客户端第一次请求服务器的时候创建的。Session也是一种key-value的属性对,通过getAttribute(Stringkey)和setAttribute(String key,Objectvalue)方法读写客户状态信息。Servlet里通过request.getSession()方法获取该客户的Session,
主要区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上.
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
3、设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。
4、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。
5、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。(Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)
更多: https://www.cnblogs.com/l199616j/p/11195667.html

cookie,localStorage,sessionStorage的区别
共同点:三者都是浏览器的本地存储。
区别:
①存储位置:cookie是由服务器端写入的,而SessionStorage、LocalStorage都是由前端写入的;
②存储大小:cookie的存储空间比较小,大概4KB,而SessionStorage、LocalStorage存储空间比较大,大概5M;
③生命周期:cookie的生命周期是由服务器端在写入的时候就设置好的,SessionStorage是页面关闭的时候就会自动清除,LocalStorage是写入就一直存在,除非手动清除;
④数据共享:三者的数据共享都遵循同源原则,SessionStorage还限制必须是同一个页面。
⑤发送请求时是否携带:在前端给后端发送请求的时候会自动携带cookie中的数据,但是SessionStorage、LocalStorage不会;
⑥应用场景:cookie一般用于存储登录验证信息SessionID或者token,SessionStorage可以用来检测用户是否是刷新进入页面,如音乐播放器恢复播放进度条功能,多页表单信息填写,LocalStorage常用于存储不易变动的数据,减轻服务器的压力。

第九章 基于HTTP功能追加协议

实现服务器一有更新就把内容反馈到用户界面。但是http一次连接只能发送一个请求并且只能由客户端发起
ajax的解决办法,利用这个可以在已经加载完成的页面上局部更新;
comet的解决办法,收到请求后挂起,服务器有更新再返回;
SPDY的解决办法,再协议上的改动,支持推送,压缩,多路复用;
websock解决办法,建立http连接的基础上,确认连接webSocket通信连接,双方都客户发送报文;
websocket是什么?
HTML5新增网络传输协议,位于应用层。它的目的在浏览器和服务器之间建立一个不受限的双向实时通信的通道。比如,服务器可以任意时刻发送消息给浏览器。它是基于TCP,先通过HTTP/HTTPS协议发起一条特殊的HTTP请求进行握手后创建一个用于交换数据的TCP连接。
客户端和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输
而在websocket出现之前,开发实时web应用的方式为轮询
不停地向服务器发送 HTTP 请求,问有没有数据,有数据的话服务器就用响应报文回应。如果轮询的频率比较高,那么就可以近似地实现“实时通信”的效果;轮询的缺点也很明显,反复发送无效查询请求耗费了大量的带宽和 CPU资源
它的优势是什么?
浏览器和服务器只要一次握手动作。
双方可以在任意时刻,相互推送消息。
服务器和浏览器之间交换的头信息很小。
WebSocket与传统HTTP协议区别是什么?
HTTP协议,浏览器不主动请求,服务器没法发送数据给浏览器。
HTTP协议每次链接都必须是三次握手才能发送消息,WebSocket只要一次就能发送消息。
HTTP协议每次请求都要发送head,WebSocket一旦建立链接,之后请求就不要发送head。
请求如下:
Upgrade:webSocket
Connection:Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

第十一章 web的攻击技术

主动攻击:直接访问web应用,将攻击代码传入;SQL注入攻击 OS命令注入攻击
被动攻击:利用圈套策略执行攻击代码的模式;XSS
什么是CSRF攻击
CSRF 攻击指的是跨站请求伪造攻击,攻击者诱导用户进入一个第三方网站,然后该网站向被攻击网站发送跨站请求。如果用户在被攻击网站中保存了登录状态,那么攻击者就可以利用这个登录状态,绕过后台的用户验证,冒充用户向服务器执行一些操作。

CSRF 攻击的本质是利用 cookie 会在同源请求中携带发送给服务器的特点,以此来实现用户的冒充。
怎么预防CSRF攻击?
①进行同源检测
②对cookie进行双重验证
③使用csrf token进行验证
什么是DDOS攻击
服务器端会为每个请求创建一个链接,然后向client端发送创建链接时的回复,
然后进行等待客户端发送第三次握手数据包,如果客户端没有回复,会等待20-30s的时间 这样会白白浪费资源。DDos就是利用这种方式进行攻击的。
如何避免DDOS攻击?
①限制同时打开SYN的半连接数目;缩短SYN半连接的time out时间
②正确设置防火墙;限制特定IP短地址的访问
什么是XSS 攻击
XSS 攻击指的是跨站脚本攻击,是一种代码注入攻击。本质是因为网站没有对恶意代码进行过滤从而导致了恶意代码的执行,攻击者通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户的信息如 cookie 等。

类型:
①存储型:把恶意代码存储在目标网址对应的数据库里,服务器中,当用户请求的时候返回恶意代码并执行。
②反射型:⽤户打开带有恶意代码的 URL 时,⽹站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
上面两个的区别,存储型的恶意代码在数据库里,反射型的恶意代码在url上。
③dom型:⽤户打开带有恶意代码的 URL。⽤户浏览器接收到响应后解析执⾏,前端JS取出 URL 中的恶意代码并执⾏。
前面两个都属于存储在服务器的错误,第三个是属于前端js自身的安全漏洞。
怎么避免xss攻击?
①不使用服务器端渲染,对于dom型的攻击,可以使用csp。
CSP 指的是内容安全策略,它的本质是建立一个白名单,告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截由浏览器自己来实现。
通常有两种方式来开启 CSP,一种是设置 HTTP 首部中的 Content-Security-Policy,一种是设置 meta 标签的方式
②对一些敏感信息进行保护,比如 cookie 使用 http-only,使得脚本无法获取。也可以使用验证码,避免脚本伪装成用户执行一些操作。
③为了减轻这些攻击,需要在HTTP头部配上,set-cookie:
httponly-这个属性可以防止XSS,它会禁止javascript脚本来访问cookie。
secure - 这个属性告诉浏览器仅在请求为https的时候发送cookie。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值