计网学习————(二)

发布于:2025-02-25 ⋅ 阅读:(12) ⋅ 点赞:(0)

上一篇计网学习————(一)

TCP编程角度看HTTP请求处理

在这里插入图片描述

事务:对应着一个响应和一个请求
短连接:每次客户端和服务端完成一次数据交互之后就立即断开连接。下次再有请求时重新建立连接。
长连接:客户端和服务端建立连接后,即使完成了数据的交互也不立即关闭连接,而是保持这个连接,以便后续的数据交互。
区分长连接还是短连接靠的就是Connection头部:
Keep-Alive:长连接
Close:短连接
如果存在代理服务器的话,不转发Connection头部,只与当前连接有关
存在的问题中有:陈旧的服务器可能无法识别Connection的长连接,就会导致自动退化为短连接,但是服务器和客户端仍然认为发送的是长连接——————Proxy-Connection就是用来解决这个问题的,它就会替代Connection表示当前使用的是代理连接

HTTP消息在路由中的传播

Host 头部————出现在URL
定义为: uri-host[":"port]
HTTP/1.1请求中必须要传递Host头部否则返回400错误响应码
因为HPPT/1.0的域名比较少就不会出现多个域名对应一个服务器的情况,但是现在域名变多了,所以1.1中就规定了请求路径必须是绝对路径的形式,而不能是相对路径

处理方法

1.建立TCP连接
2.读取请求行、请求头部
3.服务器寻找理由中对应的URI的路径处理相应请求
4.访问相应资源并且生成响应
5.返回给客户端并且生成一个日志

代理服务器的头部

HTTP头部中会有X-Forwarded-For传递IP——— X-Forwarded-For中包含的是之前经过的公网ip(所以这个里面的第一个Ip就是起始ip),还有一些采用的是X-Real-IP(nginx)传递ip

Max-Forwards头部————表示的限制Proxy代理服务器的最大转发次数
Max-Forwards=1*DIGIT

Via头部————进过了那些代理服务器,版本和名称
via-1#(receuved-protocol(代理服务器版本号)| RWS received-by(代理服务器名称) [RWS comment(代理器的注释)])

Cache-Control:notarnsform——————表示禁止代理服务器修改响应包体

表示上下文的HTTP头部

User-Agent————指明客户端的类型信息,服务器可以根据对资源的表述做抉择
通用:
User-Agent=porduct*(RWS(prodect/comment))
product=token["/"product-version]
RWS=1*(SP-空格/HTAB-换行)
具体:
user-agent:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
解释:Mozilla表示浏览器兼容的版本 ()里面表示的就是注释,比如基于那个操作系统上
AppleWebKit 表示的是浏览器的渲染引擎
Chrome、Safari表示是浏览器

Referer————当前请求来自另外一个页面浏览器就会自动添加这个页面到这个头部/是来自上一个请求的
referer:
https://www.csdn.net/
表示我这个请求是来自csdn首页的然后跳转到这个页面——可以用于防爆链
不会添加Refer情况:
当源页面采用的协议表示本地文件的"file"或者"data" URI
当前请求页面采用的是http协议,而来源页面采用的是https协议
用处:用于统计分析、缓存优化、防盗链等功能

From————主要告诉服务器的如何通过邮箱联系到爬虫的负责人

Server:指明服务器上所用软件的信息,用于帮助客户端定位问题或者统计数据
通用:
Server=product*(RWS(product/comment))
product=token["/"product-version]
RWS=1*(SP-空格/HTAB-换行)
具体:
server: elb
server:nginx

Allow————告诉客户端,服务器上该URI对应的资源允许那些方法执行
通用:
Allow=#method
具体:
Allow:GET、HEAD、PUT

Accept-Range————告诉客户端服务器上该资源是否允许range请求
通用:
Accept-Ranges= acceptable-ranges
如:
Accept-Ranges:bytes 接收range请求
Accept-Ranges:none 不接收range请求

内容协商与资源表述

内容协商:每个URI指向的资源可以是任何事物,它有着多种不同的表述(语言、方式、压缩方式等)
在这里插入图片描述

方式:
Proactive————主动式内容协商: 客户端表明想要的服务方式,服务端根据这些头部提供特定的representation表述。客户端————>服务器。
Reactive————响应式内容协商: 服务器将多种表述方式都返回给客户端让客户端自己选择,服务器———>客户端。

要素
质量因子q————内容的质量、可接受类型的优先级
媒体类型、编码————content-type:text/html;charset=utf-8
内容编码————压缩算法——content-encoding:gzip
表达语言————accept-language:zh-CN,zh;q=0.9,en;q=0.8

HTTP包体

请求或响应都可以携带包体:
HTTP-message = start-line*(header-field CRLF) CRLF [message-body]
message-body = *OCTET(二进制字节流)

包体长度

发送HTTP消息时已经确认包体的全部长度————直接传输
使用Content-Length 头部(HEAD,可见性高)明确指明了包体长度
Content-Length = 1* DIGIT (十进制)
如果定义的Content-Length 少于实际的字节数量的话,那么浏览器中不能查看到全部内容,WireShark 可以看到请求是都有但是浏览器自动丢掉了。如果定义的是比实际多的话,会返回failed,因为不符合HTTP规范了

不确定包体的全部长度——分块传输
前提:
客户端支持Trailer头部————TE:trailers
服务器告知chunk包体后会传输那些Trailer尾部中,比如包体的大小

使用Transfer-Encoding头部指明使用Chunk传输方式————会自动忽略Content-Length头部
通用:transfer-coding=“chunked”/“compress”/“deflate”/“gzip”/transfer-extension
chunked-body=*chunk last-chunk trailer-part CRLF

chunk = chunk-size[chunk-ext] CRLF chunk-data CRLF
chunk-size(表示当前块的长度)=1HEXDIG(16进制而不是10进制)————需要包括换行符号。
chunk-data(实际的数据内容)=1
OCTET

last-chunk(最后一块)=1*(“0”)[chunk-ext]CRLF
trailer-part=*(header-field CRLF)————尾部部分紧跟在最后一个数据块之后,

它由零个或多个头部字段
浏览器接收的是只有一个请求
优点:基于长连接持续推送动态内容
可是实现变压缩变发送————因为长度不知道
先发送完包体再发送头部

以下消息不含包体:
HEAD方法请求对应相对的响应
1XX、204、304 对应的响应
CONNECT 方法对应的2XX的响应

包体内容

MIME——媒体类型
content:=“Content-Type”:“type”/“subtype*(”;“parameter)”
“Content-Type”: 这是HTTP头部字段的名称
type: 表示媒体类型的类别,如text, image, application等。
subtype: 表示具体子类型的标识符,例如对于text/html中的html部分。
举例:Content-Type: application/json; charset=utf-8

Content-Disposition 是一个用于指示响应内容如何被处理的HTTP头部字段
disposition-type = “inline” |“attachment”|disp-ext-type
inline: 这是最常见的处置类型之一,意味着返回的内容应该在浏览器中直接显示(如果浏览器能够渲染的话)。例如,HTML页面或内联图像通常会使用这种类型。
attachment: 表示返回的内容应该被视为下载附件,并提示用户保存到本地文件系统,而不是直接在浏览器中打开。
disp-ext-type: 这指的是扩展处置类型,允许定义非标准的处置类型。然而,在实际应用中很少使用,因为这可能不会被所有用户代理正确识别或处理
Content-Disposition: inline; filename="example.jpg"

表单提交时的包体格式

HTML:是一种结构化的标记语言,没有交互功能
里面的FORM作用
FORM表单:提供了交互控制元件用来向服务器通过HTTP协议提交信息
核心属性:
action————提交时发起HTTP请求的URI

method————提交时发起HTTP请求的http方法

enctype————在POST方法下,对表单内容在请求包体中的编码方式
application/x-www-form-urlencoded:这是默认类型,它会将表单数据转换成URL编码格式,键值对之间用&连接,空格变成+号,特殊字符转换为ASCII十六进制字节值
multipart/form-data:这种编码方式不进行URL编码,而是使用多部分边界分隔每个字段的数据,特别适用于需要上传文件的情况。
使用上面这种的时候就需要添加Content-type 头部指明这是一个多表述包体


Content-type:multipart/form-data;   //认为每个输入框都是一个独立资源描述    
        boundary=---Webxxxx            //分隔  
    //boundary:=0*69<bchars>bcharsnospace  

multipart-body = 1*encapsulation close-delimiter //一个多部分消息体由一个或多个封装(encapsulation)组成,并以关闭定界符(close-delimiter)结束


//全部内容 
POST /upload HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=boundary-string

--boundary-string
Content-Disposition(内容形式): form-data; name="field1"

value   //表示field1的值是value
--boundary-string
Content-Disposition: form-data; name="field2"; filename="example.txt"
Content-Type: text/plain

(data)   //example.txt 里面的内容   
--boundary-string-- //最后加两个`--`表示结束了

多线程、断电续传、随机点播等场景的步骤

步骤

1.客户端明确任务:从哪里开始下载
本地是否已有部分文件、文件已下载部分在服务器端发送改变?
使用几个线程并发下载
2.下载文件的指定部分内容
3.下载完毕后拼装成统一的文件

HTTP Range规范

允许服务器基于客户端的请求只发送响应包体的一部分给客户端,而客户端自动将多个片段的包体组合成完整的体积更大的包体————许客户端请求资源的特定部分(字节范围),而不是整个资源

前提:Accept-Range头部表示支持Range请求

Range用法

Accept-Ranges:byte 表示支持并且按照字节的形式传输类似于封装成贞的思想
总长度为500
直接表示:bytes=0-499
分段表示:bytes=0-99,100-499 /(使用重合)0-200,100-499 客户端用来组装
从后开始:bytes=-500,0-
仅要第1个和最后一个字节:bytes=0-0,-1
实际传输的时候需要在头部中Range: bytes=0-5

Range条件请求

如果客户端已经获得了Range响应的一部分——就是之前已经发送过了Range请求(服务器端会为这个响应生成ETag),并想在这部分响应未过期的情况下获取其他部分的响应。
IF-Match:"ETag"
Content-Range: bytes(单位) 0-999/1458934表示显示传输资源的大小/表示总体大小如果不知道可以用*代替
如果返回不符合就会返回416报错
服务器不支持Range返回200

Cookie

Cook是HTTP的状态管理机制
保存在客户端的、由浏览器维护、表示应用状态的HTTP头部
存放在内存或者磁盘中,服务器端生成Cookie在响应中通过Set-Cookie头部告知客户端,客户端得到Cookie后,后续请求都会自动将Cookie头部携带至请求中

Set——Cookie头部一次只能传递1个name/value对,响应中可以含有多个头部
set-cookie-header=“Set-Cookie:” SP set-cookie-string
“Set-Cookie:”:这是头部的名字,表明服务器希望客户端设置一个或多个cookie。
set-cookie-string:这是实际的cookie数据字符串,包含了cookie的各种属性。最基本的set-cookie-string至少包含一个键值对(即名称和值),但也可以包括额外的属性。
可选属性有:
Expires 指定了cookie的过期时间
Max-Age=3600 表示该cookie将在3600秒(即1小时)后过期,优先级高于expires
Domain=example.com 定义了cookie有效的域名,默认是当前域名
Path 表明指定路径下使用cookie
Secure 标志表示此cookie只能通过HTTPS传输
HttpOnly 标志意味着这个cookie不能通过JavaScript的Document.cookie API访问,有助于减轻XSS攻击的风险。

Cookie用于客户端(浏览器)向服务器发送之前通过Set-Cookie头部存储的cookie信息。它仅包含键值对,没有额外的属性。
Cookie-header="Cookie:"OWS cookie-string OWS
"Cookie"这是Cookie头部的字面名称。在HTTP请求中,客户端通过包含这个头部来向服务器发送存储在客户端上的cookie信息
cookie-string:这是实际携带的cookie数据,由一个或多个键值对组成,这些键值对通常是由服务器通过Set-Cookie响应头设置,并存储在客户端上。多个cookie用分号加空格(; )分隔。

Cookie于Session的常见用法

在这里插入图片描述

步骤:
1.首先客户端请求发送POST请求给服务器,服务器读取数据库用户名和密码对比。
2.通过后就会把已经登陆的状态生成一个session(有实效),把session的id和有效时间放入内存数据库中
3.服务器再返回这个时间给客户端,按照Set-Cookie返回
4.浏览器保存session之后就会保存在cookie
5.浏览器之后发送请求就会携带session
6.服务器接收到了session之后就会和内存数据库去比对
7.成功后执行业务

第三方Cookie
浏览器允许对于不安全域下的资源响应中的Set-Cookie保存,并在后续访问该域时自动使用Cookie,就类似在第一个浏览器引用第三方的资源的时候,可能会把第三方的Cookie给携带走
默认发送机制:当浏览器向网站发起请求时,会自动附带该网站域下的所有未过期的Cookie(根据路径匹配原则)。这意味着,如果一个网页加载了来自第三方的内容(如图片、脚本或iframe),而这些内容触发了对第三方服务器的请求,那么该第三方域下对应的Cookie也会被自动发送
所以引用第三方Cookie时就会携带走一些隐私

同源策略

原因:
同一个浏览器发出的请求,未必都是用户自愿发出的请求如加载的时候就会发送GET请求:网页可以悄悄地向受害者的银行或电子邮件服务等敏感站点发送请求。如果用户的浏览器已经登录到这些服务并且相应的会话Cookie没有过期,这些请求将会自动携带有效的会话信息,从而可能导致未经授权的操作被执行。
广告网络和其他第三方服务提供商经常使用Cookie来跟踪用户行为。例如,当一个用户访问不同的网站时,如果这些网站都加载了同一个第三方广告服务,那么该服务可以通过在用户浏览器中设置的Cookie来识别用户,并收集关于其浏览习惯的信息,用于个性化广告展示等目的。

在这里插入图片描述

定义:限制了从同一个源加载的文档或脚本与另一个源的资源进行交互
同源的定义:协议,主机,端口号都完全相同
跨域问题:当一个网页尝试请求另一个不同源的资源时就会遇到跨域问题

可用性:
允许跨域写操作、允许带有SRC属性的可以跨域访问

跨站请求伪造攻击(CSRF)
在这里插入图片描述

当用户访问银行的服务器登陆之后,又访问一个木马网站。
网站利用同源策略中的允许跨域写操作,对银行页面进行操作就可以使用Cookie了

解决办法:1.禁止来源其他网页的发起请求————Reference: 如果带的有值就不允许操作,但这个一些版本过低的页面无法使用
2.服务端返回一个唯一且有实效性的token 这样就当木马网站发送请求的时候这个实效就失效了,且token无法伪造

CORS————跨域的资源共享
这是正规、合理的跨域访问
站点A允许站点B的脚本访问其资源,必须HTTP响应中显式的告知浏览器:站点B是被允许的
所以要做到浏览器要告知站点A这个请求来自站点B并且站点A的响应中,应明确哪些跨域请求是被允许的
策略1:使用简单请求
GET/POST/HEAD方法之一
仅能使用CORS安全的头部:Accept、Accept-Language、Content-Language、Content-type————协商类的
Content-Type的值:text/plain、multipart/form-data、applicatio/x-www-form-urlencoded
在这里插入图片描述

如同上图:客户端先给服务器发送一个请求携带了Origin告知服务器来自那个域,服务器返回一个允许通过的域给浏览器,从而浏览器放行。
注意:服务端并不会阻拦相关的跨域,只有浏览器才能处理想对应的跨域请求

策略2:使用复杂请求
在这里插入图片描述

首先发送一个预检请求头部有:
Access-Control-Request-Method: POST ———— 表示实际请求将使用 POST 方法。
Access-Control-Request-Headers ————表示接下来发送的实际请求中需要包含自定义的头部

服务器响应预请求
Access-Control-Allow-Method————允许跨域请求的方法
Access-Control-Allow-Origin————服务器允许来自XXX的请求访问资源。
Access-Control-Allow-Headers————服务器允许请求中包含XXX头。
Access-Control-Max-Age: 86400: 服务器设置预检请求的结果可以被缓存 86400 秒(一天)。

客户端发送实际跨域请求

服务端返回一个响应跨域请求,并且告知浏览器哪里的请求可以跨域访问

条件请求

定义:由客户端携带条件判断信息,而服务器预执行条件验证过程成功,再返回资源表述

####验证器
验证器:根据客户端请求中携带的相关头部,以及服务器资源的信息,执行两端的资源验证
强验证器:服务器上的资源表只要有变动,那么旧的验证头部访问一定会验证不通过
弱验证器:服务器资源变动时,允许一定程度上任然可以验证通过
验证器响应头部有:

1.Etag 响应头部
定义:entity-tag=[weak]opaque-tag
weak:弱验证器以W/前缀来标记
opaque-tag : 这是指实体标签的具体值,它对客户端来说应该是不透明的(即客户端不需要理解其意义)。服务器端决定如何生成这个值,通常是为了唯一地标识一个特定版本的资源。
弱验证:ETag: W/“67ab43”
强验证:ETag: “67ab43”

2.Last-Modified 响应头部
表示上次修改的时间
Last-Modified=HTTP-date
Date头部表示的是响应包体生成的时间

基于上述的判断的条件请求

if-Match=“*”/1#entity-tag
这个请求头用于确保只有当目标资源的当前实体标签(ETag)匹配指定的值时,才执行请求。如果使用了通配符*,则表示无论当前的ETag是什么,都应执行请求。通常用于PUT或其他更新操作,以防
止覆盖他人的更改。

if-None-Match=“*”/1#entity-tag
该请求头用于检查服务器上的资源是否不同于客户端已有的副本。若指定的ETag与服务器
端资源的ETag不匹配(即资源已更新),则执行请求(如GET)。如
果匹配,则返回304未修改状态码。

if-Modified-Since=HTTP-date
此请求头告知服务器仅当所请求的资源自指定日期以来已被修改时,才返回资源的内容;否则返回304未修改状态码。

if-Unmodified-Since=HTTP-date
如果资源自指定日期后没有被修改过,则允许执行请求。

if-Range=entity-tag/HTTP-date
这个请求头结合了范围请求(Range)一起使用。它指示服务器仅当资源的ETag或
最后修改时间与请求中指定的一致时,才处理范围请求。如果不匹配,服务器应当返回整个资源而不是部分内容。

应用场景

1.缓存更新
a.首次缓存
在这里插入图片描述

当客户端一开始没有任何缓存的时候,客户端会发送一个GET请求给服务器,服务器会返回给浏览器一个最后修改时间和Etag标记,和相应的数据

b.基于过期缓存发送条件请求
在这里插入图片描述

出现两种情况
情况一:服务器并没有对数据进行修改。客户端向服务器发
送请求(包含了条件请求)检验是否修改如果回复304表示没有修改那么浏览器可以继续使用缓存大大减少了流量的浪费
情况二:服务器对数据进行修改。那么客户端会回复200并且给他发送新的数据给缓存和Etag和Last-Modified

2.增量更新
当服务器支持Range服务时,连接意外中断时以及接收到部分数据
在这里插入图片描述

为了防止两次下载间资源已发生了变更
如果没有发送变化:
在这里插入图片描述

如果发送了变化:
在这里插入图片描述

服务器返回412然后浏览器重新发送GET请求,他就会使用新的Etag
若要使If-Range工作,需要确保所使用的条件(无论是ETag还是HTTP-date)与服务器端的状态相匹配。如果条件不符合,服务器将默认返回完整的资源而不是部分内容——就不需要再发送Get请求了而是合并了。

3.更新丢失问题
获取资源,再把本地修改后的资源提交
在这里插入图片描述

相当于两个客户端同时访问同一片共享资源的时候可能会出现一个客户端把另一个客户端的内容给覆盖了。
解决办法:乐观锁————基于条件请求判断是否基于最新的标签
乐观锁还能解决首次上传的问题:
在这里插入图片描述

首次上传的时候默认为* 修改之后标签改变不为*就会返回412

Nginx的处理图

在这里插入图片描述

缓存

HTTP缓存:为了当前请求复用前请求的响应
目的:减少时延;降低带宽消耗
在这里插入图片描述

表示先从浏览器发送请求给服务器,服务器响应请求并且返回客户端。浏览器Cache储存响应中的数据
1.如果缓存没有过期的话,下次的请求不会直接发送给服务器而显查找本地的缓存————就不会发送请求给Web服务器。
查看是否使用缓存可以查看浏览器中的Network中的size有From cache
2.如果缓存过期了,客户端先从浏览器Cache中检查缓存过期,Local Browser Cache会先返回一个标签,然后给服务器返回标签。服务器对比标签发现里面的内容没有改变依旧可以使用就会返回一个304 然后重新发一个这个缓存使用时间的标签,并不会传递全部的缓存。

私有缓存与共享缓存

私有缓存:仅提供一个用户使用的缓存,通常只存在浏览器这样的客户端上
共享缓存:可以提供多个用户的缓存,存在于网络中负责转发消息的代理服务器————相当于发出请求的时候访问的不是服务器,而是访问的是代理服务器的缓存。

在这里插入图片描述

首先客户端给代理服务器发送Get请求,代理服务器查找自己Cache是否有对应的数据(并且检查是否过期),如果没有就给服务器发送Get请求要求给代理服务器要缓存。然后服务端响应之后会有max-age表示在代理服务器存放的时间,并且给分支给客户端。
如果代理服务器有了缓存之后客户端下次访问的代理服务器缓存就是直接返回给客户端。
如果代理服务器缓存过期了,那么下次客户端发送请求给代理服务器,代理服务器会发现自己缓存过期再次向服务器发送请求更新自己的数据。

缓存实现的机制
在这里插入图片描述

相当于缓存按照关键字能够快速查找:使用字典(哈希表)作为主索引可以提供对存储在双向链表中的数据项的快速访问能力。HTTP请求信息(如schema、path、host)作为键,允许系统迅速定位到相应的缓存项。
顺序管理:双向链表的存在使得数据项之间能够保持一定的顺序,这通常用于实现LRU(Least Recently Used,最近最少使用)等缓存淘汰策略。新访问的数据项可以通过移动到链表头部来标记为最近使用过,而长时间未被访问的数据项则会逐渐移向链表尾部,便于淘汰。

判断缓存是否过期:
response_is_fresh=(freshness_lifetime>current_age)
freshness_lifetime:按优先级,取以下响应头部的值
s-maxage>max-age>Expires>预估过期时间(默认的缓存)————(DownloadTime-LastModified)*10%
current_age定义:在HTTP缓存机制中表示一个缓存响应的当前年龄,即自该响应资源被最初生成或最后验证以来经过的时间长度。它是决定缓存内容是否仍然新鲜(即是否可以继续使用而不需重新验证或获取)的一个关键因素————是一个概念并不会在http头部出现
current_age=corrected_initial_age+resident_time
corrected_initial_age:最初始的发出可以使用的时间
resident_time:是指从缓存接收到响应开始直到当前时刻为止的时间长度(时延)。
在这里插入图片描述

先有源服务器发送为date1表示该响应是在 date1 时刻生成的。,然后代理服务器1接收到这个响应的时间此时的Age表示传输花费的时间。发给代理服务器2now-date1 的表示在代理服务器停留的时间 所以综上Currnet_age表示的是传输途中消耗的时间
因为需要缓存会被不停的调用所以Currnet_age会不断被更新从而就出现currnet_age更新,它是接收了一次请求就会更新
在network中的age表示从产生到这个浏览器的时间

Cache-Control 头部

Cache-Control=1#chache-directive
cache-directive = token [ “=” ( token quoted-string ) ]
token=1*DIGIT

请求中的值

max-age ————客户端希望接收缓存时间不超过指定秒数的响应(即使缓存中存在更旧的资源)。
max-stale————允许接收已过期的缓存响应(默认允许任何过期时间,或指定最大可接受的过期时间)。
min-fresh————要求响应至少在接下来的指定秒数内保持新鲜(即未过期)。
no-cache————强制缓存服务器在使用缓存前必须向原始服务器验证资源的有效性。
no-store————禁止任何缓存存储请求或响应的内容(用于敏感数据)。
no-transform————禁止代理缓存对资源进行转换(如压缩、图片格式转换等)。
only-if-cached————客户端仅接受缓存的响应,若缓存中无有效响应,则返回 504 Gateway Timeout。

响应中的值

no-cache: 要求缓存在提供存储的副本之前必须先提交给源服务器进行验证(通过发送条件请求),以确保副本仍然有效。这并不意味着不允许缓存,而是强调了重新验证的重要性。
no-store————禁止任何缓存存储请求或响应的内容(用于敏感数据)。
max-age: 指定资源被视为新鲜的最大时间长度。在这个时间段内,缓存可以直接使用存储的响应而无需重新验证。
must-revalidate: 一旦资源过期,在再次使用之前必须向源服务器验证其有效性。它强制缓存遵循新鲜度检查规则,即使这样做可能会导致网络访问失败。
proxy-revalidate: 与 must-revalidate 类似,但是仅适用于共享缓存(如代理服务器)。它不影响私有缓存的行为。

什么样的HTTP响应会被缓存

请求方法可以被缓存理解(不只GET方法)
响应码可以被缓存理解(404、205等)
响应于请求中没有指明no-store
响应中至少应含有以下1个或者多个头部:Expires、max-age、s-maxage、public当响应中没有明确指示过期间的头部,如果有响应码也可以被缓存。
如果缓存存在代理服务器上
不含有private、Authorization

使用缓存的条件:
URI是匹配的:URI作为主要的缓存关键字,当一个URI同时对应多分缓存时,选择日期最近的缓存
缓存中的响应允许当前请求的方法使用缓存
缓存中的响应Vary头部指定的头部必须于请求中的头部相匹配
Vary="*"1#field-name,如果以*开头匹配一定失败
必须请求以及缓存中的响应都不包含no-cache头部

Vary 缓存工作原理
在这里插入图片描述

客户端1访问的时候代理服务器缓存的是gzip编码的内容,如果客户端二访问时候却要求使用br压缩的这时候是不能直接用代理服务器gzip编码的内容,因为请求中Vary规定了内容的编码方式,所有响应中必须相同只能用服务器中重新下载。

处理缓存中更新频率不同的资源如html和css、js。因为html需要经常更新所以可以携带css、js的标志如果更新了就可以和本地缓存进行对比从而进行更新,从而每次传输都不需要携带很多

Waring

定义是对状态码的补充。
warning-value=warn-code SP warn-agent SP warn-text [SP warn-date]
warn-code=3DIGIT
warn-agent=(uri-host[":"port])/pseudonym————产生该警告的实体,可以是服务器或缓存等
warn-text=quoted-string ————产生该警告的实体,可以是服务器或缓存等
warn-date=DQUOTE HTTP-date DQUOTE ————可选的,表示产生警告的时间

warning 113 :表示预估的时间

重定向

定义:当浏览器接收到重定向响应码时,需要读取响应头部Location头部的值,获取到新的URI再跳转访问该页面
在这里插入图片描述

Location=URI-reference

重定向响应返回码概念:
原请求:接收到重定向响应码的请求
重定向请求:浏览器接收到重定向响应码后,会发起新的重定向请求

永久重定向:表示资源永久性变更到新的URI
301:重定向请求通常(原请求可能是POST请求)都会使用GET方法
308:重定向请求必须使用原请求的方法和包体发起请求————不会改变方法
临时重定向:表示资源只是临时的变更URI ————不存在缓存
302:重定向请求通常使用GET方法,而不管请求究竟使用什么方法
303:用于响应非GET或HEAD请求时,告知客户端应该用GET方法访问另一个URI来获取响应内容————改变放了
307:类似于302,但它明确要求客户端使用原始请求的方法和包体发起重定向请求——不改变方法
特殊重定向:
300:响应式内容协商中,告知客户端有多种资源表述,要求客户端选择一种自认为合适的表述,服务器有多种需要选择哪一种
304:告诉客户端虽然缓存过期了但是任然可以使用

重定向循环

服务器在生成Location重定向URI时候,在同一条路径上使用了之前的URI导致无线循环的出现
Chrome浏览器就会提示:ERR_TOO_MANY_REDIRECTS

Tunnel隧道

隧道技术通过将原始数据包封装在另一个数据包内来实现这一点,这个外部的数据包可以是不同协议的数据包,能够被中间网络识别和路由。
用于通过HTTP连接传输非HTTP协议格式的消息,常用于穿越防火墙
建立隧道后,由于传输的并非HTTP消息,因此不再遵循请求/响应模式,变为双向传输

在这里插入图片描述

先对正向代理(网关)建立TCP连接,然后网关就知道是要向服务器建立TCP连接,建立成功后返回响应————这就是建立起了隧道,之后就可以双向传输了
其中发出的CONNECT其实是属于request-line请求行中的一种

网络爬虫的原理

网络爬虫模拟人类使用浏览器、操作页面的行为,对互联网的站点进行操作————网络爬虫获取到一个页面后,会分析出页面中的URI,沿着URI路径递归的遍历所有页面

常见的爬虫请求头部:
User-Agent:识别是哪类爬虫
From:提供爬虫机器人管理者的邮箱
Accept:告知服务器爬虫对那些资源类型感兴趣
Referer:相当于包含了当前请求页面的URI

在这里插入图片描述

告知爬虫哪些内容不应该爬取
robots.txt——————访问http://www.robotstxt.org/orig.html
robots.txt文件中的内容:
User-agent:允许哪些用户
Disallow:禁止访问特定目录
Crawl-delay:访问间隔数秒
Allow:抵消Disallow指令
Sitemap:指出站点地图的URI

在这里插入图片描述

协议的基本认证

在这里插入图片描述

一种基本的验证框架,绝大部分浏览器所支持,因为传输的时候是明文传输,如果不使用TLS/SSL传输则有安全问题
客户端发送GET请求要求输入密码,服务端返回一个响应头中含有WWW-Authentcate,表示告诉客户端需要输入用户名和密码。浏览器会告诉客户,然后输入结束后会发送一个GET请求,其中里面带有 Authorization——————用来传输用户名和密码的。
请求头中的 authorizati : Basic ZGQ6ZWU 是dd:ee的base64编码,表示用户名和密码,可以用wireshark去抓包相对应的
如果使用代理服务器的话就会传递 Proxy-Authenticate=1#challenge

WireShark的使用

基本操作

在这里插入图片描述

可以在设置的选项中的视图选择时间显示格式中改为绝对时间/或者点击你需要选中的时间点击右键选择或者直接使用ctrl+T
同属于一个会话中的请求会用实现表示不属于的会用虚线表示,请求的箭头朝右,响应尖头朝左。出现⭕️的表示与你点击的请求/响应有关联,✅表示当前选中的是ACK报文,那么选中的就是它确认的报文,两个✅就是重复确认的报文。
追踪流
点击你选中的请求,右键选择追踪流tcp,就会把这个会话中相关的tcp表示出来了

Wireshark过滤器

1.捕获(BPF)过滤器
用于减少抓取的报文体积
使用BPF语法,功能相对有限

是在设备驱动级别提供抓包过滤接口,多数抓包工具都支持这个语法——原语组成
primitives原语:由名称或数字,以及描述它的多个限定词组成

qualifiers限定词

1.Type:设置数字或者名称所指示类型,如host www.baidu.com
host、port
net,设定子网,net 192.168.0.0 mask 2555.2555.2555.0=192.168.0.0/24
protrange设置端口范围,portrange 10-20

2.Dir: 设置网络出入口放下 dst port 80(发出去端口)
src(源端口)、dst(目标端口)、src or dst 、src and dst
ra 、 ta、addree等

3.Proto:指定协议类型如udp
ether、ip、ipv6、tcp、udp

4.其他
gateway:网关ip等价于 ether host ehost and not host host
broadcast:广播报文,例如 ether broadcast 或者 ip broadcast
multicast: 多播报文,例如ip multicast 或者 ip6 multicast
less,greater:小于或者大于

原语运算符

与:&&或者and
或:||或者or
非:!或者not

2.显示过滤器
对已抓到的报文过滤显示
功能强大

它支持在任何报文细节面板中解析出的字段名,都可以作为过滤属性
在视图——>内部->支持的协议面板中,可以看到各字段名对应的属性名
点击表达式就可以是使用可视化对话框

DNS

定义:一个用于将人类可读的"域名"与服务IP地址进行映射的数据库
采用递归查询的方式————根域名服务器、权威服务器
在这里插入图片描述

DNS报文

查询与响应
query:查询域名
response:返回IP地址

在这里插入图片描述

DNS 报文的具体格式:
在这里插入图片描述

是一种基于UDP报文的
在这里插入图片描述

Queries格式由三部分组成:QNAME、QTYPE、QCLASS
QNAME——以.分隔为多端,每段以字节数开头、在ASCII编码每段字符、以0结尾,前两位比特必须为00,只能表示2^6-1字节
QTYPE————(1——A——IPV4地址)(2——NS——权威域名服务器)(5——CNAME——别名)(15——MX——邮件交换)(16——TXT——文本字符串)(28——AAAA——IPV6)
QCLASS——IN表示internet

Answer格式
在这里插入图片描述

NAME:前两位为11,接应用QNAME偏移,在DNS头部的字符————因为把请求带着过来的,所以只需要引用 c0 0c表示引用从UID开始后的第12位(一位两个字符)
TTL:time to live
RDLENGTH:指明RDATA的长度
RDATA:查询值、如IP地址或者别名

学习来源:极客时间