计网——HTTP

一、HTTP简介

HTTP,全称为Hypertext Transfer Protocol,即超文本传输协议,是一种应用层协议,用于在客户端和服务器之间传输数据。它是互联网上应用最广泛的协议之一,常用于Web浏览器和Web服务器之间的通信。

HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。

HTTP协议采用客户端-服务器模式,客户端向服务器发送HTTP请求,服务器接收并处理请求,返回HTTP响应结果。HTTP请求由请求行、请求头部、请求正文三部分组成,HTTP响应由状态行、响应头部、响应正文三部分组成。

HTTP协议定义了大量的请求方法和状态码,常见的请求方法包括GET、POST、PUT、DELETE等,常见的状态码包括200 OK、301 Moved Permanently、404 Not Found、500 Internal Server Error等。

HTTP协议是基于TCP/IP协议的,使用TCP协议作为传输层协议来保证数据传输的可靠性。同时,HTTP协议也存在一些安全风险,如明文传输、中间人攻击等,需要采取相应的安全措施来保障网络的安全。

最近几年来,随着Web应用的发展和互联网的普及,HTTP/2和HTTP/3等新版本的HTTP协议也在逐渐普及,以提高网络传输效率和安全性。

二、HTTP协议格式

2.1 HTTP请求格式

HTTP请求由请求行、请求头部和请求正文三部分组成

请求方法(Method) Request-URL HTTP协议版本(HTTP-Version)
请求头(Header)
...
空行
请求正文(Body)
  • 请求方法(Method):例如GET、POST、PUT、DELETE等。

  • Request-URL:请求资源的统一资源标识符(URL),指定了要访问的资源路径。

  • HTTP版本号(HTTP-Version):通常是"HTTP/1.1"或"HTTP/2.0"。

  • 请求头(Headers):包含请求的各种头信息,如User-Agent、Host、Accept等,以键值对的形式表示。

  • 请求正文(Body):POST请求时可能包含请求的实体主体,用于传输数据。GET请求没有请求主体。

说明:请求行三个字段之间以“空格”分割,首部字段是通过换行符(CRLF,即回车符+换行符)来进行分隔的,因为Header的个数不确定,所以最后一个Header的后边用一个空行来表示Header的结束。

2.2 HTTP响应格式

HTTP协议版本(HTTP-Version) 状态码(Status-Code) 状态码描述(Reason-Phrase)
响应头(Header)
...
空行
响应正文(Body)
  • HTTP版本号(HTTP-Version):HTTP协议版本号,与请求报文中的一样。

  • 状态码(Status-Code):表示请求处理的结果状态码,例如200表示成功,404表示资源未找到,500表示服务器内部错误等。

  • 状态码描述(Reason-Phrase):对状态码的简短描述。

  • 响应头(Headers):包含响应的各种头信息,如Server、Content-Type、Content-Length等,以键值对的形式表示。

  • 响应正文(Body):响应报文的实体主体,用于传输响应数据。比如,对于HTML页面或JSON数据等。

说明:状态行三个字段之间以“空格”分割,首部字段是通过换行符(CRLF,即回车符+换行符)来进行分隔的,因为Header的个数不确定,所以最后一个Header的后边用一个空行来表示Header的结束。

示例:

#####请求消息#####
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36
Accept: text/html,application/xhtml+xml

#####响应消息#####
HTTP/1.1 200 OK
Server: Apache/2.4.41 (Unix)
Content-Type: text/html; charset=utf-8
Content-Length: 1270

<!DOCTYPE html>
<html>
<head>
    <title>Welcome to Example.com</title>
</head>
<body>
    <h1>Hello, World!</h1>
</body>
</html>

三、HTTP header

HTTP header,也称为HTTP头部是HTTP请求和响应报文中的一部分用于传递附加的元数据信息。HTTP header由多个字段组成,每个字段由一个名称和一个值组成,名称和值之间用冒号和空格分隔。HTTP头部可以分为请求头部和响应头部两种类型。

3.1 请求头部

请求头部包含了客户端向服务器发送的HTTP请求的附加信息,常见的请求头部字段包括:

  • User-Agent:客户端的用户代理,标识浏览器或其他客户端类型。

  • Accept:指示客户端能够处理的响应内容类型。

  • Host:请求的目标服务器主机名或IP地址。

  • Referer:指示请求是从哪个URL发起的,常用于跟踪用户的来源。

  • Content-Type:指示请求正文的MIME类型。

  • Authorization:包含用于进行身份验证的凭证,如用户名和密码。

3.2 响应头部

响应头部包含了服务器向客户端发送的HTTP响应的附加信息,常见的响应头部字段包括:

  • Content-Type:指示响应正文的MIME类型。

  • Content-Length:指示响应正文的长度。

  • Cache-Control:指示客户端如何缓存响应正文。

  • Set-Cookie:指示在客户端存储一个cookie。

  • Expires:指示响应的过期时间。

  • Last-Modified:指示响应正文的最后修改时间。

四、HTTP状态码

HTTP状态码被分为五类,分别是:

  • 1xx:信息性状态码,表示服务器已经接收到请求,正在处理中。

  • 2xx:成功状态码,表示服务器已经成功接收到请求并处理完成。

  • 3xx:重定向状态码,表示需要客户端进一步的操作才能完成请求。

  • 4xx:客户端错误状态码,表示客户端的请求有错误或无法完成。

  • 5xx:服务器错误状态码,表示服务器在处理请求时出现错误。

以下是常见的HTTP状态码的含义:

  • 200 OK:请求成功,服务器已经成功处理了请求并返回了响应。

  • 201 Created:请求成功,服务器已经成功创建了资源并返回响应。

  • 204 No Content:请求成功,服务器已经成功处理了请求,但是没有返回任何响应内容。

  • 206 Partial Content:是应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。

  • 301 Moved Permanently:请求的资源已经永久移动到新的URL。

  • 302 Found:请求的资源已经临时移动到新的URL。

  • 304 Not Modified:不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,也就是告诉客户端可以继续使用缓存资源,用于缓存控制。

  • 400 Bad Request:客户端请求有错误,服务器无法理解请求。

  • 401 Unauthorized:客户端请求需要身份验证,但是没有提供有效的身份验证信息。

  • 403 Forbidden:客户端请求被服务器拒绝,没有权限访问该资源。

  • 404 Not Found:请求的资源在服务器上不存在。

  • 500 Internal Server Error:服务器在处理请求时出现错误。

  • 501 Not Implemented:表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。

  • 502 Bad Gateway:通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。

  • 503 Service Unavailable:表示服务器当前很忙,暂时无法响应客户端,类似“网络服务正忙,请稍后重试”的意思。

 五、HTTP的GET和POST请求

5.1 概括

  • 对于GET方式请求,浏览器会把 http header 和 data 一并发送回去,服务器响应200(返回数据)。

  • 对于POSE,浏览器先发送 header,服务器响应100 continue,浏览器再发送 data,服务器响应200 ok(返回数据)

5.2 区别

  1. 传输方式:

    • GET:通过URL传输数据,在URL中可以看到参数和其对应的值。数据附加在URL后面,以问号?分隔,参数之间用&连接。因为数据暴露在URL中,所以不适合传输敏感信息或大量数据。

    • POST:通过HTTP请求的消息体传输数据,不会将数据暴露在URL中,因此更适合传输敏感信息和大量数据。

  2. 请求长度限制:

    • GET:由于数据附加在URL上,URL的长度有限制(通常是几千个字符),所以GET请求的数据长度也受到限制。

    • POST:由于数据传输在消息体中,所以可以发送较大的数据量,一般没有长度限制。

  3. 安全性:

    • GET:因为数据暴露在URL中,所以不适合传输敏感信息,例如密码等。同时,由于参数和值可见,可能会被他人轻易截获。

    • POST:由于数据在消息体中,相对于GET请求更安全,更适合传输敏感信息。

  4. 请求幂等性:

    • GET:GET请求是幂等的,即对同一个URL的多次请求只会产生一次结果,不会对服务器数据产生影响。

    • POST:POST请求不是幂等的,多次对同一个URL进行POST请求可能会产生不同的结果,因为可能涉及到创建资源或提交数据等操作。

  5. 请求语义:

    • GET:一般用于获取数据,获取资源,不应该用于对服务器产生影响的操作。

    • POST:一般用于提交数据,创建资源,或者在服务器上执行修改操作。

六、HTTP缓存

HTTP缓存指的是Web浏览器或代理服务器中存储已请求资源的副本,并在下次请求同一资源时使用该副本,以避免重复请求和加快页面加载速度的技术。

6.1 HTTP缓存流程

HTTP缓存的工作流程如下:

  1. 当浏览器或代理服务器第一次请求某个资源时,服务器会返回该资源的响应,并在响应头中添加缓存相关的字段,如Cache-Control、Expires、Last-Modified、ETag等。

  2. 浏览器或代理服务器会将该响应存储在本地缓存中,并为该资源生成一个唯一标识符(如URL或ETag),以便下次请求时进行匹配。

  3. 当浏览器或代理服务器下次请求同一资源时,会先检查本地缓存中是否存在该资源的副本,并根据缓存相关的字段判断该副本是否仍然有效。如果有效,则直接从本地缓存中读取该副本并返回;否则,重新向服务器请求该资源。

6.2 HTTP缓存方式

常见的HTTP缓存策略有以下几种:

  1. 强制缓存:当浏览器或代理服务器第一次请求某个资源时,服务器会在响应头中添加Cache-Control或Expires字段,指定该资源在客户端缓存的有效期。在有效期内,浏览器或代理服务器会直接从本地缓存中获取该资源,并不再向服务器发送请求。

  2. 协商缓存当强制缓存失效时,浏览器或代理服务器会向服务器发送一个条件请求,检查该资源是否已经更新。服务器会在响应头中添加Last-Modified或ETag字段,用于表示该资源的版本。客户端会将这些字段存储在本地,并在下次请求时将它们发送给服务器,请求更新的资源。如果服务器检查到该资源未更新,则返回一个304 Not Modified响应,客户端直接从本地缓存中获取该资源。

七、HTTP存在的问题

HTTP协议存在以下几个问题:

  1. 安全性问题:HTTP协议传输的数据是明文的,容易被第三方窃取和查看,因此无法保证数据传输的机密性。同时,HTTP协议没有身份认证机制,容易被伪装成其他人进行网络攻击。

  2. 数据完整性问题:HTTP协议传输的数据不具备完整性保护,容易被第三方篡改和修改,因此无法保证数据传输的完整性。

  3. 性能问题:HTTP协议采用明文传输,数据量较大,传输效率相对较低,同时无法缓存动态内容,导致网站响应速度较慢。

  4. 无法处理大量并发请求问题HTTP/1.0协议采用短连接模式,(HTTP/1.1默认长连接模式),每次请求都需要建立连接,对于大量并发请求的处理效率较低。

综上所述,HTTP协议存在安全性、数据完整性、性能和并发请求处理等问题,这些问题在现代互联网应用场景下尤为突出,因此,为了解决这些问题,现代互联网应用普遍采用HTTPS协议来保障网络通信的安全性和稳定性。

猜你喜欢

转载自blog.csdn.net/m0_62573214/article/details/132090058
今日推荐