【网络协议】HTTP协议(一)
目录
- HTTP协议介绍
- 1.1 HTTP简介
- 1.2 TCP/IP协议
- 1.3 HTTP协议特点
- 1.4 HTTP协议缺点
- 1.5 HTTP协议性能
- HTTP请求方式
- 2.1 URL
- 2.2 请求方法
- 2.3 GET 和 POST 请求
- HTTP报文
- 3.1 请求报文
- 3.2 响应报文
- URI
- 4.1 URI结构
- 4.2 URI编码
- HTTP状态码
- 5.1 状态码分类
- 5.2 常见状态码
1. HTTP协议介绍
1.1 HTTP简介
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
1.2 TCP/IP协议
HTTP协议是构建在TCP/IP协议之上的,是TCP/IP协议的一个子集。先来看一下TCP/IP协议:
TCP/IP协议是一些列与互联网相关联的协议集合起来的总称,分层管理是TCP/IP协议的一个重要特征,它是由一个四层协议组成的系统,这四层分别是应用层,传输层,网络层和数据链路层。
- 应用层
应用层是我们编写的应用程序,决定了向用户提供的应用服务。应用层可以通过系统调用与传输层进行通信,例如FTP(文件传输协议)、DNS(域名系统)、HTTP协议等。
- 传输层
传输层通过系统调用向应用层提供处于网络连接中国的两台计算机之间的数据传输功能。传输层中有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。
- 网络层
网络层用来处理网络上流动的数据包,数据包是网络协议传输的最小单位,该层规定了通过怎么的路径将数据包传递给目标计算机。
- 链路层
链路层又称为数据链路层,它用来处理连接网络的硬件部分,包括操作系统、硬件设备驱动、网络适配器等,硬件上的范畴都在链路层的作用范围之内。
TCP/IP协议数据流示意图:
1.3 HTTP协议特点
HTTP协议具有以下特点:
- 支持客户端/服务器模式
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。
- 灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记。
- 无连接:无连接的含义是限制每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开链接,采用这种方式可以节省传输时间。
- 无状态:HTTP 协议是无状态协议,这里的状态是指通信过程的上下文信息。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能会导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就比较快。
1.4 HTTP协议缺点
- 无状态
(1)在需要长连接时,需要保存大量的上下文信息,以免传输大量的重复数据,这时无状态对HTTP来说是不好的。
(2)在只获取一些数据,而不需要保存连接上下文信息时,无状态减少了网络的开销,这时无状态对HTTP来说是好的。
- 明文传输
协议中的报文使用的是文本形式,这就直接暴露给外界,不安全。
- 不安全
(1)通信使用明文(不加密),内容可能会被窃听
(2)不验证通信方的身份,因此有可能遭遇伪装
(3)无法证明报文的完整性,所以有可能已遭篡改
1.5 HTTP协议性能
HTTP 协议是基于 TCP/IP,并且使用了请求 - 应答的通信模式,所以性能的关键就在这两点里。
- 长连接
早期 HTTP/1.0 每发起一个请求,都要新建一次 TCP 连接(三次握手),而且是串行请求,做了无畏的 TCP 连接建立和断开,增加了通信开销。
因此HTTP/1.1 提出了长连接的通信方式,也叫持久连接。这种方式的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。
- 管道网络传输
HTTP/1.1 采用了长连接的方式,这使得管道(pipeline)网络传输成为了可能。
管道(pipeline)网络传输是指:可以在同一个 TCP 连接里面,客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。
但是服务器还是按照顺序回应请求。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为队头堵塞。
- 队头堵塞
HTTP 传输的报文必须是一发一收,但是,里面的任务被放在一个任务队列中串行执行,一旦队首的请求处理太慢,就会阻塞后面请求的处理。这就是HTTP队头阻塞问题。
队头阻塞的解决方案:
(1)并发连接:对于一个域名允许分配多个长连接,那么相当于增加了任务队列,不至于一个队伍的任务阻塞其它所有任务。
(2)域名分片:将域名分出很多二级域名,它们都指向同样的一台服务器,能够并发的长连接数变多,解决了队头阻塞的问题。
2. HTTP请求方式
2.1 URL
HTTP协议通过URL(Uniform Resource Locator)统一资源定位符来访问资源,其格式如下:
scheme://host:port/path?query
scheme: 表示协议,如Http, Https, Ftp等;
host: 表示所访问资源所在的主机名:如:www.baidu.com;
port: 表示端口号,默认为80;
path: 表示所访问的资源在目标主机上的储存路径;
query: 表示查询条件;
例如: http://www.baidu.com/search?words=Baidu
2.2 请求方法
HTTP协议的请求方法有很多种:
GET: 获取URL指定的资源;
POST:传输实体信息,提交数据
PUT:上传文件,修改数据
DELETE:删除文件(很少用)
HEAD:获取报文首部,与GET相比,不返回报文主体部分
OPTIONS:询问支持的请求方法,用来跨域请求
TRACE:追踪 请求—响应 的传输路径
CONNECT:要求在与代理服务器通信时建立隧道,使用隧道进行TCP通信
2.3 GET 和 POST 请求
GET
和 POST
请求是常用的两种请求方式,他们之间的区别有:
- 从用途的角度,
GET
方法主要用于请求从服务器获取资源,POST
方法主要用于向URI
指定的资源提交数据。 - 从缓存的角度,
GET
请求会被浏览器主动缓存下来,留下历史记录,而POST
不会缓存。 - 从编码的角度,
GET
请求只能进行URL
编码,只能接收ASCII
字符,而POST没有限制。 - 从TCP的角度,
GET
请求会把请求报文一次性发出去,而POST
会分为两个TCP
数据包,首先发header
部分,如果服务器响应 100(continue), 然后发body
部分。(火狐浏览器除外,它的 POST 请求只发一个 TCP 包)。 - 从幂等性的角度,
GET
方法是幂等的,而POST
不是。(幂等表示执行相同的操作,结果也是相同的)。 - 从安全的角度,
GET
方法是安全的,因为只会读取服务器上的数据,无论怎么操作,服务器数据都是安全的;而POST
方法是新增或者提交数据,会修改服务器上的资源,每次提交都会创建资源,所以是不安全的。
3. HTTP报文
3.1 请求报文
对于HTTP协议,其请求报文结构为:
请求方法 URL HTTP/版本号
请求首部字段(可选)
空行
body(只对Post请求有效)
- 第一行为起始行,由请求方法、请求路径、HTTP版本组成
- 第二行为请求头
- 第三行为空行,用来区分头部和实体
- 最后一行是body,是指请求报文的请求体
例如:
GET http://m.baidu.com/ HTTP/1.1
Host m.baidu.com
Connection Keep-Alive
...// 其他header
key=iOS
3.2 响应报文
对于HTTP协议,其响应报文结构为:
HTTP/版本号 状态码 状态码描述
应答首部字段(可选)
空行
body
- 第一行为状态行,由HTTP版本、状态码、和原因组成
- 第二行为请求头
- 第三行为空行,用来区分头部和实体
- 最后一行是body,是指请求报文的响应体
例如:
HTTP/1.1 200 OK
Content-Type text/html;charset=UTF-8
...// 其他header
<html>...
4. URI
4.1 URI结构
URI的全称为(Uniform Resource Identifier), 也就是统一资源标识符,它的作用就是区分互联网上不同的资源。
URI包含两部分:URL和URN ,URI完整的结构如下:
其中:
- scheme 表示协议名,比如http, https, file等等。后面必须和://连在一起。
- user:passwd@ :表示登录主机时的用户信息,不过很不安全,不推荐使用,也不常用。
- host:port:表示主机名和端口。
- path:表示请求路径,标记资源所在位置。
- query:表示查询参数,为key=val这种形式,多个键值对之间用&隔开。
- fragment:表示 URI 所定位的资源内的一个锚点,浏览器可以根据这个锚点跳转到对应的位置。
例如:https://so.csdn.net/so/search/s.do?q=csdn&t=&u=
这个 URI 中:
- scheme:https
- host:port:so.csdn.net
- path:/so/search/s.do
- query:q=csdn&t=&u=
4.2 URI编码
URI只能使用ASCII
编码,不支持其他字符。
因此它引入编码机制,把所有的非ASCII码编码和界定符转化为十六进制,然后在前面加一个%
,例如空格转化为%20
。
5. HTTP状态码
5.1 状态码分类
HTTP状态码分为以下五类:
状态码 | 类别 | 描述 |
---|---|---|
1xx | Informational(信息性状态码) | 请求正在被处理 |
2xx | Success(成功状态码) | 请求处理成功 |
3xx | Redirection(重定向状态码) | 需要进行重定向,重新请求 |
4xx | Client Error(客户端状态码) | 服务器无法处理请求 |
5xx | Server Error(服务端状态码) | 服务器处理请求时出错 |
5.2 常见状态码
常见的状态码:
还没有评论,来说两句吧...