HTTP 协议

超文本传输协议。
属于TCP/IP协议模型中的 应用层 协议(无状态),底层通过TCP协议建立连接。通过浏览器访问网页,本质是通过HTTP协议获取网页内容。 

一、HTTP 构成 

状态行、响应头部(header)、空行、应体数据。

1.1、HTTP 请求格式 

GET /favicon.ico HTTP/1.1
Host: 121.40.62.167:9999
Connection: keep-alive
User-Agent: Mozilla/5.0 (windows NT 10.0: Win64: x64) Applewebkit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 safari/537.36 Edg/103.0.1264 .49
Accept: image/webp, image/apng, image/svg+xml, image/*, */*;q=0.8Referer: http://xxxxxxx:9999/Accept-Encoding: gzip, deflate
Accept-Language: zh-CN, zh:q=0.9, en: q=0.8, en-GB;q=0.7, en-US;q=0.6
 
Cookie: order=id20desc; serverType=nginx: pro_end=-1: 1td_end=-1: memsize=3748; bt_user_info=87B822status2283Atrue82C22msg2283A8228u83B78u5 3D68u6210%u529F82182282C22data223A87B822username 223A822183****78392287D87D: backup_path=/www/backup: sites_path=/www/wwwroot; site_model=ava: config-tab=1: 9273e354ba8b7935dcc533ebc06536a1=ab3ce455-9457-49d4-b89c-2c04cc01b71c.xR1YyxrEwTAUYzvxseaocd07_Us; request_token=KMakqkKidow7YyDmGylvP57BXkPCOAWIpoQnp302zq6RX6wD: network-unitType=KB/s; disk-unitType=MB/s; controlType=control
If-Modified-since: Wed, 22 Jul-2009 19:15:56 GMT

1.2、HTTP 响应消息格式 

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 20 Feb 2017 09:13:59 GMT
Content-Type: text/plain;charset=UTF-8
Vary: Accept-Encoding
Cache-Control: no-store
Pragrma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control: no-cache
Content-Encoding: gzip
Transfer-Encoding: chunked
Proxy-Connection: Keep-alive
 
{"code":200,"notice":0,"follow":0,"forward":0,"msg":0,"comment":0,"pushMsg":null,"friend":{"snsCount":0,"count":0,"celebrityCount":0},"lastPrivateMsg":null}

二、HTTP 参数 

2.1、请求类型 

OPTIONS :返回服务器针对特定资源所支持的HTTP请求类型,也可以利用向服务器发送 * 的请求来测试服务器的功能性;
HEAD :向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回,这一方法可以在不必传输整个响应内容的情况下,就可以获取响应消息头中的元信息;
GET :向特定的资源发出请求;
POST :向指定资源提交数据进行处理请求(例如提交表单或者上传文件);数据被包含在请求体中,POST请求可能会导致新的资源的创建和/或已有资源的修改;
PUT :向指定资源位置上传其最新内容;
DELETE :请求服务器删除 Request-URI 所标识的资源;
TRACE :回显服务器收到的请求,主要用于测试或诊断;
CONNECT :HTTP/1.1 协议中,预留给能够将连接改为管道方式的代理服务器。

POST 和 GET 

GET 
1.用于信息获取,应该是安全和幂等的;
2.是会被浏览器主动缓存的,如果下一次传输的数据相同,那么就会返回缓存的内容;
3.方法的 URL 一般都具有长度限制,HTTP协议本身并未规定GET请求的长度,这个长度限制主要由浏览器和Web服务器决定;
4.只产生一个TCP数据包,浏览器会把请求头和请求数据一并发送出去;
POST 
1.表示可能修改变服务器上资源的请求,因为有可能修改服务器上的资源,所以它不符合安全和幂等性;
2.方法的请求信息放置在请求体中,所以请求信息是没有长度限制的;
3.方法会产生两个 TCP 数据包,浏览器会先将请求头发送给服务器,待服务器响应100 continue,浏览器再发送请求数据,服务器响应200。

2.2、状态码 

2.3、HTTP 版本 

HTTP1.0:http 1.0默认是短连接,即每次请求都要重新建立一个TCP连接,处理完就释放TCP连接。如果需要使用持久连接,则需要显式声明Connection: keep-alive;
HTTP1.1:http 1.1默认支持长连接,不需要显式声明Connection: keep-alive,底层的TCP连接会一直保持,所有HTTP请求都会基于同一个TCP连接;同时引入了Cookie机制;
HTTP2.0:支持 多路复用,基于一个TCP连接并行发送多个请求以及接收响应;HTTP1.1在同一时间对于同一个域名的请求数量有限制,超过限制就会阻塞请求。而多路复用机制底层采用了"增加二进制分帧层"的方法,在不改变原来的语义、首部字段的情况下提高了传输性能,降低延迟。
HTTP3.0:基于 UDP 的 QUIC 协议 可实现类似 TCP 的可靠性传输。
1.无队头阻塞:在同一条连接上并发传输多个 Stream,Stream是一个 HTTP 请求,当某个流发生丢包时,只会阻塞这个流。
2.连接迁移:基于 TCP 传输协议的 HTTP 协议,通过四元组(源 IP、源端口、目的 IP、目的端口)确定一条 TCP 连接。连接迁移基于连接 ID 实现。

2.4、HTTPS 原理

HTTP协议是明文传输,HTTPS协议基于HTTP进行通信,但用了 SSL/TLS 建立安全信道,加密数据包。
注意:TLS/SSL是传输层加密协议,功能实现主要依赖于三类基本算法:散列函数、对称加密、非对称加密。
非对称加密:实现身份认证和密钥协商,
对称加密:采用协商的密钥对数据加密,
散列函数:验证信息的完整性,防止篡改。

整体流程:

1.浏览器请求HTTPS域名,同时携带自己支持的加密规则给目标网站;
2.网站从客户端支持的加密规则中,选出一套 对称加密算法 和 Hash算法 ,然后把自己的身份信息用 证书 的方式发回给浏览器,证书里包含 网站地址 、 加密公钥 、 证书颁发机构 等;
3.浏览器验证证书的合法性,接着用约定好的对称加密算法生成一串 随机数密码 ,然后用证书中的 公钥 对该对称密钥进行加密;
4.浏览器用约定好的Hash算法计算握手消息并生成一串Hash值,然后用对称密钥加密 握手消息+握手消息Hash值 ,并一起发送给网站服务端;
5.网站用 私钥 对消息解密,获取对称密钥,然后用对称密钥解密握手消息,获取到握手消息及其Hash值;接着,用Hash算法对握手消息进行一次Hash,并比对客户端上送的握手消息Hash值,一致则说明消息没有被篡改;
6.然后,网站用对称密钥加密一段握手消息—— 握手消息+握手消息Hash值 给客户端;
7.客户端用对称密钥解密并计算握手消息的Hash值,如果与服务端发来的Hash值一致,则握手过程结束,之后所有的通信将由双方协商好的 对称密钥 加密通信。

三、日常使用 

3.1、HTTP 的不同方法 

3.2、SpringBoot 配置 https 

TLS/SSL 证书都是CA机构颁发的,一些云服务器厂商提供免费的HTTPS证书,一个账号可以申请数个。也可用 Java 自带 JDK 管理工具 keytool(JDK的bin包下)生成免费的 https 证书(不被操作系统和浏览器信任)。

3.2.1、执行命令生成数字证书

keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore D:\httpsKey.p12 -validity 365

命令含义

keytool 表示keytool工具
genkey 表示要创建一个新的密钥。
alias 表示keystore的别名。
keyalg 表示使用的加密算法是RSA,一种非对称加密算法。
keysize 表示密钥的长度。
keystore 表示生成的密钥存放位置。
validity 表示密钥的有效时间,单位为天。

D盘会生成 httpsKey.p12 文件

3.2.2、配置 SpringBoot 

1、我们将生成的 httpsKey.p12 拷贝到SpringBoot项目中的 resources 目录下
2、并在配置文件 application.yml 中加入以下配置

server:
  port: 8080
  servlet:
    context-path: /ssl-service
 
  ssl:
    key-store: classpath:httpsKey.p12 #表示密钥文件名
    key-alias: tomcathttps #表示密钥别名
    key-store-password: 123456 #就是在cmd命令执行过程中输入的密码
    key-store-type: JKS # 证书类型
    enabled: true  # 开启证书验证

3、Spring Boot 不支持同时在配置中启动 HTTP HTTPS,可配置请求重定向,将 HTTP 请求重定向为 HTTPS 请求。

@Configuration
public class TomcatConfig {
    @Bean
    TomcatServletWebServerFactory tomcatServletWebServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
        factory.addAdditionalTomcatConnectors(createTomcatConnector());
        return factory;
    }
    private Connector createTomcatConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8081);
        return connector;
    }
}

3.3、SpringBoot 切换 HTTP 版本 

3.3.1、HTTP1.0/1.1 的切换 

# server.http-version=1.0 # 设置为 1.0 版本
server.http-version=1.1 # 设置为 1.1 版本

3.3.2、HTTP2.0 的切换 

当前浏览器均只支持 HTTP/2 Over TLS,需要证书。
SpringBoot 默认tomcat服务器,tomcat9及以上才支持http2.0。undertow 支持http2.0,可切换undertow服务器。

3.3.2.1、配置Web服务器

<!--  springboot 整合web组件-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<!-- 从依赖信息里移除 Tomcat配置 -->
	<exclusions>
		<exclusion>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-undertow</artifactId>
	<exclusions>
		<exclusion>
			<groupId>org.jboss.xnio</groupId>
			<artifactId>xnio-nio</artifactId>
		</exclusion>
	</exclusions>
</dependency>

 3.3.2.2、配置Web服务器

server:
  port: 9999
  compression:
    enabled: true
  http2:
    enabled: true
  ssl:
    key-store: classpath:keystore.p12 # 启用http2
    key-store-password: 123456 # 证书密码
    key-store-type: PKCS12 # 证书类型
    protocol: TLSv1.2 # 协议类型
    key-alias: http2_undertow
    enabled: true

3.3.2.3、 增加9910端口http的监听

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.undertow.UndertowBuilderCustomizer;
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;

@SpringBootApplication
public class Http2ApplicationMain implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {
 
    public static void main(String[] args) {
        SpringApplication.run(Http2ApplicationMain.class,args);
    }
 
    @Override
    public void customize(UndertowServletWebServerFactory factory) {
        factory.addBuilderCustomizers((UndertowBuilderCustomizer) builder -> {
            builder.addHttpListener(9910, "0.0.0.0");
        });
    }
}

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值