文章目录
在此之前我们先来了解清楚URL 和URI的区别和联系吧
URI(统一资源标识符)和URL(统一资源定位符)
URL定义
在万维网上,每一个信息资源在网络上都有统一且在网上唯一的地址,该地址就叫UEL(Unifrom Resourse Locator),它是www的统一资源定位标志,就是指网络地址
URL格式
在URL中的字符对大写或小写没有要求
- URL由三部分组成:资源类型、存放资源的主机域名、资源文件名
- 另一种说法:协议、主机、端口、路径.
- 使用HTTP的URL的一般格式
URL的一般语法格式为:(带方括号[]的为可选项):
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
- 例如http://www.baidu.com:80/
解剖URL各个字段的含义
- protocol(协议)
协议名 | 用途 |
---|---|
http | 通过HTTP访问资源,格式HTTP:// |
https | 通过安全的HTTPS访问该资源,格式HTTPS:// |
此处只列举出了两种协议,并非只有这两种
- hostname(主机名)
是指存放资源的服务器的域名系统(DNS)主机名或IP地址.有时,在主机名前也可以包含连接到服务器所需的用户名和密码(格式:username:password@hostname)
- port(端口号)
http的默认端口是80
- path(路径)
由零个或者多个“/” 字符隔开的字符串,一般用来表示主机上的一个目录或文件地址.
- parameters(参数)
这是用于指定特殊参数的可选项
- query(查询)
可选,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/ASP。NET等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。
- fragment(信息片段)
字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。
关于URI
- 在电脑术语中,统一资源标识符(Uniform Resource Identifier,URI)是一个用于标识某一互联网资源名称的字符串。
- 该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。URI由包括确定语法和相关协议的方案所定义。
URI格式
- 一个绝对URI的格式
- URI格式由URI协议名(例如HTTP、FTP、mailto、file),一个冒号,和协议对应的内容所构成。
- URI文法同时也就各种原因对协议内容加以其他的限制,例如,保证各种分层协议之间的协同性。百分号编码也为URI提供附加信息。
- URL的格式由下列三部分组成
- 第一部分是协议(或称为服务方式);
- 第二部分是存有该资源的主机IP地址(有时也包括端口号);
- 第三部分是主机资源的具体地址。
- 具体URI的格式如下:
协议名]://[用户名]:[密码]@[服务器地址]:[服务器端口号]/[路径]?[查询字符串]#[片段ID]
二者的区别与联系
-
URL是一种URI,它标识一个互联网资源,并指定对其进行操作或获取该资源的方法。
-
可能通过对主要访问手段的描述,也可能通过网络“位置”进行标识。
-
URI可被视为定位符(URL),名称(URN)或两者兼备。
-
统一资源名(URN)如同一个人的名称,而统一资源定位符(URL)代表一个人的住址。换言之,URN定义某事物的身份,而URL提供查找该事物的方法。URN仅用于命名,而不指定地址。
而我们所说的URI(统一资源标识符)是用字符串标识某一互联网资源,URL表示资源的地址(互联网上所处的位置),
因此他们具有包含关系URL是URI的子集
URL和URI之间的主要区别 -
URL是统一资源定位器,用于标识资源;URI(统一资源标识符)提供了更简单和可扩展的标识资源的方法
-
URL是URI的子集
-
URL指定要使用的协议类型,而URI不涉及协议规范。
HTTP
你知道HTTP协议的用途是什么吗?
其实HTTP协议和TCP/IP协议族内的其他众多的协议相同,用于客户端和服务器之间的通信.
- 其中请求访问文本或图像等资源的一方是客户端,而提供资源响应的一端是服务器端
那么问题又来了,HTTP的报文的格式是怎样的呢?
HTTP报文格式
HTTP协议的请求报文和响应报文的结构基本相同,由三大部分组成
- 起始行:描述请求或响应的基本信息
- 头部字段集合:使用key-value形式更详细的说明报文
- 消息正文:实际传输的数据,它不一定是纯文本的,可以是图片视频等二进制数据
HTTP头字段
- 头部字段是key-value的形式存在的,key和value之间用":“分隔,最后用CRLF换行表示字段结束,比如前后分离时经常遇到的要与后端协商传输数据的类型"Content-type:applocation/json”,这里的key就是Content-type,value就是application/json.
- HTTP头字段非常灵活,不仅可以使用标准里的Host,Connection等已有头,也可以任意添加自定义头,这就给HTTP协议带来了无限的扩展可能
- 头字段注意事项
- 字段名不区分大小写,字段名里不允许出现空格,可以使用连字符"-",但不能使用下划线""(有的服务器不会解析带"“的头字段),字段名后面必须紧接着”:",不能有空格,而":"后的字段值前可以有多个空格
- 字段的顺序是没有意义的,可以任意排列不影响语义
- 字段原则上不能重复,除非这个字段本身的语义允许,例如Set_Cookie
请求报文的格式
- 基本结构简介
- 大体结构图
- 请求方法:如GET/HEAD/PUT/POST,表示对资源的操作
- 请求目标:通常是一个URI,标记了请求方法要操作的资源
- 版本号:表示报文使用的HTTP协议版本
- 抓包结果
- 对比结构图和抓包结果我们可以看到请求报文的大体格式都是固定的,其中方法名和URL既版本号都是不可或缺的.
- 其中方法 是面向对象技术中使用的专门名词.就是对所请求的对象进行的操作,因此这些方法实际上是一些命令,因此,请求报文的类型是由它所采用的方法决定的
那么请求报文的方法都有那些呢?
- HTTP请求报文方法总结
方法(操作) | 意义 |
---|---|
OPTION | 请求一些选项的信息 |
GET | 请求读取由URL所标志的信息 |
HEAD | 请求读取由URL所标志的信息的首部 |
POST | 给服务器添加信息(流程) |
PUT | 给指明的URL下存储一个文档 |
DELETE | 删除指明的URL所标志的资源 |
TRACE | |
CONNECT | 用于代理服务器 |
有请求当然就有响应了,那么http响应报文的格式是什么样的呢?
http响应报文的格式
- 基本结构简介
-
大体结构图
-
版本号:表示报文使用HTTP协议版本
-
状态码:一个三位数,用代码的形式表示处理的结果,
-
原因:作为数字状态码的补充,是更详细的解释文字,帮助人理解原因
-
抓包结果
- 其中在开始行中的短语用来对状态码进行简短的解释
那你知道HTTP 响应的状态码还有那些吗?
让我们来总结一下吧
- 首先说明状态码都是三位数字
状态码 | 含义 |
---|---|
1XX: | 表示通信信息的,如请求收到了或正在进行处理 |
2XX | 表示成功.如接受或知道了 |
3XX | 表示重定向,表示要完成请求还必须采取进一步的行动 |
4XX | 表示客户端的差错:如请求中有错误的语法或者不能完成. |
5xx | 表示服务器的差错,如服务器失效无法完成请求 |
- 其中最常见的几种如下表所示
状态码 | 含义 |
---|---|
200 | 表示OK(访问成功) |
302 | Found表示重定向/Loaction 字段表示重定向到那个url目标页(页面切换) |
303 | See Other 重定向/Loaction 字段表示重定向到那个url目标页(页面切换) |
403 | Forbidden 表示用户没有权限访问 |
502 | Bad Gateway 服务器挂了 |
504 | Gateway Timeout 服务器响应超时 |
那么HTTP会保存连接的相关信息吗?
- 答案是不会(适用于初始的网络),因为HTTP是不保存状态的协议,既无状态协议,也就是说HTTP这个协议对于发送过来的请求或响应都不做持久化处理
可是随着Web的不断发展,因无状态而导致业务处理变得棘手的情况增多了。
比如:你登录你的账号在某宝的商场购物时,即使跳到了该站的其他页面后该网站依旧能够保持你的登录状态.
那么如何才能保证这种保持状态的功能呢?
Content-Type:
描述了body的部分数据格式的类型 txt/html
Content-Length:
描述body 部分的长度(字节)
Host:
客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
User-Agent:
描述操作系统和浏览器版本信息;
手机端看到的页面并不是根据User-Agent来吐出一个单独的比较窄的页面而是完全靠前端的技术来实现(响应式编程)
referer:
当前页面是从哪个页面跳转过来的;
location:
搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
Cookie:
下面仔细介绍
Cookie(用于存储用户身份信息的结构)
- 当然了,这里的Cookie和曲奇饼没有什么关系,只是两者拼写相同而已
万维网站点使用Cookie来跟踪用户,Cookie表示在HTTP服务器和客户之间传递的状态信息
使用Cookie的网站服务器为用户产生一个唯一的识别码,网站就能够掌握该用户在该网站的活动
-
上图是我在网页端登录京东账号时的抓包结果
-
我们可以看到报文的最下面一条是Cookie字符串
-
当我点击某一款手机的时候,浏览器将带有我身份信息的Cookie字符串添加在请求报文中发送给服务器,服务器收到请求后检查发现是本人请求某个页面.
-
过程如下图
到这里就要提一下Session了
Session和Cookie/推荐阅读
那么当你往浏览器的搜索栏中输入内容之后,发生了什么事情呢?为什么你在浏览器中输入内容后,浏览器会给你返回你要的内容呢?这个过程是什么实现的呢?然我们去看看HTTP的操作过程吧
HTTP的操作过程
- 用户点击URL https://www.baidu.com/index.htm之后发生的事情
- 1.浏览器分析超链指向的页面的URL
- 2.浏览器向DNS请求解析www.baidu.com的IP地址
- 3.域名系统DNS解析出百度的IP地址
- 4.浏览器与服务器建立TCP连接
- 5.浏览器发出取文件命令,GET /index.htm。
- 6.服务器给出响应,把文件index.htm发给浏览器
- 7.TCP连接释放
- 8.浏览器显示""文件index.htm中的所有文件
注意
- HTTP协议本身是无连接的,只是它使用了面向连接的TCP向上提供的服务。