一个URL之旅

一个URL之旅

在整个过程中,大致可以分为以下几个过程

  1. DNS域名解析
  2. TCP连接
  3. HTTP请求
  4. 处理请求返回HTTP响应
  5. 页面渲染
  6. 关闭连接

?

DNS域名解析

在浏览器输入网址后,首先要经过域名解析,因为浏览器并不能直接通过域名找到对应的服务器,而是要通过 IP 地址。大家这里或许会有个疑问----计算机既可以被赋予 IP 地址,也可以被赋予主机名和域名。比如 www.hackr.jp。那怎么不一开始就赋予个 IP 地址?这样就可以省去解析麻烦。我们先来了解下什么是 IP 地址。

IP 地址是指互联网协议地址,是 IP Address 的缩写。IP 地址是 IP 协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。IP 地址是一个 32 位的二进制数,比如 127.0.0.1 为本机 IP。

域名就相当于 IP 地址乔装打扮的伪装者,带着一副面具。它的作用就是便于记忆和沟通的一组服务器的地址。用户通常使用主机名或域名来访问对方的计算机,而不是直接通过 IP 地址访问。因为与 IP 地址的一组纯数字相比,用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯。但要让计算机去理解名称,相对而言就变得困难了。因为计算机更擅长处理一长串数字。为了解决上述的问题,DNS 服务应运而生。

DNS 协议提供通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。DNS 是一个网络服务器,我们的域名解析简单来说就是在 DNS 上记录一条信息记录。

????例如 baidu.com 220.114.23.56(服务器外网IP地址)80(服务器端口号)

TCP三次握手

????参见之前的博文https://www.cnblogs.com/kexinxin/p/11608201.html

HTTP请求

请求方法

下面只列举了 HTTP/1.1 支持的方法。


方法


说明


备注


GET


获取资源

?

POST


传输实体主体

?

DELETE


删除文件


不带验证机制,任何人都可以删除


PUT


传输文件


不带验证机制,任何人都可以上传,存在安全问题


TRACE


追踪路径


容易引发 XSL 跨站攻击


HEAD


获得报文首部

?

OPTIONS


询问支持方法


查询针对请求 URI 指定的资源支持的方法,响应如 Allow: GET,POST,HEAD


CONNECT


要求用隧道协议连接代理


主要使用 SLL 和 TLS 协议把通信内容加密后经网络隧道传输

?

请求的报文例子

处理请求返回HTTP响应

在JavaWeb项目中通常以Tomcat作为服务器,这里说明一下Tomcat的处理请求以及返回HTTP响应的过程。

Tomcat是运行在JVM中的一个进程。它定义为中间件,是JavaWeb项目与JVM之间的中间容器。JavaWeb项目的本质,是一大堆的资源文件和方法。Web项目没有入口方法(main方法),意味着Web项目中的方法不会自动运行起来。Web项目部署进Tomat的webapp中的目的是很明确的,那就是希望Tomcat去调用写好的方法去为客户端返回需要的资源和数据。Tomcat可以运行起来,并调用写好的方法。那么,Tomcat一定有一个main方法。对于Tomcat而言,它并不知道我们会有什么样的方法,这些都只是在项目被部署进webapp下后才确定的,由此分析,必然用到了Java的反射来实现类的动态加载、实例化、获取方法、调用方法。但是我们部署到Tomcat中的Web项目必须按照规定好的接口来进行编写,以便进行调用。实现请求响应的类主要为JavaWeb项目中的Servlet类的doGet()方法和doPost()方法,因此也是Tomcat重点管理的对象,其生命周期实例化、初始化、调用、销毁受控于Tomcat容器,由Tomcat进行管理,因此Tomcat也叫做servlet容器。

Tomcat的架构图如下

????Tomcat通过java的Sockect编程监听8080端口,处理由HTTP请求,这一部分通过Connector(连接器)来进行处理请求包括解析连接、解析请求、解析请求头。后启动HttpProcessor的process进行处理。在process方法中调用container的invoke方法,invoke方法利用解析到请求利用java反射的机制将相应的servlet加载进行内存调用servlet的service方法,而service方法又根据请求调用相应的doGet或doPost方法。doGet和doPost方法中包含了用户业务的逻辑处理代码。Tomcat会将JavaWeb中的jsp视图文件也编译为servlet文件,封装的网络socket的输出流到Response,最后通过Response将最终的html元素写到输出流中

最后浏览器得到HTTP请求的响应如下

页面渲染

浏览器从服务器拿到了想要访问的资源,大多数时候,这个资源就是HTML页面,当然也可能是一个其他类型的文件。

浏览器先对HTML文档进行解析,生成解析树(以DOM元素为节点的树)。

加载页面的外部资源,比如JS、CSS、图片。

遍历DOM树,并计算每个节点的样式,最终完成渲染,变成我们看到的页面。

?

关闭连接TCP四次挥手

参见之前的博文https://www.cnblogs.com/kexinxin/p/11608201.html

原文地址:https://www.cnblogs.com/kexinxin/p/11657813.html

时间: 2024-08-30 10:46:21

一个URL之旅的相关文章

解释一下,在你往浏览器中输入一个URL后都发生了什么,要尽可能详细(转)

原文链接:解释一下,在你往浏览器中输入一个URL后都发生了什么,要尽可能详细 题目 一步一步解释一下,在你往浏览器中输入一个URL后都发生了什么,要尽可能详细. 解答 这道题目没有所谓的完全的正确答案,这个题目可以让你在任意的一个点深入下去, 只要你对这个点是熟悉的.以下是一个大概流程: 浏览器向DNS服务器查找输入URL对应的IP地址. DNS服务器返回网站的IP地址. 浏览器根据IP地址与目标web服务器在80端口上建立TCP连接 浏览器获取请求页面的html代码. 浏览器在显示窗口内渲染H

使用UrlConnection请求一个url地址获取内容

访问网络需要加Internet权限:android.permission.INTERNET 使用UrlConnection请求一个url地址获取内容:             //1.创建一个Url对象                 URL url = new URL(url_str);             //2.获取一个UrlConnection对象                 HttpURLConnection connection = (HttpURLConnection)ur

python-获得一个URL地址的扩展名

获得一个URL地址的扩展名 如:http://www.cnblogs.com/fnng/archive/2013/05/20/3089816.html  的扩展名为html对于这个问题同样使用正则式来解决 import re def strings(url): listt = ['.php','.html','.asp','.jsp'] for lis in listt: suffix = re.findall(lis,url) //re.findall(pattern, string[, fl

一个Swing程序,用来判断一个URL页面内包含的好链接和坏链接数目

入口类 import java.awt.Dimension; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; imp

.net 4.5版本WebRequest和Webclient中的一个url转义bug

有时我们把一个url带入到另一个url中作为参数,这个参数就需要转义.比如: http://www.baidu.com/s?wd=http%3A%2F%2Fwww.baidu.com 在代码中进行访问这段地址的时候,我们也会期望它照着给的地址访问,在.net 4.0中,确实会如此. 但是如果切换为.net 4.5版本,你就会发现你访问的url实际变成了: http://www.baidu.com/s?wd=http:%2F%2Fwww.baidu.com 大多数情况下它不会造成什么影响. 但一旦

iOS网络: 通过NSMutableURLRequest修改一个URL的请求

问题: 一个URL 请求可以改变也可以不变.一个可变的URL 请求可以在其初始化之后再进行修改,而不可变的URL 请求是不可以修改的. 你可以通过 NSMutableURLRequest 创建可修改的URL 请求. 例子: 在分配和初始化了请求之后修改请求 URL 的 timeout NSString *urlAsString = @"http://www.apple.com"; NSURL *url = [NSURL URLWithString:urlAsString]; NSMut

编写一个C语言函数,要求输入一个url,输出该url是首页、目录页或者其他url

编写一个C语言函数,要求输入一个url,输出该url是首页.目录页或者其他url 首页.目录页或者其他url 如下形式叫做首页: militia.info/ www.apcnc.com.cn/ http://www.cyjzs.comwww.greena888.com/ www.800cool.net/ http://hgh-products.my-age.net/ 如下形式叫做目录页: thursdaythree.net/greenhouses--gas-global-green-house-

在URL中使用另一个url作为参数时会被`&`截断的问题

在URL中使用另一个url作为参数时会被&截断的问题 下午帮同事写一个url转二维码的小工具时,发生标题中描述的问题.比如:输入的url是http://www.example.dev/name=user&code=2000,转换为二维码后,扫描得到的url却是http://www.example.dev/name=user,&后的部分没有正确转换.问题很明显,作为参数的url中的&后的被解析为其他参数了. 前台请求的完整url是"http://{domain}/t

不定期更新的新问题(http协议当你在浏览器里输入一个url后发生了什么?)

HTTP协议: 超文本传输协议是互联网上应用最为广泛的一种网络协议 https是以安全为目标的http通道,就是http的安全版 为什么会有这个协议呢? 为了建立客户端与服务器的连接,让两者进行沟通 自我理解:让计算机按照规矩说话,你问我答,你怎么问我怎么答,否则计算机会各说各话没办法沟通 http是通过报文进行沟通的 请求报文:请求头.请求行.请求体 响应报文:响应头.响应行.响应体 请求头:Accept:指定客户端能够接收的内容类型.Cache-Control:指定请求和响应遵循的缓存机制.