- 前言
- 主要特点
- 存在的不足
- 与HTTP1.1的区别
- 在Java中应用HTTP1.0协议
- 知识拓展
前言
HTTP是由蒂姆·伯纳斯·李(Tim Berners-Lee)爵士创造的。他在1989年提出了一个构想,借助多文档之间相互关联形成的超文本(HyperText),连成可参阅的 WWW(World Wide Web,万维网),以帮助远隔两地的研究者们共享知识。在这个构想中,他提出了3项WWW构建的关键技术:HTML, URI, HTTP。因此,蒂姆·伯纳斯·李(Tim Berners-Lee)被公认为是万维网的发明者,互联网之父。
HTTP1.0是一种无状态、无连接的应用层协议。HTTP1.0规定浏览器和服务器保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态)。
主要特点
- 无状态(Stateless) :HTTP1.0 默认使用无状态通信协议,即服务器不会记录之前的请求信息,每个请求都是独立的,相互之间没有关联。
- 无连接(Connectionless) :在 HTTP1.0 中,每个请求都需要与服务器建立一个新的 TCP 连接,并且在请求完成后立即关闭连接。这意味着如果需要发送多个请求,就需要建立多个 TCP 连接,这会增加网络开销和延迟。
- 请求/响应模式 :HTTP1.0 的通信必须由客户端发起,服务器不能主动向客户端发送数据。通信过程包括请求和响应两个步骤,请求由客户端发出,响应由服务器返回。
- 幂等性 :幂等性是指对于同一个请求,无论执行多少次,结果都是相同的。HTTP1.0 的请求方法(GET、POST、PUT、DELETE等)都是幂等的,即多次执行相同的方法不会产生不同的效果。
- 头信息 :HTTP1.0 的请求和响应中都可以包含头信息(Headers),这些信息是可选的,用于传递一些额外的信息,如请求的类型、响应的状态码等。
- 分段传输 :HTTP1.0 支持分段传输,即可以将一个较大的数据分成多个较小的数据段进行传输,这样可以更好地处理网络拥堵和丢包的情况。
- 长连接 :虽然 HTTP1.0 默认使用无状态通信协议,但是它也支持长连接(Connection Persistence),通过在请求头中设置 Connection 字段为 Keep-Alive,可以保持 TCP 连接不断开,从而减少网络开销和延迟。
这些特点使得 HTTP1.0 在互联网上得到了广泛的应用,但是随着互联网的发展和需求的增加,HTTP1.0 也逐渐暴露出一些问题,如连接数量限制、网络利用率低等。因此,后来出现了 HTTP1.1 和 HTTP2.0 等更高级的协议。
存在的不足
- 无法复用连接 :每次请求都需要创建新的TCP连接,完成三次握手和四次挥手,网络利用率低。
- 队头阻塞 :如果前一个请求被某种原因阻塞了,会导致后续请求无法发送。
- 无状态 :HTTP1.0协议是无状态的,这意味着服务器不会记录之前的请求信息,每个请求都是独立的,相互之间没有关联。这可能导致一些问题,比如在需要发送多个请求的情况下,每个请求都需要建立新的TCP连接,这会增加网络开销和延迟。
- 缺乏管道化 :基于无状态的基础,HTTP1.0只能等待第一个请求响应继续发送后面的请求,但响应的顺序还是按照请求的顺序返回。这意味着在处理大量请求时,可能会存在性能瓶颈。
- 缺乏流控制 :HTTP1.0没有内置的流控制机制,这可能导致在发送大量数据时出现网络拥堵和丢包的情况。
- 缺乏服务器端推送 :HTTP1.0只能由客户端发起请求,服务器不能主动向客户端发送数据。这限制了服务器向客户端推送数据的能力。
- 安全性问题 :由于HTTP1.0的明文传输特性,它容易受到中间人攻击和窃听。此外,由于HTTP1.0不支持连接复用和管道化等特性,也增加了安全风险。
与HTTP1.1的区别
HTTP 1.0和 HTTP1.1的主要区别体现在以下方面:
- 连接管理 :HTTP 1.0默认使用非持久连接,即每个请求都需要建立新的TCP连接,而HTTP 1.1默认使用持久连接,通过复用TCP连接来避免频繁地建立连接和关闭连接,提高了网络利用率。
- 带宽优化 :HTTP 1.0中,如果客户端只需要获取某个对象的一部分,服务器会将整个对象发送给客户端,存在一定的带宽浪费。而HTTP 1.1引入了条件请求头(如范围请求头Range),允许客户端只请求资源的某个部分,提高了带宽利用率。
- 缓存机制 :HTTP 1.0提供了一个简单的缓存机制,但与HTTP 1.1相比,其设计的新特性以及对现有功能的细致规定相对较少。例如,HTTP 1.1引入了If-Unmodified-Since和If-Match头,为请求创建了其他形式的前提条件。
- 可扩展性 :HTTP 1.1具有更好的可扩展性,引入了OPTIONS方法,这是一种客户端在不实际请求资源的情况下了解服务器功能的方法。
总体而言, HTTP1.1在许多方面对HTTP 1.0进行了改进和优化,包括连接管理、带宽优化、缓存机制和可扩展性等。
在Java中应用HTTP1.0协议
在Java中应用HTTP1.0协议,可以使用Java内置的URLConnection类或Apache HttpClient库。
使用URLConnection类发送HTTP1.0请求的示例代码如下:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class Http1_0Example {
public static void main(String[] args) throws Exception {
String url = "http://example.com";
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestMethod("GET"); // 设置请求方法为GET
conn.setDoOutput(true); // 允许输出数据
conn.setRequestProperty("Connection", "Keep-Alive"); // 设置长连接
conn.connect(); // 建立连接
int responseCode = conn.getResponseCode(); // 获取响应状态码
if (responseCode == HttpURLConnection.HTTP_OK) { // 如果响应成功
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = reader.readLine()) != null) { // 读取响应内容
System.out.println(line);
}
reader.close();
} else { // 如果响应失败
System.out.println("HTTP error: " + responseCode);
}
conn.disconnect(); // 断开连接
}
}
使用Apache HttpClient库发送HTTP1.0请求的示例代码如下:
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
public class Http1_0Example {
public static void main(String[] args) throws Exception {
String url = "http://example.com";
HttpClient httpClient = HttpClientBuilder.create().build();
HttpGet httpGet = new HttpGet(url); // 创建GET请求对象
HttpResponse httpResponse = httpClient.execute(httpGet); // 执行请求并获取响应对象
HttpEntity httpEntity = httpResponse.getEntity(); // 获取响应实体对象
if (httpEntity != null) { // 如果响应实体对象不为空,则读取响应内容并输出到控制台
String responseString = EntityUtils.toString(httpEntity);
System.out.println(responseString);
}
}
}
知识拓展
通过下面的链接,我们一起来来了解更多的常用的一些网络协议
HTTP/2.0协议详解
HTTP1.1协议详解
gRPC协议详解
QUIC协议详解
Dubbo协议详解
RMI协议详解
Hessian协议详解