HTTP(Hypertext Transfer Protocol)是一种用于传输超文本文档的应用层协议,通常用于在客户端和服务器之间传输网页、图片、视频等资源。它是建立在TCP/IP协议栈之上的应用层协议,使用标准的TCP连接来传输数据。HTTP的主要特点包括简单、灵活、可扩展性强等。
在OSI(Open Systems Interconnection)模型中,HTTP位于应用层,负责定义客户端和服务器之间的通信规则。应用层是OSI模型中最高层,它负责为用户提供各种网络服务和应用,如文件传输、电子邮件、Web访问等。HTTP作为应用层协议,定义了客户端和服务器之间如何发送和解释消息,以实现网页访问等功能。
HTTP通常使用TCP作为传输层协议,因为它需要可靠的数据传输服务来确保数据的完整性和可靠性。当客户端发起HTTP请求时,它会首先与服务器建立TCP连接,然后通过这个TCP连接来发送HTTP请求和接收HTTP响应。因此,HTTP和TCP之间是一种客户端-服务器的关系,HTTP依赖于TCP来提供可靠的数据传输服务。
总之,HTTP是应用层协议,用于在客户端和服务器之间传输超文本文档;TCP和UDP是传输层协议,负责在网络上传输数据。HTTP通常使用TCP作为传输层协议,以实现可靠的数据传输服务。
HTTP协议格式
请求行(Request Line):
1)请求(request)
请求行包含了请求方法、请求的资源路径和HTTP协议版本。常见的请求方法包括GET、POST、PUT、DELETE等。例如:
GET /index.html HTTP/1.1
1.请求方法(Request Method):
请求方法指示了客户端希望服务器对资源执行的操作。
a) 常见的请求方法包括:
- GET:请求获取指定资源。GET请求通常用于从服务器获取数据,不会对服务器上的资源进行修改。
- POST:向服务器提交数据,用于向服务器提交数据,比如表单数据。POST请求可能会导致服务器上的资源状态发生变化。
- PUT:用于更新服务器上的资源,通常用于上传文件或更新已有资源。
- DELETE:请求服务器删除指定的资源。
- HEAD:类似于GET请求,但服务器只返回请求头部,不返回实际的资源内容。主要用于获取资源的元信息,比如检查资源是否存在、获取资源的大小等。
- OPTIONS:用于获取目标资源所支持的通信选项。
- TRACE:用于测试客户端到服务器之间的路径。
- CONNECT:用于将连接改为管道方式的代理服务器。
b) GET和POST的区别:
- 幂等性
- GET请求:通常是幂等的,即对同一个URL的多次GET请求应该返回相同的结果。GET请求不应该对服务器的状态产生影响。
- POST请求:通常不是幂等的,即对同一个URL的多次POST请求可能会产生不同的结果,因为POST请求通常用于提交数据,可能会导致服务器的状态发生变化。
- 使用场景
- GET请求:用于获取资源,通常用于向服务器请求特定资源,不应该对服务器的状态产生副作用。例如,获取网页、图片或其他静态资源。
- POST请求:用于提交数据,通常用于向服务器提交表单数据、上传文件、进行数据更新或者创建新资源等操作。
-
数据传输方式:
- GET请求:通过URL的query string 传输数据,body通常为空。数据以查询字符串的形式附加在URL的末尾,如
https://www.example.com/search?q=query
。 - POST请求:通过请求体(Request Body)传输数据,数据被包含在HTTP请求的消息体中发送给服务器。因此,POST请求的数据不会暴露在URL中。
- GET请求:通过URL的query string 传输数据,body通常为空。数据以查询字符串的形式附加在URL的末尾,如
2.资源路径(URL):
URL(统一资源定位符)是用于标识和定位互联网上资源的地址。它由多个组成部分组成,包括协议、主机、端口、路径、查询参数和片段等。
a) URL的具体组成部分:
-
协议(Protocol):URL的第一部分指定了要用于访问资源的协议,通常是HTTP或HTTPS。协议部分以冒号加两个斜杠开头。例如,
http://
或https://
。 -
主机(Host):主机部分指定了资源所在的服务器的主机名或IP地址。例如,
www.example.com
或192.168.1.1
。 -
端口(Port):端口部分指定了服务器上正在监听的端口号。如果未指定端口号,则使用默认的端口号。HTTP协议的默认端口是80,HTTPS协议的默认端口是443。如果使用了默认端口,则通常不需要在URL中显式指定端口号。如果使用了非默认端口,则需要在主机名后面加上冒号和端口号。例如,
www.example.com:8080
表示使用了8080端口。 -
路径(Path):路径部分指定了服务器上资源的路径。它以斜杠
/
开头,可以包含多个子路径,每个子路径用斜杠分隔。路径部分表示服务器上资源的位置或层次结构。例如,/index.html
或/blog/posts/2024/april
。 -
查询参数(Query Parameters):查询参数部分用于向服务器传递额外的数据,通常以键值对的形式组成,多个参数之间用
&
符号分隔。查询参数通常用于GET请求,用于向服务器传递搜索条件、过滤条件或其他参数。查询参数以问号?
开头,例如,?page=2&category=technology
。 -
片段(Fragment):片段部分指定了资源中的一个特定片段或位置。它位于URL的最后,以井号
#
开头,常用于标识HTML文档中的特定元素或位置。片段通常用于在浏览器中滚动到特定位置或定位到特定内容。例如,#section2
。
b) URL encoding:
URL编码(URL encoding),也称为百分号编码(percent-encoding),是一种在URL中转义特殊字符和非ASCII字符的方法,以便它们能够在网络上进行安全传输和正确解释。URL编码将特殊字符替换为百分号(%)后面跟着两位十六进制数的形式。
URL编码通常用于以下情况:
-
保留字符(Reserved Characters):URL中的某些字符具有特殊含义,例如问号(?)、井号(#)、百分号(%)、斜杠(/)等,如果这些字符需要作为普通字符的一部分出现在URL中,就需要对它们进行编码。
-
非ASCII字符(Non-ASCII Characters):URL中只能包含ASCII字符,而对于非ASCII字符(如中文、日文、俄文等),需要进行编码,以便它们在URL中传输时不会出现乱码或被错误解释。
URL编码的过程很简单,就是将每个非ASCII字符或者需要转义的特殊字符转换成百分号(%)后跟着两位十六进制数的形式。例如:
- 空格(空格在URL中需要转义为%20)被转码为
%20
。 - 问号(?在URL中需要转义为%3F)被转码为
%3F
。 - 字符"#"(#在URL中需要转义为%23)被转码为
%23
。
3.HTTP协议版本: HTTP1.0,HTTP1.1,HTTP2.0,这三者基于TCP,HTTP3(基于UDP)
2) 响应(response)
包含了HTTP协议的版本号、状态码和状态消息。状态码表示服务器对请求的处理结果,状态消息是对状态码的文本描述。例如,状态码200表示请求成功,状态消息为OK。
HTTP/1.1 200 OK
1.版本号
HTTP状态码是服务器对客户端请求的响应结果的标识,每个状态码都有特定的含义。下面是一些常见的HTTP状态码及其含义:
-
1xx(信息性状态码):表示请求已被接收,正在处理。
- 100 Continue:服务器已收到请求的一部分,客户端应继续发送剩余的请求。
-
2xx(成功状态码):表示请求已成功处理。
- 200 OK:请求成功,服务器已成功处理了请求。
- 201 Created:请求已被成功处理,并且在服务器上创建了新资源。
- 204 No Content:服务器成功处理了请求,但不需要返回任何实体内容。
-
3xx(重定向状态码):表示需要进行进一步的操作以完成请求。
- 301 Moved Permanently:请求的资源已永久移动到新位置,客户端应该使用新的URL重新发起请求。
- 302 Found:请求的资源临时移动到新位置,客户端应该使用新的URL重新发起请求。
- 304 Not Modified:客户端可以通过缓存的版本访问资源,未返回实体内容。
-
4xx(客户端错误状态码):表示客户端发送的请求有错误。
- 400 Bad Request:服务器无法理解客户端发送的请求,通常由于语法错误。
- 401 Unauthorized:请求需要用户身份认证。
- 403 Forbidden:服务器拒绝请求,通常因为客户端没有访问资源的权限。
- 404 Not Found:请求的资源未找到。
-
5xx(服务器错误状态码):表示服务器在处理请求时发生了错误。
- 500 Internal Server Error:服务器内部错误,无法完成请求。
- 502 Bad Gateway:作为网关或代理服务器工作的服务器从上游服务器收到无效的响应。
- 503 Service Unavailable:服务器当前无法处理请求,通常是由于维护或过载。
2.状态消息
状态消息往往与状态码对应
-
"OK" (200):请求成功。服务器成功处理了客户端的请求,返回了请求的资源或内容。
-
"Moved Permanently" (301):永久重定向。请求的资源已永久移动到新位置,客户端应该使用新的URL重新发起请求。
-
"Found" (302):临时重定向。请求的资源临时移动到新位置,客户端应该使用新的URL重新发起请求。
-
"Not Modified" (304):未修改。客户端可以通过缓存的版本访问资源,服务器未返回实体内容。
-
"Bad Request" (400):无效请求。服务器无法理解客户端发送的请求,通常由于语法错误。
-
"Unauthorized" (401):未授权。请求需要用户身份认证。
-
"Forbidden" (403):禁止访问。服务器拒绝请求,通常因为客户端没有访问资源的权限。
-
"Not Found" (404):未找到。请求的资源未找到。
-
"Internal Server Error" (500):服务器内部错误。服务器无法完成请求,发生了意外错误。
-
"Service Unavailable" (503):服务不可用。服务器当前无法处理请求,通常是由于维护或过载