透视HTTP协议
罗剑锋(Chrono)
奇虎360技术专家,Nginx/OpenResty开源项目贡献者
立即订阅
6077 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词|To Be a HTTP Hero
免费
破冰篇 (7讲)
01 | 时势与英雄:HTTP的前世今生
02 | HTTP是什么?HTTP又不是什么?
03 | HTTP世界全览(上):与HTTP相关的各种概念
04 | HTTP世界全览(下):与HTTP相关的各种协议
05 | 常说的“四层”和“七层”到底是什么?“五层”“六层”哪去了?
06 | 域名里有哪些门道?
07 | 自己动手,搭建HTTP实验环境
基础篇 (7讲)
08 | 键入网址再按下回车,后面究竟发生了什么?
09 | HTTP报文是什么样子的?
10 | 应该如何理解请求方法?
11 | 你能写出正确的网址吗?
12 | 响应状态码该怎么用?
13 | HTTP有哪些特点?
14 | HTTP有哪些优点?又有哪些缺点?
进阶篇 (8讲)
15 | 海纳百川:HTTP的实体数据
16 | 把大象装进冰箱:HTTP传输大文件的方法
17 | 排队也要讲效率:HTTP的连接管理
18 | 四通八达:HTTP的重定向和跳转
19 | 让我知道你是谁:HTTP的Cookie机制
20 | 生鲜速递:HTTP的缓存控制
21 | 良心中间商:HTTP的代理服务
22 | 冷链周转:HTTP的缓存代理
安全篇 (7讲)
23 | HTTPS是什么?SSL/TLS又是什么?
24 | 固若金汤的根本(上):对称加密与非对称加密
25 | 固若金汤的根本(下):数字签名与证书
26 | 信任始于握手:TLS1.2连接过程解析
27 | 更好更快的握手:TLS1.3特性解析
28 | 连接太慢该怎么办:HTTPS的优化
29 | 我应该迁移到HTTPS吗?
飞翔篇 (4讲)
30 | 时代之风(上):HTTP/2特性概览
31 | 时代之风(下):HTTP/2内核剖析
32 | 未来之路:HTTP/3展望
33 | 我应该迁移到HTTP/2吗?
探索篇 (5讲)
34 | Nginx:高性能的Web服务器
35 | OpenResty:更灵活的Web服务器
36 | WAF:保护我们的网络服务
37 | CDN:加速我们的网络服务
38 | WebSocket:沙盒里的TCP
总结篇 (2讲)
39 | HTTP性能优化面面观(上)
40 | HTTP性能优化面面观(下)
答疑篇 (2讲)
41 | Linux/Mac实验环境搭建与URI查询参数
42 | DHE/ECDHE算法的原理
结束语 (1讲)
结束语 | 做兴趣使然的Hero
透视HTTP协议
登录|注册

08 | 键入网址再按下回车,后面究竟发生了什么?

Chrono 2019-06-14
经过上一讲的学习,你是否已经在自己的电脑上搭建好了“最小化”的 HTTP 实验环境呢?
我相信你的答案一定是“Yes”,那么,让我们立刻开始“螺蛳壳里做道场”,在这个实验环境里看一下 HTTP 协议工作的全过程。

使用 IP 地址访问 Web 服务器

首先我们运行 www 目录下的“start”批处理程序,启动本机的 OpenResty 服务器,启动后可以用“list”批处理确认服务是否正常运行。
然后我们打开 Wireshark,选择“HTTP TCP port(80)”过滤器,再鼠标双击“Npcap loopback Adapter”,开始抓取本机 127.0.0.1 地址上的网络数据。
第三步,在 Chrome 浏览器的地址栏里输入“http://127.0.0.1/”,再按下回车键,等欢迎页面显示出来后 Wireshark 里就会有捕获的数据包,如下图所示。
如果你还没有搭好实验环境,或者捕获与本文里的不一致也没关系。我把这次捕获的数据存成了 pcap 包,文件名是“08-1”,放到了 GitHub 上,你可以下载到本地后再用 Wireshark 打开,完全精确“重放”刚才的 HTTP 传输过程。

抓包分析

在 Wireshark 里你可以看到,这次一共抓到了 11 个包(这里用了滤包功能,滤掉了 3 个包,原本是 14 个包),耗时 0.65 秒,下面我们就来一起分析一下"键入网址按下回车"后数据传输的全过程。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《透视HTTP协议》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(54)

  • -W.LI-
    浏览器判断是不是ip地址,不是就进行域名解析,依次通过浏览器缓存,系统缓存,host文件,还是没找到的请求DNS服务器获取IP解析(解析失败的浏览器尝试换别的DNS服务器,最终失败的进入错误页面),有可能获取到CDN服务器IP地址,访问CDN时先看是否缓存了,缓存了响应用户,无法缓存,缓存失效或者无缓存,回源到服务器。经过防火墙外网网管路由到nginx接入层。ng缓存中存在的直接放回,不存在的负载到web服务器。web服务器接受到请后处理,路径不存在404。存在的返回结果(服务器中也会有redis,ehcache(堆内外缓存),disk等缓存策略)。原路返回,CDN加入缓存响应用户。

    作者回复: 说的非常详细。

    2019-06-14
    1
    21
  • 郭凯强
    作业:
    1. 浏览器判断这个链接是要在当前页面打开还是新开标签页,然后走一遍本文中的访问过程:拿到ip地址和端口号,建立tcp/ip链接,发送请求报文,接收服务器返回并渲染。
    2. 先查浏览器缓存,然后是系统缓存->hosts文件->局域网域名服务器->广域网域名服务器->顶级域名服务器->根域名服务器。这个时间通常要很久,最终找不到以后,返回一个报错页面,chrome是ERR_CONNECTION_ABORTED

    作者回复: 回答的比较全面。

    这里面还有个长连接的问题,后面会讲,如果连接还是本站就不会有建连过程,直接用已有的连接发请求。

    2019-06-14
    1
    7
  • 极客时间
    我有几个小疑问没搞明白,万望老师解答, 在进行DNS解析的时候,操作系统和本地DNS是如何处理的呢?
    我的理解是本地系统有可能有缓存,DNS解析前先查看本地有没有缓存,如果没有缓存,再进行本地DNS解析,本地DNS解析就是查找系统里面的hosts文件的对应关系。不知道这里理解的对不对。

    还有一个疑问。
    什么是权威DNS呢,我一般是在万网购买域名,然后用A记录解析到我的服务器,这个A记录提交到哪里保存了呢,这里的万网扮演的是什么角色呢?它和权威DNS有关系吗?

    上次我提到了一个问题,就是域名和ip的对应关系,没接触这个课程以前,我的理解是一个域名只能解析到一个ip地址,但是一个ip地址可以绑定多个域名,就像一个人只有一个身份证号码,但是可以有多个名字,但是我在用ping命令 ping‘ baidu.com’ 时,发现 可以返回不同的ip,结合本课程前面的文章,我理解是百度自己的服务器本质是一台DNS服务器,用DNS做了负载均衡,当我访问baidu.com时,域名解析过程中,有一个环节是到达了百度的DNS服务器,然后DNS服务器根据负载均衡操作,再将我的请求转发给目标服务器。不知道理解的对不对,或者哪里有偏差。

    作者回复: 本地dns你的理解是正确的。

    万网是个域名注册的代理机构,最终域名还是要由dns系统来解析。

    百度的理解基本正确,在真正服务器前面是dns负载均衡。

    2019-06-14
    6
  • 极客时间
    老师 我有个疑问,第四个包到第六个包,为什么又进行了一次tcp连接呢,而且这个端口号是52086,这个是浏览器的特性吗,仔细比对文章发现这个问题啊

    作者回复: 因为http/1连接传输效率低,所以浏览器一般会对同一个域名发起多个连接提高效率,这个52086就是开的第二个连接,但在抓包中只是打开了,还没有传输。

    到后面讲长连接的时候你就会明白了。

    2019-06-14
    1
    4
  • 四月的紫色花
    1.你能试着解释一下在浏览器里点击页面链接后发生了哪些事情吗?
    浏览器点击页面请求后,正常网络中都是域名,那么浏览器会先用DNS解析一下,拿到服务器的ip和端口,去请求服务器前会先找一下缓存,浏览器自己的缓存-操作系统缓存-本地缓存(Hosts),都没有的话就会到根域名服务器-顶级-权威,当然中间可能有类似CDN这样的代理,那它就可以取CDN中的服务器地址,总的来说,其实就是个“走近道”的过程,就近原则,在DNS不错的情况下,先从离自己近的查起,再一级一级往下。
    2.这一节课里讲的都是正常的请求处理流程,如果是一个不存在的域名,那么浏览器的工作流程会是怎么样的呢?
    如果是一个不存在的域名,那浏览器还是会从DNS那解析一下,发现,自己,操作系统,本地的缓存都没有,CDN里也没有,根域名,顶级域名,权威域名,非权威域名里
    都没有,那它就放弃了,不会建立链接,返回错误码,可能是4××类的客户端请求错误。

    作者回复: 回答的很认真,鼓励一下。

    第二个问题后面有误,因为dns解析失败,根本没有进入http处理流程,所以不会有4xx之类的错误,而是dns解析错误信息。

    2019-07-30
    1
    2
  • 陈1016
    第一个问题的回答:浏览器缓存、系统缓存、hosts文件、野生DNS服务器(本地DNS服务器)、根DNS、顶级DNS、权威DNS、本地(附近)CDN、源站。

    作者回复: √

    2019-06-27
    2
  • 肥low
    1、如果域名不是ip,需要走域名解析成ip的逻辑,优先级顺序为: 1 浏览器缓存 > 2 本地hosts > 3 系统缓存 > 4 根域名 > 5 顶级dns服务器(如 com) > 6 二级dns服务器(baidu.com) > 7 三级dns服务器(www.baidu.com),如果客户端指向的dns服务器为非官方的如 8.8.8.8,那在第4步之前可能还有一层cache,当然最后解析的ip有可能是cdn的,如果cdn失效了就直接穿透到源ip,当然这个服务器这一部分可能做了四层负载均衡的设置,所以有可能每次获取的服务器ip都不一祥,也有可能到了服务器ngx层做了七层转发,所以虽然获得的ip一样,但是内部可能转发给了很多内网服务器

    2、通过中间各种路由器的转发,找到了最终服务器,进行tcp三次握手,数据请求,请求分两种一种是uri请求,一种是浏览器咸吃萝卜淡操心的请求网站图标ico的资源请求,然后服务端收到请求后进行请求分析,最终返回http报文,再通过tcp这个连接隧道返回给用户端,用户端收到后再告诉服务端已经收到结果的信号(ack),然后客户端有一套解析规则,如果是html,可能还有额外的外部连接请求,是跟刚才的请求流程是同理的(假设是http1.1),只不过没有了tcp三次握手的过程,最终用户看到了百度的搜索页面。当然如果dns没解析成功,浏览器直接就报错了,不会继续请求接下来的资源

    作者回复: 非常详细,赞!!

    2019-06-17
    1
    2
  • keep it simple
    老师,学习这一章萌生出几个问题:
    1.如果在TCP连接保持的情况下某一方突然断电了,没有机会进行TCP 四次挥手,会出现什么情况呢?
    2.如果不主动关浏览器,TCP连接好像一直存在着,会有超时时间吗?中间是否会保活?
    3.若server端负载较高,当它收到client的SYN包时,是否要过一段时间才会回应SYN,ACK?

    作者回复:
    1.tcp收发数据有超时机制,超时没有响应就会断开连接,当然这个就不是正常的结束连接。

    2.tcp收发有超时,连接本身没有超时机制,http使用keepalive在tcp上实现了连接保活。

    3.tcp建连是在操作系统内核里实现的,有一个处理队列,如果并发的请求太多,就会排队等待。

    4.这些问题涉及的都是tcp比较底层的细节,我也不能很好的解释清楚,建议再去参考其他的资料,sorry。

    2019-11-27
    1
  • nora
    有个疑问是,如果DNS解析得到的IP已经失效,并不是当前最新的IP,会发生什么呢?
    作者回复: 那就会在tcp层次发生连接失败,或者连接到了错误的其他网站。

    老师,接这个问题,提出两个疑问
    1. 发生链接错误时,会重新进行DNS解析嘛?
    2. 假如连接到了错误的IP,那么什么时候会更新成为正确的IP呢?或者有什么办法可以更正DNS的解析错误

    作者回复:
    1.不会,因为一次请求已经完成了,这种错误计算机不会认为是dns错误,因为处理流程都是正确的,只是得到的ip地址数据错误。

    2.可以手动改hosts,强行指定正确的ip,或者等待dns服务恢复正常,后者在dns被污染的时候就很难说了。

    2019-11-25
    1
    1
  • 错夕
    关于浏览器回车发生了什么我觉得应该关注的是
    1.是否一定会进行DNS解析如果有缓存这个时候该怎么办
    2.是否一定会进行TCP链接
    3.收到服务器相应报文一定会解析dom进行渲染吗?如果返回304呢
    4.TCP链接何时关闭

    作者回复:
    1.如果输入的不是ip地址,那么必然会做dns解析,否则没有ip就无法访问。而dns解析有可能会直接从缓存里取,不一定会走到解析服务器。

    2.必须要有tcp连接,因为互联网和http就建立在tcp/ip之上。

    3.这个与客户端有关,如果用的是curl这样的命令行就没有渲染。

    4.短连接会立即关闭连接,而长连接会保持较长的时间,直到客户端或者服务器某一方主动断开连接。

    2019-09-29
    1
  • qiezitx
    作业
    1、浏览器判断是否输入的是ip地址,不是的话就进行DNS解析:浏览器缓存->操作系统缓存(看到老师后面的解释是缓存)->host文件->根DNS->顶级DNS->权威DNS;如果是就开始访问的过程:拿到ip和端口号->3次握手建立TCP连接->发送请求->服务端返回结果->浏览器解析渲染。
    这里有几个课外小贴士的实验和疑问:
    1、ip要么直接输入要么通过DNS解析拿到,但端口号呢?默认端口号不行的时候,会尝试其他候选么?
    2、经试验,确实有缓存,刷新访问会返回304 not Modified
    3、经试验,没抓到favicon.ico的流程,chrome可能秘密发送了🐶

    2、同留言:属于dns解析错误

    作者回复:
    1.如果uri里没有端口号,默认用80或者8080、443,但如果在这两个端口上不提供http服务,那浏览器就猜不出来,只能用户手动输入。比如后面安全篇里,就用了442等端口,必须手动输入。

    2.实验出真知。

    3.有的时候浏览器也不会发favicon请求,可能已经缓存了,这跟浏览器的工作流程有关,不必太在意。

    2019-09-24
    1
  • 陈波
    你好,罗老师
    我在本地测试了一下,结果有点不解
    1、浏览器上访问了一次127.0.0.1,发起了两次:三次握手,四次握手;但没有访问/favicon.ico;对应端口分别是52181->80、52182->80。
    2、52181在四次挥手是服务端先发起了:[FIN,ACK],客户端:[ACK],[FIN,ACK],服务端:[ACK],和你画的四次挥手顺序不对,52182和52181四次挥手顺序保持一致。

    作者回复:
    1.这是浏览器建立了两个并发连接,没有访问favicon也是正常的,跟浏览器有关。

    2.这个应该是服务器主动关闭连接。

    3.课程里的示例是挑选了一个最典型的场景,并不是所有的请求响应都会按照这个来。

    2019-08-17
    1
  • Cris
    老师图里的SYN和ACK是什么意思?

    作者回复: 是tcp里的握手包。

    2019-08-13
    1
  • 温木
    老师,我有一个问题请教。
    DNS域名解析不需要发请求,建立连接吗?本地缓存的dns除外。
    比如我第一次访问一个域名abc.com,那这第一次不是需要从dns服务器上拿真正的IP吗,去拿IP的这个过程不是应该也是一个请求吗?这个请求又是什么请求呢?

    作者回复: dns请求是专门的dns协议,使用udp发送,因为是udp所以不需要建立连接。

    2019-08-06
    1
  • 京东PLUS会员
    老师我想请教您一个问题,为什么我用wireshare抓包做上面的实验,每次都会重复一遍三次握手的过程

    作者回复: 那就是没有使用长连接,每次都重连服务器,所以有三次握手。

    你可以试试打开页面后不要关闭,刷新看看,这样就不会有握手信息,而是直接发请求。

    2019-07-13
    1
  • Geek_Wison
    老师,你好。我记得以前在教材里面,客户端在与服务器端建立TCP连接的时候,会发送一个SYN置为1的TCP报文段。但是在wireshark里面我看到的第一条TCP报文段怎么SYN=0?

    作者回复: 这个是wireshark重新修改了起始值,方便查看,我觉得这个不用太在意,毕竟我们研究的是http这样的应用层协议。

    2019-06-15
    1
  • 隰有荷
    老师,文中在讲解请求Apple网站的例子时,说到:
    "这就要用 DNS 协议开始从操作系统、本地 DNS、根 DNS、顶级 DNS、权威 DNS 的层层解析"。
    而我看前几天的内容总结的是,请求会在进入网络后先到达非权威DNS、权威DNS、顶级…、最后才是到达根DNS去解析,那么本文怎么是先从根DNS开始的呢?

    作者回复: 今天的这讲是简化的说法,没有那么精确,完整的dns解析以第6讲为准。

    另外,dns解析通常是先到非权威dns,然后是根dns->顶级dns->权威dns,你可以再回顾一下。

    2019-06-15
    1
  • 业余草
    老师很有责任感!期待后面的内容!

    作者回复: thanks.

    2019-06-14
    1
  • xing.org1^
    老师请问,输入一个地址按下回车,浏览器把页面请求发送出去,服务器响应后返回html,浏览器在接受到html后就会立即发生四次挥手吗?还是说会延迟一会,遇到link、img等这些带外链的标签后继续去发送请求(省去dns解析和ip寻址?),最终确定html中没有外链请求了才会断开链接呢?

    作者回复: 现在的http都是长连接,不会立即断开连接,尽量复用,因为握手和挥手的成本太高了。

    2019-06-14
    1
    1
  • 疯狂咸鱼
    老师,如果我点击wireshark停止按钮再次抓报,好像就不是从3次握手开始了、

    作者回复: 是的,因为http/1.1默认使用长连接,没有关闭连接,所以不需要再次握手,可参考后面的课程。

    2019-12-06
收起评论
54
返回
顶部