0基础建设网站,上海企业登记全程电子化服务平台,十大app开发公司,建设通网站联系电话使用 IP 地址访问 Web 服务器
首先我们运行 www 目录下的“start”批处理程序#xff0c;启动本机的 OpenResty 服务器#xff0c;启动后可以用“list”批处理确认服务是否正常运行。 然后我们打开 Wireshark#xff0c;选择“HTTP TCP port(80)”过滤器#xff0c;再鼠标…使用 IP 地址访问 Web 服务器
首先我们运行 www 目录下的“start”批处理程序启动本机的 OpenResty 服务器启动后可以用“list”批处理确认服务是否正常运行。 然后我们打开 Wireshark选择“HTTP TCP port(80)”过滤器再鼠标双击“Adapter for loopback traffic capture”开始抓取本机 127.0.0.1 地址上的网络数据。 第三步在 Chrome 浏览器的地址栏里输入“http://127.0.0.1/”再按下回车键等欢迎页面显示出来后 Wireshark 里就会有捕获的数据包如下图所示。
抓包分析
下面我们就来一起分析一下键入网址按下回车后数据传输的全过程。 HTTP 协议是运行在 TCP/IP 基础上的依靠TCP/IP 协议来实现数据的可靠传输。所以浏览器要用 HTTP 协议收发数据首先要做的就是建立 TCP 连接。 在地址栏里直接输入了 IP 地址“127.0.0.1”而 Web 服务器的默认端口是 80所以浏览器就要依照 TCP 协议的规范使用“三次握手”建立与 Web 服务器的连接。 经过 SYN、SYN/ACK、ACK 的三个包之后浏览器与服务器的 TCP 连接就建立 起来了。 有了可靠的 TCP 连接通道后HTTP 协议就可以开始工作了。于是浏览器按照 HTTP 协议规定的格式通过 TCP 发送了一个“GET / HTTP/1.1”请求报文。 随后Web 服务器回复了第五个包在 TCP 协议层面确认“刚才的报文我已经收到了”不过这个 TCP 包 HTTP 协议是看不见的。 Web 服务器收到报文后在内部就要处理这个请求。同样也是依据 HTTP 协议的规定解析报文看看浏览器发送这个请求想要干什么。 它一看原来是要求获取根目录下的默认文件好吧那我就从磁盘上把那个文件全读出来再拼成符合 HTTP 格式的报文发回去吧。这就是 Wireshark 里的第六个包“HTTP/1.1 200OK”底层走的还是 TCP 协议。 同样的浏览器也要给服务器回复一个 TCP 的 ACK 确认“你的响应报文收到了多谢”即第七个包。 这时浏览器就收到了响应数据但里面是什么呢所以也要解析报文。一看服务器给我的是个 HTML 文件好那我就调用排版引擎、JavaScript 引擎等等处理一下然后在浏览器窗口里展现出了欢迎页面。 这之后还有两个来回共四个包重复了相同的步骤。这是浏览器自动请求了作为网站图标的“favicon.ico”文件与我们输入的网址无关。但因为我们的实验环境没有这个文件所以服务器在硬盘上找不到返回了一个“404 Not Found”。 至此“键入网址再按下回车”的全过程就结束了。 这次最简单的浏览器 HTTP 请求过程 1.浏览器从地址栏的输入中获得服务器的 IP 地址和端口号 2.浏览器用 TCP 的三次握手与服务器建立连接 3.浏览器向服务器发送拼好的报文 4.服务器收到报文后处理请求同样拼好报文再发给浏览器 5.浏览器解析报文渲染输出页面。
使用域名访问 Web 服务器
刚才我们是在浏览器地址栏里直接输入 IP 地址但绝大多数情况下我们是不知道服务器 IP地址的使用的是域名那么改用域名后这个过程会有什么不同吗
还是实际动手试一下吧把地址栏的输入改成“http://www.chrono.com”重复 Wireshark 抓包过程你会发现好像没有什么不同浏览器上同样显示出了欢迎界面抓到的包也同样是 11 个先是三次握手然后是两次 HTTP 传输。 这里就出现了一个问题浏览器是如何从网址里知道“www.chrono.com”的 IP 地址就是 “127.0.0.1”的呢 浏览器看到了网址里的“www.chrono.com”发现它不是数字形式的 IP 地址那就肯定是域名了于是就会发起域名解析动作通过访问一系列的域名解析服务器试图把这个域名翻译成 TCP/IP 协议里的 IP 地址。 不过因为域名解析的全过程实在是太复杂了如果每一个域名都要大费周折地去网上查一下那我们上网肯定会慢得受不了。 所以在域名解析的过程中会有多级的缓存浏览器首先看一下自己的缓存里有没有如果没有就向操作系统的缓存要还没有就检查本机域名解析文件 hosts 刚好里面有一行映射关系“127.0.0.1 www.chrono.com”于是浏览器就知道了域名对应的 IP 地址就可以愉快地建立 TCP 连接发送 HTTP 请求了。 我把这个过程也画出了一张图但省略了 TCP/IP 协议的交互部分里面的浏览器多出了一个访问 hosts 文件的动作也就是本机的 DNS 解析。
真实的网络世界
第一个实验是最简单的场景只有两个角色浏览器和服务器浏览器可以直接用 IP 地址找到服务器两者直接建立 TCP 连接后发送 HTTP 报文通信。 第二个实验在浏览器和服务器之外增加了一个 DNS 的角色浏览器不知道服务器的 IP 地址所以必须要借助 DNS 的域名解析功能得到服务器的 IP 地址然后才能与服务器通信。
如果你用的是电脑台式机那么你可能会使用带水晶头的双绞线连上网口由交换机接入固定网络。如果你用的是手机、平板电脑那么你可能会通过蜂窝网络、WiFi由电信基站、无线热点接入移动网络。 假设你要访问的是 Apple 网站显然你是不知道它的真实 IP 地址的在浏览器里只能使用域名“www.apple.com”访问那么接下来要做的必然是域名解析。这就要用 DNS 协议开始从操作系统、本地 DNS、根 DNS、顶级 DNS、权威 DNS 的层层解析当然这中间有缓存可能不会费太多时间就能拿到结果。 别忘了互联网上还有另外一个重要的角色 CDN它也会在 DNS 的解析过程中“插上一 脚”。DNS 解析可能会给出 CDN 服务器的 IP 地址这样你拿到的就会是 CDN 服务器而不是目标网站的实际地址。 因为 CDN 会缓存网站的大部分资源比如图片、CSS 样式表所以有的 HTTP 请求就不需要再发到 AppleCDN 就可以直接响应你的请求把数据发给你。 由 PHP、Java 等后台服务动态生成的页面属于“动态资源”CDN 无法缓存只能从目标网站获取。于是你发出的 HTTP 请求就要开始在互联网上的“漫长跋涉”经过无数的路由器、网关、代理最后到达目的地。 目标网站的服务器对外表现的是一个 IP 地址但为了能够扛住高并发在内部也是一套复杂的架构。通常在入口是负载均衡设备例如四层的 LVS 或者七层的 Nginx在后面是许多的服务器构成一个更强更稳定的集群。 负载均衡设备会先访问系统里的缓存服务器通常有 memory 级缓存 Redis 和 disk 级缓存Varnish它们的作用与 CDN 类似不过是工作在内部网络里把最频繁访问的数据缓存几秒钟或几分钟减轻后端应用服务器的压力。 如果缓存服务器里也没有那么负载均衡设备就要把请求转发给应用服务器了。这里就是各种开发框架大显神通的地方了例如 Java 的 Tomcat/Netty/JettyPython 的 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 传输过程非常复杂但理论上仍然可以简化成实验里的“两点”模型。
PS本文是观看极客之后的笔记。