使用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里就会有捕获的数据包,如下图所示。
![](https://img.haomeiwen.com/i28984750/8d7d07a8decb8cff.jpg)
如果你还没有搭好实验环境,或者捕获与本文里的不一致也没关系。我把这次捕获的数据存成了pcap包, 文件名是“08-1”,放到了GitHub上,你可以下载到本地后再用Wireshark打开,完全精确“重放”刚才的 HTTP传输过程。
抓包分析
HTTP协议运行在TCP/IP基础上,依靠TCP/IP协议实现数据的可靠传输,所以浏览器要用HTTP协议收发数据,首先要做的是建立TCP连接
地址栏里 直接输入IP地址, WEB服务器的默认端口是80,所以浏览器需依照TCP协议的规范,使用 "三次握手"建立与Web服务器的连接
对应到Wireshark里,就是最开始的三个抓包,浏览器使用的端口是52085,经过SYN、SYN/ACK、ACK的三个包之后,浏览器与服务器的TCP连接就建立起来了
![](https://img.haomeiwen.com/i28984750/5b42dfc115cc3fde.jpg)
再简要讲述一下这次最简单的浏览器HTTP请求过程:
1.浏览器从地址栏的输入中获得服务器的IP地址和端口号;
2.浏览器用TCP的三次握手与服务器建立连接;
3.浏览器向服务器发送拼好的报文;
4.服务器收到报文后处理请求,同样拼好报文再发给浏览器;
5.浏览器解析报文, 渲染输出页面
使用域名访问WEB服务器
把地址栏的输入改成“http://www.chrono.com”,重复Wireshark抓包过程,你会发现,好像没有什么不同,浏览器上同样显示出了欢迎界面,抓到的包也同样是11个:先是三次握手,然后是两次HTTP传输
浏览器看到了网址里的“www.chrono.com”,发现它不是数字形式的IP地址,那就肯定是域名了,于是就会发起域名解析动作,通过访问一系列的域名解析服务器,试图把这个域名翻译成TCP/IP协议里的IP地址
不过因为域名解析的全过程实在是太复杂了,如果每一个域名都要大费周折地去网上查一下,那我们上网肯定会慢得受不了。
所以,在域名解析的过程中会有多级的缓存,浏览器首先看一下自己的缓存里有没有,如果没有就向操作系统的缓存要,还没有就检查本机域名解析文件hosts, /etc/hosts
流程图如下:
![](https://img.haomeiwen.com/i28984750/1032b439bcedf2c7.jpg)
真实的网络世界
![](https://img.haomeiwen.com/i28984750/687d22135992d0ff.jpg)
接入网络的同时,网络运行商会给你的设备分配一个IP地址,这个地址可能是静态分配的,也可能是动态分配的。静态IP就始终不变。
假设你要访问的是Apple网站,显然你是不知道它的真实IP地址的,在浏览器里只能使用域名“www.apple.com”访问,那么接下来要做的必然是域名解析。这就要用DNS协议开始从操作系统、本地DNS、根DNS、顶级DNS、权威DNS的层层解析,当然这中间有缓存,可能不会费太多时间就能拿到结果。
别忘了互联网上还有另外一个重要的角色CDN,它也会在DNS的解析过程中“插上一脚”。DNS解析可能会给出CDN服务器的IP地址,这样你拿到的就会是CDN服务器而不是目标网站的实际地址。
目标网站服务器对外表现是一个IP地址,但为了能够扛住高并发,在内部也是一套复杂的架构。通常在入口是负载均衡设备,例如四层的LVS或者七层的Nginx,在后面是许多的服务器,构成一个更强更稳定的集群。
负载均衡设备会先访问系统里的缓存服务器,通常有memory级缓存Redis和disk级缓存Vanish,
它的作用与CDN类似,不过是工作在内部网络里,把最频繁访问的数据缓存几秒钟或几分钟,减轻后端服务器的压力。
如果缓存服务器里也没有,那么负载均衡设备就要把请求转发给应用服务器了。这里就是各种开发框架大显神通的地方了,例如Java的Tomcat/Netty/Jetty,Python的Django,还有PHP、Node.js、Golang等等。它们又会再访问后面的MySQL、PostgreSQL、MongoDB等数据库服务,实现用户登录、商品查询、购物下单、扣款支付等业务操作,然后把执行的结果返回给负载均衡设备,同时也可能给缓存服务器里也放一份。
应用服务器的输出到了负载均衡设备这里,请求的处理就算是完成了,就要按照原路再走回去,还是要经过许多的路由器、网关、代理。如果这个资源允许缓存,那么经过CDN的时候它也会做缓存,这样下次同样的请求就不会到达源站了。
最后网站的响应数据回到了你的设备,它可能是HTML、JSON、图片或者其他格式的数据,需要由浏览器解析处理才能显示出来,如果数据里面还有超链接,指向别的资源,那么就又要重走一遍整个流程,直到所有的资源都下载完
小结
1.HTTP协议基于底层的TCP/IP协议,所以必须要用IP地址建立连接
2.如果不知道IP地址,就要用DNS协议去解析得到IP地址, 否则就会连接失败
3.建立TCP连接后会顺序收发数据,请求方和应答方都必须依据HTTP规范构建和解析报文
4.为了减少响应时间,整个过程中每一个环节都会有缓存,能够实现"短路"操作
5.虽然现实中的HTTP传输过程非常复杂,但理论上仍然可以简化成实验室里的"两点"模型
网友评论