HTTP(HyperText Transfer Protocol)是一个应用层协议
,用于在客户端(如Web浏览器)和服务器之间传输数据。它使用TCP
(Transmission Control Protocol)作为传输层协议,通过互联网传递各种资源,如HTML文件、图像、视频、查询结果等。
在 B/S 架构
(浏览器-服务器架构)中,浏览器作为客户端向服务器发送 HTTP 请求,请求包含所需资源的信息以及其他附加信息。服务器接收到请求后,根据请求内容生成响应消息,并将其发送回客户端。
HTTP 默认端口号为80
,但也可以使用其他端口号,例如8080。
无连接性:HTTP协议是无连接的,即每个请求和响应之间相互独立,服务器在完成对客户端请求的处理后,会断开连接。这样的设计有利于节省传输时间和提高服务器的处理能力。为了优化HTTP请求的传输效率,可以使用长连接或者短连接来管理TCP连接。
无状态性:HTTP协议是无状态的,即协议本身对于事务处理没有记忆能力。每个请求都是独立的,服务器不会保留之前请求的状态信息。这可能导致每次连接传送的数据量增大,但也使得服务器不需要先前信息时的应答更加迅速。为了维护用户状态,可以使用Cookie等机制进行状态管理。
媒体独立性:HTTP协议并不关心所传输的数据类型,只要客户端和服务器知道如何处理这些数据即可。通过在请求头中指定适当的MIME类型(媒体类型),可以告知对方所发送或接收的数据的格式和类型。这使得HTTP可以传输任何类型的数据,无论是文本、图像、音频还是视频等。
可扩展性:HTTP协议允许通过添加自定义的请求方法、请求头、响应头等来扩展协议的功能,从而适应不同的需求。
这些特点使得HTTP成为了互联网上最常用的协议之一,广泛应用于Web浏览器和Web服务器之间的数据传输。
(需要注意一点:HTTP协议本身是无连接的,即每个请求和响应都是独立的。但是http想要与长连接和短连接是基于TCP协议的连接管理方式,用于优化HTTP请求和响应的传输效率。长连接是指在一个TCP连接上可以发送多个HTTP请求和响应,而不需要每次请求都建立和关闭一个新的TCP连接。短连接是指每个HTTP请求和响应都使用一个新的TCP连接。)
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行
、请求头部
、空行
和请求数据
四个部分组成,下图给出了请求报文的一般格式。
(1)请求行
请求行是HTTP请求的第一行,包含了三个部分:请求方法、URL和HTTP协议版本。
具体解释如下:
请求方法:表示对服务器执行的动作。常见的请求方法有:
URL(Uniform Resource Locator):表示要请求的资源的路径。它包括协议、主机名、端口号(可选)和资源路径等信息。
HTTP协议版本:表示客户端使用的HTTP协议版本,常见的版本有HTTP/1.0和HTTP/1.1。
例如:
GET /example.html HTTP/1.1
该请求行表示使用GET方法请求服务器上的/example.html资源,并使用HTTP/1.1协议版本进行通信。
需要注意的是,描述中提到的增、删、改、查是一种常见的映射关系,即将CRUD(Create, Read, Update, Delete)操作映射为对应的HTTP请求方法(POST, GET, PUT, DELETE)。这种映射关系并不是HTTP协议本身的定义,而是根据常用的设计和使用约定。
(2)GET方法和POST方法的区别
Post(处理数据,处理完后返回给服务器,复杂一点的) GET通常用来从服务器上获得数据,而非修改信息;POST用来向服务器传递数据。
参数传递:GET方法的参数会附加在URL后面,以"?“分隔URL和参数,多个参数使用”&"连接;而POST方法会将参数放在HTTP请求的请求体中,不会在URL中暴露。POST请求会把请求的数据放置在HTTP请求包的包体中。
数据大小限制:GET方法的传输数据受到URL长度的限制,不同浏览器和服务器对URL长度有不同的限制;POST方法理论上没有限制,但实际上服务器可能会对POST提交的数据大小进行限制。
缓存处理:GET请求返回的内容可以被浏览器缓存,而POST请求不会被缓存,并且在刷新页面时会弹出确认框,需要用户再次确认提交。
语义和操作:GET方法主要用于从服务器获得数据,不对服务器上的数据进行修改;POST方法用于向服务器提交数据,可用于传输数据并在服务器上创建、修改或删除资源。
参数数据类型:GET方法只接受ASCII字符作为参数,而POST方法没有对参数数据类型的限制。
需要注意的是,尽管上述是常见做法和约定,但并不是HTTP协议本身的要求,因此在实际开发中,也可以根据具体需求和情况来选择使用GET或POST方法。
(3)请求头
也被称作消息报头,请求头是由一些键值对组成,每行一对,关键字和值用英文冒号“:”分隔。允许客户端向服务器发送一些附加信息或者客户端自身的信息,典型的请求头如下:
除了上述请求头字段外,还有许多其他的常用和自定义的请求头字段,如User-Agent(客户端标识)、Referer(请求来源页面)、Authorization(身份认证信息)等。
这些请求头字段使得客户端可以在发送请求时提供各种信息,帮助服务器进行适当的处理和响应。HTTP协议规范中定义了一些标准的请求头字段,同时也允许在需要时扩展自定义的请求头字段。
(4)空行
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
(5)请求数据
请求数据:请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
状态行:由三部分组成,HTTP协议的版本号、状态码、以及对状态码的文本描述。例如:HTTP/1.1 (协议版本)200 (状态码)OK (CRLF) 。(200表示请求已经成功)
● 200 OK:请求成功,服务器成功处理了请求并返回所请求的资源。 ● 301 Moved
Permanently:请求的资源已永久移动到新的URL,客户端应更新其链接。 ● 302
Found:请求的资源暂时移动到新的URL,客户端应继续使用原始URL。 ● 400 Bad
Request:服务器无法理解请求的语法,通常是由于客户端发送的请求不正确导致的。 ● 401
Unauthorized:请求要求身份验证,客户端需要提供有效的身份凭证。 ● 403
Forbidden:服务器拒绝请求,客户端没有访问所请求资源的权限。 ● 404 Not
Found:请求的资源不存在,服务器无法找到所请求的资源。 ● 500 Internal Server
Error:服务器内部错误,无法完成请求的处理。 ● 503 Service
Unavailable:服务器当前无法处理请求,通常是由于服务器过载或维护导致的。