HTTP
- 方法
HTTP方法 | 描述 |
---|---|
GET | 向客户端发送命名资源 |
PUT | 客户端将数据发送/存储到命名服务器资源中 |
DELETE | 从服务器删除命名资源 |
POST | 客户端将数据发送到服务器网关应用程序中 |
HEAD | 仅发送命名资源响应中的 HTTP 首部 |
-
状态码
每条HTTP响应报文返回时都会携带一个三位数字的状态码,告知客户端请求是否成功,或是否需要其他动作
伴随每个状态码还有会一个“原因短语”文本,如200: OK
-
报文
HTTP 报文是一行行简单字符串组成,分为请求报文(请求头)和响应报文(响应头)都是纯文本非二进制代码。
报文一般分为三部分:起始行/首部字段/主体
结构 | 说明 |
---|---|
起始行 | 报文第一行就是起始行,在请求报文中说明要做些什么,在响应报文中说明出现神什么情况 |
首部字段 | 起始行后有 0 或多个首部字段,每个首部字段包含key: value 。首部以一个空行结束 |
主体 | 首部空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体包括了要发送给 Web 服务器的数据;响应主体中装在了要返回给客户端店的数据。包含任意类型二进制数据 |
Eg:
请求报文 | 结构 | 响应报文 |
---|---|---|
GET /text/hello.txt HTTP/1.0 | 起始行 | HTTP/1.0 200 OK |
Accept: text/* Accept-Language: en,fr | 首部 | Content-type: text/plain Content-length: 19 |
- | 主体 | Hi! I’m a message ! |
连接
报文通过传输控制协议连接 TCP 从一个地方搬移到另一个地方去。只要建立了 TCP 连接客户端与服务器之间的数据交换就不会丢失/破坏/错序
HTTP 是个应用层协议,上层应用。无需操心网络通信细节。底层协议 TCP/IP。
TCP 提供了:
- 无差错的数据传输
- 按序传输
- 未分段的数据流
1 | 2 |
---|---|
HTTP | 应用层 |
TCP | 传输层 |
IP | 网络层 |
网络也有的链路接口 | 数据链路 |
物理网络硬件 | 物理层 |
Web组件
通常情况下是 Web客户端与 Web 服务端之间通讯,还有一些其他比较重要的应用程序
- 代理
客户端 <=> 代理 <=> 服务器
代理位于两者之间,接受所有客户端HTTP,转发给服务器(可能修改请求后转发),即代理用户访问服务器 - 缓存
通常意义上说的缓存主要包含两部分。第一个是用户浏览器端的缓存,第二个是服务器端为了提高访问速度而加的CDN - 网关
网管是一种特殊的服务器,作为其他服务器的中间尸体使用。通常用于将HTTP 流量转化为其他的协议。
例如一个HTTP/FTP 网关会通过HTTP请求接收对FTP URL 的请求,但通过 FTP 协议来获取文档。得到的文档会被封装成一条 HTTP 报文,发送给客户端。
HTTP <=> HTTP/FTP网关 <=> FTP 服务器 - 隧道
盲转发 SSL - Agent 代理
用户代理:代表发起HTTP请求的客户端程序,除了常见的 Web 浏览器,还有 Web上闲逛的自动用户 Agent 代理,可以自动发布 HTTP 事务并获取内容,如 网络蜘蛛或 Web机器人,比如搜索引擎的数据库
Web服务器 Web服务器 Web服务器
\ | /
搜索引擎网络蜘蛛
|
搜索引擎数据库
URL
统一资源定位符
因特网就像一个扩张的电子信息宇宙,内涵各种不同的资源。所有类似的东西都需要一个标准化的名字,URL就是因特网资源的标准化后的名称,它指向一条条电子信息片段
URI 是一类更通用的资源标识符,包括 URL 和URN 两个子集。URL 是通过描述资源位置来识别资源的,而URN 是通过名字来识别资源的,与资源所处位置无关
一般结构:方案:// 服务器位置 / 路径
- 第一部分被称为方案
sheme
,说明了访问资源所使用的协议类型,告知Web 客户端怎样访问资源。这部分通常为HTTP
协议 - 第二部分为服务器的 IP 或域名,告知了 Web 客户端 资源位于何处
- 其余第三部分指定了
Web
服务器上的某个特定的资源
http://www.baidu.com/index.html
http
:方案(怎么做)
www.baidu.com
:主机(位于何处)
index.html
:哪个资源
方案 | 说明 |
---|---|
ftp:// | ftp 文件协议 |
mailto:xx@xx.gov | 邮件 |
rtsp:// | 流服务器资源 |
URL语法
“大多数 URL 方案的 URL 语法都建立在这个由 9 部分构成的通用格式上”。但几乎没有哪个URL包含了所有。最重要的是 方案/主机/路径
“<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>”
“
组件 | 描述 | 默认值 |
---|---|---|
方案 | 访问服务器以获取资源时要使用哪种协议 | 无 |
方案 | 访问服务器以获取资源时要使用哪种协议 | 无 |
用户 | 某些方案访问资源时需要的用户名 | 匿名 |
密码 | 用户名后面可能要包含的密码,中间由冒号(:)分隔 | <E-mail地址> |
主机 | 资源宿主服务器的主机名或点分IP地址 | 无 |
端口 | 资源宿主服务器正在监听的端口号。很多方案都有默认端口号(HTTP的默认端口号为80) | 每个方案特有 |
路径 | 服务器上资源的本地名,由一个斜杠(/)将其与前面的URL组件分隔开来。路径组件的语法是与服务器和方案有关的(本章稍后会讲到URL路径可以分为若干个段,每段都可以有其特有的组件。) | 无 |
参数 | 某些方案会用这个组件来指定输入参数。参数为名/值对。URL中可以包含多个参数字段,它们相互之间以及与路径的其余部分之间用分号(;)分隔 | 无 |
查询 | 某些方案会用这个组件传递参数以激活应用程序(比如数据库、公告板、搜索引擎以及其他因特网网关)。查询组件的内容没有通用格式。用字符“?”将其与URL的其余部分分隔开来 | 无 |
片段 | 一小片或一部分资源的名字。引用对象时,不会将frag字段传送给服务器;这个字段是在客户端内部使用的。通过字符“#”将其与URL的其余部分分隔开来 | 无 |
- 方案
方案组件必须以一个字母符号开始,由第一个:
符号与 URL 的其余部分分隔开来,不区分大小写 - 主机与端口
主机组件标识了要访问资源的宿主机器 - 用户和密码
例|
–|--
例 | 说明 |
---|---|
ftp://ftp.prep.ai.mit.edu/pub/gnu | 没有用户或密码组件,只有标准的方案、主机和路径。如果某应用程序使用的 URL 方案要求输入用户名和密码,比如 FTP,但用户没有提供,它通常会插入一个默认的用户名和密码。比如,如果向浏览器提供一个 FTP URL,但没有指定用户名和密码,它就会插入 anonymous(匿名用户)作为你的用户名,并发送一个默认的密码(Internet Explorer 会发送 IEUser,Netscape Navigator 则会发送 mozilla) |
ftp://anonymous@ftp.prep.ai.mit.edu/pub/gnu | 指定为 anonymous 的用户名。这个用户名与主机组件组合在一起,看起来就像 E-mail 地址一样。字符“@”将用户和密码组件与 URL 的其余部分分隔开来 |
ftp://anonymous:my_passwd@ftp.prep.ai.mit.edu/pub/gnu | 指定用户名和密码,用: 分割 |
Web 通信建立在HTTP协议上
特点:
- 简单快速
- 灵活
- 无连接
- 无状态(HTTP是一种不保存状态,无状态协议-从HTTP/1.1 虽然是无状态协议,但为了实现保持状态功能,引入了 Cookie 技术,有了它就可以管理状态了)
HTTP报文:请求报文,响应报文