03 | HTTP请求流程:为什么很多站点第二次打开速度会很快?
03 | HTTP请求流程:为什么很多站点第二次打开速度会很快?
讲述:李兵
时长16:17大小14.91M
浏览器端发起 HTTP 请求流程
1. 构建请求
2. 查找缓存
3. 准备 IP 地址和端口
4. 等待 TCP 队列
5. 建立 TCP 连接
6. 发送 HTTP 请求
服务器端处理 HTTP 请求流程
1. 返回请求
2. 断开连接
3. 重定向
问题解答
1. 为什么很多站点第二次打开速度会很快?
2. 登录状态是如何保持的?
总结
思考时间
赞 105
提建议
精选留言(147)
- mfist2019-08-101 首先猜测最可能的出问题的地方,网络传输丢包比较严重,需要不断重传。然后通过ping curl看看对应的时延高不高。 2 然后通过wireshake看看具体哪里出了问题。 3 假如别人访问很快,自己电脑很慢,就要看看自己客户端是否有问题了。 感觉平常碰到很多http问题,基本都能通过上面方式搞定展开
作者回复: 👍
共 9 条评论119 - 一步2019-08-10对于浏览器缓存地方的选择一直搞不明白其中的原理,在浏览器中访问的时候打开network面板,发现缓存的来源有的from disk有的是from memory。对于资源什么情况下缓存到硬盘什么时候缓存到内存,想请教一下老师
作者回复: 这是浏览器的三级缓存机制,使用memory cache比disk cache 的访问速度要快,但是具体什么规则等我回头看下源码再来回答你了。 还有另外一种cache,是service worker的cache。
共 26 条评论78 - 宇宙全栈2019-08-16老师好,请教下TCP连接如何断开的问题: 1、没有 keep-alive 时,http数据传输完成后,是由浏览器主动发起断开TCP连接,还是由服务器主动发起断开 TCP 连接? 2、设置了 keep-alive 时,当关闭页面时,浏览器会发起断开 TCP 连接吗?如果不关闭页面,浏览器会一直保持这个 TCP 连接吗? 3、设置了 keep-alive 时,如果浏览器出现故障时了(挂掉了),此时服务器保持的 TCP 连接多久会释放?展开共 11 条评论63
- Hurry2019-08-13使用 chrome network 面板,看那个 瀑布图 中每个阶段的含义,就可以判断问题出现在那个方向了,每个阶段的含义,https://developers.google.com/web/tools/chrome-devtools/network/reference#timing-explanation 举个例子 Content Download 如果太长,很有可能是下载的资源太大,但也有可能是网络慢导致的下载太慢,简单计算一下,在例如 Waiting (TTFB) 这个太长的话,有可能是网络慢,或者就是 后端处理时间过长导致的,至少可以排查掉前端原因,还有很多,例如 DNS lookup 等,但是最终要确认具体哪里慢,最好是结合系统日志去分析展开
作者回复: 结合网络模块来分析,总结的挺好
共 5 条评论52 - XWL2019-08-12浏览器刷新操作,ctrl+F5和F5有什么区别
作者回复: 一个是强制刷新,也就是资源都走网络。 一个是正常处理流程。 比如通过网络面板,打开一个站点,再使用强制刷新,可以看到如下信息 176 requests 3.1 MB transferred 3.5 MB resources Finish: 26.30 s DOMContentLoaded: 5.04 s Load: 14.88 s 如果使用正常的刷新,看到的信息如下: 171 requests 419 KB transferred 3.2 MB resources Finish: 25.09 s DOMContentLoaded: 1.41 s Load: 6.24 s 其中的transferred是真正的网络传输的数据,使用强制刷新,传输的数据体积就大多了,而且请求时间也变得更长了。
共 4 条评论40 - 蚂蚁内推+v2019-08-12set cookie 会不会有安全问题,麻烦老师指导下
作者回复: cookie是不安全的,比如黑客可以通过一些手段插入一些脚本到你的页面里面(具体一些途径我们浏览器安全篇再讲),通过脚本获取到你的cookie数据,然后就可以利用cookie做一些坏事了。 当然也有一些方法规避,常用的一个是将部分cookie设置成httponly的属性,设置了httponly属性后cookie,就无法通过js脚本来读取了,只是在发送http请求时候会被带上! 当然还有一些其他防范的方法,这个同样咱们后面在聊!
共 3 条评论38 - 月隐千山2019-08-10老师,在做前端页面的时候,是否可以设置当前页面是否可以被缓存,以及哪些部分可以被缓存?还是说整个缓存机制都是由浏览器自己控制的?
作者回复: 是没有办法通过前端代码来控制缓存的,缓存是后端或者部署的同学来控制的,但是前端同学应该知道那些内容要被缓存,和后端或者部署的同学配合来打!
共 10 条评论34 - CMS2019-11-07Chrome 有个机制,同一个域名同时最多只能建立 6 个 TCP 连接,如果在同一个域名下同时有 10 个请求发生,那么其中 4 个请求会进入排队等待状态,直至进行中的请求完成。 是指同一个域名下的6个并发请求么。我理解建立一个tcp连接,可以处理多个请求吧? 这一块蒙了,看好多人问这个
作者回复: http/1.1 一个tcp同时只能处理一个请求,浏览器会为每个域名维护6个tcp连接! 但是每个tcp连接是可以复用的,也就是处理完一个请求之后,不断开这个tcp连接,可以用来处理下个http请求! 不过http2是可以并行请求资源的,所以如果使用http2,浏览器只会为每个域名维护一个tcp连接
共 9 条评论34 - Geek_0d31792019-11-03老师您好~有个问题困扰我了。希望您能解答我,十分感谢。http2同个域名只能维持一个长连接。那我现在打开了一个域名下的a页面,然后又打开了这个域名的b页面,那这个b页面是新开一个tcp长连接吗?还是会用a页面的长连接?换句话说,维持一个tcp长连接,指的是一个页面维持一个?还是整个浏览器维持一个?还是同一个渲染进程维持一个?
作者回复: 浏览器为用同一个域名只维护一个TCP连接。 你从通过Chrome打开chrome://net-export/ 这个地址,然后记录网络过程。 最后在使用这个https://netlog-viewer.appspot.com/ 打开你日志文件,就能看到h2的详细信息了。
共 2 条评论29 - liu_xm2019-08-10同域名只能建立6个tcp链接的话,那加载大量图片或者其他资源的时候不是很卡呢?
作者回复: 是的,通常如图片这种静态资源都是直接配置到cdn上的
共 11 条评论24 - peter2019-08-12请问:请求行和请求头是发送两次吗? 从文章的文字来看,是发送两次。 但我感觉是发送一次,即发送一次请求,该请求包含请求行和请求头。
作者回复: 对,只发送一次。 问下文章什么地方让你感觉是发送了两次啊? 我检查下。
共 17 条评论16 - houqx2019-08-23问一个今天遇到的跟本篇文章没有太大关系的问题: 问题描述:前端有一按钮,点击可以签到(比如调用的接口名为doSign),签到成功后置灰,不能再点击。但是看服务端日志存在同一时间同一用户该接口的多次调用(通常为3次,间隔10ms以内)。 我想问的问题是: 1:这里的重复调用是哪里引入的(用户手抖多次点击?) 2:浏览器在发出一个网络请求后,当这个请求还没返回的时候,会再重复发起相同的请求吗?(用户快速点击)展开
作者回复: 用户快速点击也有可能的,通常,前端要处理防止多次点击的情况。
共 8 条评论15 - nissan2019-08-10请问老师,使用者的资讯(如UID=3431uad)是放在cookie还是localstorage中好呢?我的理解是存不存cookie是后端决定(要求set-cookie)存localstorage是前端程式控制的。是这样吗?
作者回复: 是否要使用localstorage,还是要看具体应用场景。其实使用cookie会很方便,因为它会随着http请求头把cookie内容发送服务器,用localstorage需要重新实现数据上传和下载。
15 - Louis2019-08-13请问老师http的keep alive和http2中的信道服用有什么区别呢
作者回复: 一个http中的keep-alive是排队请求,也就是一个http请求完成之后才能继续请求下一个,而http2中请求是并发的,可以同时处理很多请求!
12 - aaron2019-08-10老师,请问https为什么能防止网络劫持?
作者回复: http在传输过程中是明文的,所以数据在传输过程中是能够被截获或者修改的,比如谁在你电脑上安装了一个网络拦截软件,或者你的路由器被谁安装了监听软件,甚至在网络服务提供商都有可能修改你页面的内容,基于这些原因,我们需要在传输过程中加密数据,这就是https出现的原因,即便你拦截到了请求,获取的只是加密后的数据,拿到也没有什么用。 这块在浏览器安全篇会系统介绍。
共 3 条评论11 - weineel2019-08-29老是你好,有个疑问:在我理解中的 TCP 连接需要四元组(client ip, client port, server ip, server port)保证连接的唯一性,那浏览器是怎么对同一服务器(server ip, server port 不变)创建多个 TCP 连接的? 浏览器只有一个网络进程且 client ip 不变,是不是在创建连接的时候,会监听多个 client port 以保证4元组的唯一?展开共 4 条评论8
- 行云流水2019-08-221.按照老师说的,至少在浏览器中 http是在 tcp的传输阶段。不是每一层独立完成后交给下一层。OSI七层模型只是一个参考,浏览器只是参考OSI模型实现,不一定遵守OSI的层级关系? 2. 上一节有一个同学提问说的,针对数据包实时渲染问题。老师说在TCP层就解决了丢包和顺序问题。但现在HTTP是在TCP层的传输层中使用。不明白怎么解决丢包和顺序问题?共 1 条评论8
- stanlee2019-10-25老师,同一个域名同时最多只能建立 6 个 TCP 连接 是不是意思是统一域名同时只能发送6个AJAX请求吗, TCP连接和AJAX请求有什么关系吗
作者回复: 首先回答第一个问题: ”同一个域名同时最多只能建立 6 个 TCP 连接“ 指的不光是指Ajax,还包括页面中的资源加载,只要是一个域名下的资源,浏览器同一时刻最多只支持6个并行请求。 不过这是HTTP/1.1的规则,HTTP/2已经不用这套规则了,而且HTTP/2也很成熟了,有条件可以考虑切换到HTTP/2. Ajax其实就是HTTP请求,包括了XMLHttpRequest和Fetch,HTTP请求是建立在TCP协议之上的。
共 3 条评论6 - 张舵主2019-08-13老师您好,我有2个问题:1,浏览器缓存DNS的解析结果,这个缓存是缓存到浏览器进程中吗?是不是浏览器关闭后浏览器的这个DNS的缓存也一起清除了?2,浏览器打开某个站点页面后,这个页面里面还有很多的域名需要解析例如一些图片的链接,这些解析结果都会缓存吗?
作者回复: 第一个问题:dns缓存是保存浏览器本地的,下次启动依然有结果! 第二个问题:图片和其他域名都一样的,都会缓存的
7 - 大桥2号2020-07-301. 返回请求 (响应行,响应头,响应体) - 其中响应行包括HTTP协议版本和状态码,也包含其他信息,例如 缓存信息 cache-control, etag等 以及cookie 2. 断开连接 (断开TCP连接) 但是如果在头信息中加入 Connection : Keep-Alive就一直保持连接 - 关于缓存 - DNS 缓存比较简单,主要是浏览器在本地把对应IP和域名管理起来 - 浏览器资源缓存 - 服务器通过响应头`Cache-Control`字段设置是否缓存该资源 例如`Cache-Control: Max-age=2000`; - 缓存如果未过期再次请求直接拿缓存 - 缓存如果过期,再次请求时浏览器会继续发起网络请求并且在HTTP请求头携带 `If-None-Match: '4f80f-13c-3a1xb12a'` - 服务器根据这个请求头的值判断请求的资源是否有更新,如果更新会直接返回,没有更新会走缓存 - 协商缓存还可以通过设置字段`Last-Modified`第一次访问资源,服务器返回资源的同时,响应头中设置 Last-Modified(服务器上的最后修改时间),浏览器接收后,缓存文件和响应头; **下一次请求这个资源,浏览器检测到有 Last-Modified,于是添加If-Modified-Since请求头,值就是Last-Modified中的值**; 服务器再次收到这个资源请求,会**根据 If-Modified-Since 中的值与服务器中这个资源的最后修改时间对比**,如果没有变化,返回304和空的响应体,直接从缓存读取,如果If-Modified-Since的时间小于服务器中这个资源的最后修改时间,说明文件有更新,于是返回新的资源文件和200;`If-Modified-Since : <last_modified_value>` 但是Last-Modified 只能以秒计时,如果在不可感知的时间内修改完成文件,那么服务端会认为资源还是命中了,不会返回正确的资源; - **Etag**是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成),只要资源有变化,Etag就会重新生成;下一次加载资源向服务器发送请求时,会将上一次返回的Etag值放到请求头If-None-Match里,服务器只需要比较客户端传来的**If-None-Match**跟自己服务器上该资源的ETag是否一致,就能很好地判断资源相对客户端而言是否被修改过了。如果服务器发现ETag匹配不上,那么直接以常规GET 200回包形式将新的资源(当然也包括了新的ETag)发给客户端;如果ETag是一致的,则直接返回304知会客户端直接使用本地缓存即可。`IF-None-Match: <etag_value>`展开共 1 条评论5