(1)什么是HTTP协议
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是一种网络传输协议。它基于TCP/IP通信协议来传递数据,数据报括HTML、图片、查询结果等等。
HTTP协议工作在客户端-服务端结构上;
客户端
一般将用户浏览器作为HTTP客户端。浏览器通过URL向HTTP服务端发送请求。
服务端
HTTP服务端也就是WEB服务端,包括Apache服务器、IIS服务器等。
WEB服务端收到客户请求后,回复响应。浏览器展示服务端响应内容,例如HTML页面,文件、图片等等。
由于是WEB服务端,因此HTTP默认端口为80.
(2)HTTP协议的特点
HTTP协议是一种应用层的协议,不关注通信细节。底层的传递依靠TCP/IP协议来实现。
HTTP协议有三个特点:
- 无连接:无连接即每次连接限制只处理一个请求。服务器处理完客户请求后,并收到客户应答后,就断开连接。
- 媒体独立:只要客户端和服务端知道如何处理数据内容,可以通过HTTP发送任何类型的数据。通过MIME-type来指定内容的类型;
- 无状态:无状态是指,HTTP协议对于事务处理没有记忆能力。这意味着如果后续处理需要前面的信息,就必须重传。
(3)HTTP报文
URL
首先理解URL(UniformResourceLocator,统一资源定位符)。
URL是用来唯一标志网上每一个信息资源的地址。
URL由三部分组成:
- 资源类型
- 存放资源的主机域名
- 资源文件名
也可以认为由4个部分组成:
- 协议
- 主机
- 端口
- 路径
URL的一般语法结构如下,[ ]中为可选项:
protocol://hostname[:port]/path/[:parameters][? query]#fragment
举例说明:
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
- protocol:指定使用的传输协议,包括HTTP、FTP、HTTPS等等,格式如下。
HTTP:http://
FTP:ftp://
HTTPS:https:// - hostname:主机名。指存放资源的服务器的域名系统(DNS)或IP地址。例子中为www.aspxfans.com
- port:可选参数,省略时采用各种协议的默认参数。例子中为8080
- path:主机上的一个目录或文件地址。包括虚拟路径+文件名。例子中虚拟路径为/news/,文件名为index.asp。
- ?query:请求参数。用来指明搜索的内容,可以指定多个参数,中间用&分割。例子中为:?boardID=5&ID=24618&page=1
- #fragment:锚部分,可选参数。
HTTP请求报文Request
报文格式及实例
客户端发送一个请求到服务器192.168.3.1时,传送一个HTTP Request。
报文如下:
Hypertext Transfer Protocol
GET /html/index.html HTTP/1.1\r\n
Host: 192.168.3.1\r\n
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
Cookie: SessionID_R3=EKC1uzZT6PWojUfYpNu8LF7v2RNXizk3AtuYAQPRCPXn0LAh8K0PfbpBKGsSy4tyldLehmwhfs00GVNYwNTsQ7X76Nuye0LOP2qhvINiyF6RPFE9i9QHe7ZUOSTzsv6k\r\n
\r\n
可以看到。一个请求报文分为四个部分:
- 请求行(request line):用来说明请求类型,要访问的资源和所使用的HTTP版本。
- 请求头部(header):用来说明服务器要使用的附加信息。例如HOST请求目的地;User-Agent用于浏览器类型检测等等。
- 空行(CRLF):请求头部后面必须加换行。
- 请求数据:GET方法不需要请求数据。如果是POST方法,一般需要附加其他提交给服务器的信息。
请求方法
HTTP1.0定义了三种方法:GET、POST和HEAD方法;
HTTP1.1新增了:OPTIONS、PUT、DELETE、TRACE和CONNECT方法
- GET:请求某个资源
- POST:向指定资源提交数据进行处理请求,例如表单或上传文件,数据包含在请求体中。
- HEAD:只要求得到GET返回结果的首部部分。类似GET,但不是得到实际资源,会得到一些关于资源的信息。
- TRACE:要求请求消息回送,客户可以看到服务器接收到了什么,用来测试排错。
- PUT:从客户端向服务器传送的数据取代指定的文档的内容
- DELETE:删掉url上的某个东西
- OPTIONS:允许客户端查看服务器的性能
- CONNECT: HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
其中GET、HEAD、PUT都是幂等的,POST不是幂等。
所谓幂等,是指一次请求与多次请求,资源的状态都是一定的。
POST不是幂等的,POST所提交的数据可能用于不可逆的事务。
GET和POST的区别
GET的HTTP报文:
GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
POST的HTTP报文
POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
可以看到几个区别:
1、提交数据的差别:
- GET提交的数据跟随在URL中,在HTTP请求行中,以?分割URL和数据,多个不同参数之间用&隔开。
例如:sex=man&name=Professional - POST提交的数据在实体主体中,以请求数据的形式给出。
例如:name=Professional%20Ajax&publisher=Wiley
2、地址栏的区别:
- GET的请求数据在地址栏中可以看到(URL)
- POST的请求数据看不到,被隐藏。
3、传输数据的大小:
- 实际开发中,特定浏览器对URL的长度有限制,因此一般不能传输大量数据
- POST的数据长度没有要求,但是实际开发中,不同WEB服务器对数据长度也有限制。
4、安全性:POST>GET
HTTP响应Response
报文格式及实例
服务器收到客户端你的GETHTTP后,回复一个Response,报文如下:
Hypertext Transfer Protocol
HTTP/1.1 200 OK\r\n
Set-Cookie: SessionID_R3=IEcSKTYCC2n58N657PB3CMu00svNwoCNK8xFNcwq3Ie10FXAAw1jyxAmzIacb8V001s4qv2P36w16vuxGSBQgIesuiynCvM0NtHmRE9mxj1PKhg4nzGHYIujBUV4b0CM; path=/; HttpOnly;\r\n
Cache-Control: no-cache, no-store, max-age=0, must-revalidate\r\n
Pragma: no-cache\r\n
Content-Type: text/html; charset=utf-8\r\n
X-Download-Options: noopen\r\n
X-Frame-Options: SAMEORIGIN\r\n
X-XSS-Protection: 1; mode=block\r\n
Content-Security-Policy: default-src 'self' 'unsafe-inline' 'unsafe-eval'\r\n
X-Content-Type-Options: nosniff\r\n
Date: Mon, 20 Jul 2020 07:25:53 GMT\r\n
Connection: Keep-Alive\r\n
Content-Language: en\r\n
Content-Length: 5802\r\n
\r\n
[HTTP response 1/6]
[Time since request: 0.638637000 seconds]
[Request in frame: 66]
[Next request in frame: 79]
[Next response in frame: 87]
[Request URI: http://192.168.3.1/html/index.html]
File Data: 5802 bytes
Line-based text data: text/html (94 lines)
<!DOCTYPE html>\r\n
<html lang="en">\r\n
<head>\r\n
……(中间的省略)
</html>\r\n
可以看到,一个HTTP响应报文四个部分:
- 状态行::由HTTP版本号(HTTP/1.1),状态码(200),状态消息(ok)加回车换行构成构成;
- **消息报头:**用来说明客户端要使用的一些附加信息。以键值对的形式给出。例如Date;Content-Type
- **空行:**必须要加
- **响应正文:**服务端返回给客户端的文本信息,例如HTML。
HTTP状态码
状态码分类
状态码由三位数字构成,用于表示服务器对于请求的处理结果。
- 1xx:指示信息——表示请求已经接收,继续处理
- 2xx:成功——表示请求已经被成功接收,理解和接受
- 3xx;重定向——要完成请求必须进行重定向操作
- 4xx:客户端错误——请求语法错误或请求无法实现
- 5xx:服务器错误——服务器未能实现合法的请求
常见状态码
- 200 OK :客户端请求成功
- 400 Bad Request :客户端请求有语法错误,不能被服务器所理解
- 401 Unauthorized :请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
- 403 Forbidden :服务器收到请求,但是拒绝提供服务
- 404 Not Found :请求资源不存在,eg:输入了错误的URL
- 500 Internal Server Error :服务器发生不可预期的错误
- 503 Server Unavailable :服务器当前不能处理客户端的请求,一段时间后可能恢复正常
MIME type
MIME即因特网多媒体邮件扩展。MIME type用来标示内容是什么格式。通过该标签,告诉浏览器或者server如何解析该数据
HTTP的请求和响应都含有一个MIME Type字段。显示在消息报头的Content-Type键后。
例如例子中的:Content-Type: text/html; charset=utf-8\r\n
常用的MIME type有:
(4)HTTP请求响应流程
流程
- 域名解析(DNS解析):
- 发起TCP连接:
三次握手后与服务器的HTTP端口建立套接字连接 - 发起HTTP请求Request:
通过TCP套接字,向WEB服务器发送一个文本的请求报文 - 服务器返回HTTP响应Response:
WEB服务器解析客户请求,定位请求资源。服务器将资源副本写到TCP套接字。 - 释放连接;
根据connection模式选择断开方式。如果connect:close,则服务器主动关闭TCP连接;如果模式为connect:keepalive,则保持一段时间连接,连接器件可以继续接收请求。 - 浏览器得到html代码:
浏览器首先解析状态行,查看请求是否成功。然后解析每一个响应头。 - 浏览器解析html文件,渲染呈现给客户。
- 获取资源:在浏览器显示HTML时,它会注意到需要获取其他地址内容的标签。这时,浏览器会发送一个获取请求来重新获得这些文件。这些文件就包括CSS/JS/图片等资源,这些资源的地址都要经历一个和HTML读取类似的过程。所以浏览器会在DNS中查找这些域名,发送请求,重定向等等…