输入url 到页面渲染

131 阅读5分钟
  1. url解析
  2. dns查询
  3. tcp连接
  4. 处理请求
  5. 返回响应
  6. 渲染页面

url解析

检查是否有缓存 如果有

判断缓存是否过期 Exipres Cache-control Expires 版本 http/1.1 响应头中 绝对时间 Expires: Wed, 22 Nov 2019 08:41:00 GMT 缺点: 服务端时间和浏览器时间不一致导致失效

Cache-control 版本 http/1.1 请求头和响应头 Cache-Control:max-age=3600 超时失效

no-cache 不缓存,直接请求

缓存未过期,使用强缓存 如果缓存过期,判断是否使用协商缓存

浏览器携带标识发请求,服务端根据标识判断是否修改了文件,未修改,读取缓存,修改了,返回新的资源。 If-Modified-Since Last-modified 浏览器第一次给服务器发请求后,服务器会在响应头加上这个key - Last-modified,浏览器再次请求会携带If-Modified-Since,服务器收到请求根据资源最后一次修改的时间 Last-modified对比,询问服务器在该日期后资源是否更新 有更新的话就会将新的资源发送回来

但是如果在本地打开缓存文件,就会造成Last-Modified被修改 所以在Http/1.1 结合Etag使用。

Etag If-None-Match etag 是服务器根据当前文件的内容,生成的唯一标识 ,只要内容有改动 ,值会更新 服务端通过响应头把这个值返回给浏览器 浏览器下次请求的时候将这个值作为If-None-Match 这个字段的内容,放在请求头中发送给服务端。 Etag 优先级会更改

dns查询

浏览器缓存 =》系统缓存=》路有缓存=》isp dns缓存=》根域名服务器

每个域名服务器内部是迭代查询 dns服务器不会自己向其他服务器进行查询 ,把能够解析该域名服务器的ip返回给客户端 ,客户端不断进行查询 直到找到位置 迭代只会找到相关的服务器

dns负载均衡: 当网站访问量过大时 所有的请求都在同一个服务器上 会崩掉, 此时在应答dns查询时 dns服务器会对每个查询返回不同的解析结果 返回不同的ip ,从而把访问引导到不同的服务器上

tcp连接

tcp/ip 三次握手

传输层 提供端对端的接口

c向s发送连接请求 syn = 1 seq=x (序列号)(syn=1 知道客户端要建立连接 )

s收到c发送的请求应答, 我收到了, 返回 ack=x+1 syn=1 seq=y (syn=1 知道服务端可以建立连接 )

c接受到s的应答 c根据syn是否为1以及ack是否为第一次发出的seq加1 向s发送我知道你收到了 ack=y+1 seq=z,s收到请求 ack是第二次发送请求seq+1,建立成功

syn建立联机

tcp是可靠传输 双方确认 第一次握手确定客户端有发送能力 第二次握手确定服务端发送能力 接收能力(ack) 第三次握手确定客户端接收能力

为什么是三次握手呢???

客户端向服务端发送请求连接,如果请求报文丢失未收到确认,再发一次请求连接,服务端收到客户端发来的请求,确认应答,建立连接 传输数据后释放连接,但客户端发送了两次连接 如果第一次连接由于网络问题,延误到释放连接后某个时刻到达服务端 服务端收到连接 ,与客户端建立连接,此时客户端忽略与服务端发来的确定,不发送数据 浪费资源

半连接队列???

服务端第一次收到客户端的SYN之后 处于SYN_RCVD状态 双方还没有完全建立连接 服务器会把此状态放入一个队列 --半连接队列

全连接队列

--已经完成三次握手 队列满了会存在丢包的现象

syn ack 重传次数问题

服务器发完syn ack 包后 未收到客户端确认包 服务端进行重传 等待一段时间扔未收到客户端确认包 进行二次重传 ,超过规定次数最大重传 系统将该信息从半连接队列删除

每次等待时间不一定相等 指数增长

三次握手可以携带数据吗???

一 二次不可以携带数据

服务器更容易受到攻击 第三次可携带 客户端已处于established状态 服务端也已经确认了收发能力

二次握手的时候 服务端分配资源 三次握手的时候 客户端分配资源 syn 攻击 就是客户端 短时间内伪造大量的ip地址 向服务端发送syn包 服务端回复确认包 等待client回复 由于原地址不存在 导致服务端不断重发 syn包长时间占据半连接队列 导致正常syn请求由于队列满被丢弃 网络拥塞瘫痪-dos/ddosg攻击

处理请求

返回响应

渲染页面

断开连接

tcp的四次挥手:

客户端发送断开连接请求 fin=1 seq=u
服务端接收到客户端请求 确认收到ack =u+1,seq=v 服务端进入等待关闭 服务端发送关闭标志 fin=1 ack=u+1(服务端也想断开连接 服务端处于last_ack)

客户端收到

服务端可能不会立即关闭 先发送一个ack报文 你发的fin报文收到了 只有等服务端所有报文发送完 才发送fin报文

客户端发送ack之后不能立即关闭 (第二次挥手) 客户端进入time_wait 状态 tcp并未释放掉 经过2msl后 客户端才进入closed状态 在此期间 服务端可能会有数据包发送 (在路上)给客户端

为什么TIME_WAIT状态需要经过2MSL(最大报文生存时间)才能返回到CLOSE状态?

time_wait 重发丢失的ack报文 1msl主动关闭最后的ack可以到达对端 1msl确保对端没有收到可重传