欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaEE基础(03):Http请求详解,握手挥手流程简介

程序员文章站 2023-11-08 13:08:04
本文源码: "GitHub·点这里" || "GitEE·点这里" 一、Http协议简介 1、概念说明 HTTP超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议,基于TCP/IP通信协议来传递数据:HTML文件、图片、查询数据等。HTTP协议基于客户端 服务端架构模式。浏览器作为 ......

本文源码:github·点这里 || gitee·点这里

一、http协议简介

1、概念说明

http超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议,基于tcp/ip通信协议来传递数据:html文件、图片、查询数据等。http协议基于客户端-服务端架构模式。浏览器作为http客户端通过url向服务端即web服务器发送请求。web服务器根据接收到的请求后,处理完请求后向客户端发送响应信息。

JavaEE基础(03):Http请求详解,握手挥手流程简介

2、协议特点

  • 简单快速

请求服务器时,只需传送请求方法和路径。请求类型常用get、post。由于http协议简单,使得http服务器的程序规模小,因而通信速度很快。

  • 灵活:

http允许传输任意类型的数据对象。正在传输的类型由content-type加以标记。

  • 无连接

无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

  • 无状态

http协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态则后续处理需要前面的信息,没有则需要重新请求,这样可能导致每次连接传送的数据量增大。

  • 支持客户/服务器模式

二、http请求详解

1、请求接口

public class servletoneimpl extends httpservlet {
    @override
    protected void doget(httpservletrequest request, httpservletresponse response)
            throws servletexception, ioexception {
        system.out.println("doget...");
        response.setcontenttype("text/html;charset=utf-8");
        string username = request.getparameter("username") ;
        response.getwriter().print("hello:"+username);
    }
    @override
    protected void dopost(httpservletrequest request, httpservletresponse response)
            throws servletexception, ioexception {
        system.out.println("dopost...");
        response.setcontenttype("text/html;charset=utf-8");
        string username = request.getparameter("username") ;
        response.getwriter().print("hello:"+username);
    }
}

2、请求内容

  • get请求

地址:http://localhost:6003/servletoneimpl?username=cicada

get /servletoneimpl?username=cicada http/1.1
host: localhost:6003
connection: keep-alive
upgrade-insecure-requests: 1
user-agent: mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko)
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
dnt: 1
referer: http://localhost:6003/request.jsp
accept-encoding: gzip, deflate, br
accept-language: zh-cn,zh;q=0.9
cookie: jsessionid=183c0f91b49a025c795fbc3067b37bc8
  • post请求

地址:http://localhost:6003/servletoneimpl

post /servletoneimpl http/1.1
host: localhost:6003
connection: keep-alive
content-length: 15
cache-control: max-age=0
origin: http://localhost:6003
upgrade-insecure-requests: 1
content-type: application/x-www-form-urlencoded
user-agent: mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) 
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
dnt: 1
referer: http://localhost:6003/request.jsp
accept-encoding: gzip, deflate, br
accept-language: zh-cn,zh;q=0.9
cookie: jsessionid=183c0f91b49a025c795fbc3067b37bc8

3、参数说明

  • method:常见get 和 post,另外还有delete、put 等 ;
  • uri:/servletoneimpl,和host组成请求的url ;
  • http/1.1:传输协议http,版本1.1 ;
  • host:请求资源所在的主机和端口 ;
  • connection:tcp连接默认不关闭,可以被多个请求复用 ;
  • upgrade-insecure-requests:浏览器不再显示 https 页面中的 http 请求警报 ;
  • content-length:指示实体主体大小,以字节为单位十进制数,发送到接收方。
  • cache-control:max-age=0使用缓存,但是会立即过期 ;
  • user-agent:客户端浏览器类型、版本、操作系统等信息 ;
  • content-type: 请求或响应中,传输资源类型信息 ;
  • origin:当前请求出自的站点 ;
  • accept:客户端声明自己可以接收的资源格式 ;
  • dnt: 请求禁用用户追踪 ;
  • referer:告诉服务器该网页是从哪个页面链接过来 ;
  • accept-encoding: 声明浏览器支持的编码类型 ;
  • accept-language: 声明浏览器支持的语言类型 ;
  • cookie: 辨识存储在客户端的缓存数据,通常会加密 ;

4、get和post区别

  • 浏览器端

从浏览器角度看这个两种请求的区别:get方式读取资源,比如get到静态页面,即使多次读取不会对访问数据产生影响,也被称为"幂等"操作。post方式在页面中定义表单,提交表单会把数据提交到服务器,而且多数情况下会产生数据,比如常用的保存数据接口,并非"幂等"操作,不幂等也就意味着不能随意多次执行。

  • 服务接口

这里指用ajax程序请求服务接口,提交的请求类型。或者其他http请求工具类,还有情况是微服务中各种feign接口间的请求。这种情况接口发送请求时,限制相对较少,比如rest风格接口常用get、post、put、delete,几种方式分别获取、创建、更新、删除 资源,

三、https请求协议

1、https简介

  • 基础概念

https:是以安全为准则的http通道,是http的安全版,在http请求上加入ssl层,https的安全基础是ssl,因此加密的详细内容就需要ssl。简单来说,https协议是由ssl+http协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

  • 安全模式

https协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

2、https工作原理

JavaEE基础(03):Http请求详解,握手挥手流程简介

(1)客户基于https方式访问服务端,与服务器建立ssl连接 ;
(2)服务端收到请求后,会将包含公钥的证书传送给客户端 ;
(3)客户端与服务端进行协调ssl连接的安全等级,也就是指加密的等级 ;
(4)客户端根据双方同意的安全等级,建立会话密钥,使用公钥将会话密钥加密,并传送给服务端 ;
(5)服务端使用私钥解密出会话中传递的内容,使用会话密钥加密与客户端之间的通信 ;

3、https和http区别

  • 安全证书

https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

  • 数据传输

http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

  • 连接方式

http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

四、tcp传输协议

1、tcp协议简介

tcp传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。tcp用意在于适应并支持多网络应用的分层协议层次结构。

2、三次握手

这一场景在生活中可以描述为通话:

甲:你好,我是甲,你是乙吗;
乙:你好甲:我是乙;
甲:正好找你有点事情,身份确认:

JavaEE基础(03):Http请求详解,握手挥手流程简介

  • 第一次握手

客户端主动向服务器发起请求连接,请求报文中发送syn=1,此时随机生成初始序列号seq=x,此时,客户端进程进入syn-sent同步已发送状态。

  • 第二次握手

服务端收到请求报文后,确认客户的syn,如果请求没有拒绝,则发出确认报文。报文中应该ack=1,syn=1,确认号是ack=x+1,同时自己也发送一个syn包seq=y,此时,服务器进程进入syn-rcvd同步收到状态。

  • 第三次握手

客户端收到确认后,需要向服务器确认报文的ack=1,ack=y+1,此时,tcp连接建立,客户端进入established已建立连接状态。完成三次握手,客户端与服务器开始传送数据。

3、四次挥手

JavaEE基础(03):Http请求详解,握手挥手流程简介

  • 第一次挥手

客户端发送一个结束fin,用来主动关闭和服务端的数据传输,释放连接且停止发送数据,报文首部:fin=1,序列号seq=u;随后客户端进入终止等待1状态fin-wait-1。

  • 第二次挥手

服务端收到这个fin,发出确认报文ack=1,确认收到序号是收到的序号+1,即ack=u+1,且带上自己的序列号seq=v,和syn一样,一个fin将占用一个序号。如此,服务器通知应用进程,客户端已经没有数据要发送,如果服务器发送数据,客户端依然要接收,该状态会持续一段时间,服务端进入关闭等待状态close-wait。客户端收到服务器的确认请求后,进入终止等待2状态fin-wait-2,等待服务器发送连接释放报文。

  • 第三次挥手

服务器向客户端发送释放连接报文结fin=1,ack=u+1,此时服务端还处于半关闭状态,服务器可能还会发送一些数据,此时序列号为seq=w,如此,服务器进入最后确认状态last-ack,等待客户端的确认。

  • 第四次挥手

客户端收到服务器的连接释放报文后,回发确认,ack=1,ack=w+1,序列号是seq=u+1,如此,客户端进入时间等待状态time-wait。此时tcp连接还没有释放,必须经过最长报文段寿命的时间后,才进入closed状态。msl:最长报文段寿命,一般2分钟,tcp连接释放时,主动方必须经过2msl后才进入closed状态,因此主动方关闭时间比较晚。

五、源代码地址

github·地址
https://github.com/cicadasmile/java-base-parent
gitee·地址
https://gitee.com/cicadasmile/java-base-parent

JavaEE基础(03):Http请求详解,握手挥手流程简介