学习Java Web首先要知道Web应用程序的请求过程,客户端与服务器之间是如何通信的,这样我们可以更加灵活的处理请求和响应的消息。
什么是HTTP协议?
HTTP是超文本传输协议(Hypertext Transfer Protocol),它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间的交换数据的过程。(HTTP所用的端口号80,HTTPS所用端口号是443)
主要特点
- 简单快速:客户端向服务器请求服务时,只需传送请求方法和路径。
- 无连接:无连接的含义是限制每次只处理一个请求。服务器处理完客户的请求,并受到客户的应答后,即断开连接。采用这种方式可以节省传输时间
- 无状态:HTTP是一个无状态的协议,无状态是指WEB浏览器和服务器之间不需要建立持久的联系。
HTTP工作原理
HTTP的工作流程:
1.客户端连接到web服务器
当我们在浏览器输入网址或者当我们点击链接时,HTTP开始工作。
2.发送HTTP请求
建立连接后,客户机发送一个请求给服务器,如当我们在浏览器地址栏输入Michaeljian.top
后回车,浏览器将我们的请求封装成HTTP报文。请求报文的格式:
- 请求行
- 请求头部
- 空行
- 请求数据
3.服务器接受请求并返回HTTP响应
Web服务器解析请求,定义请求资源。服务器将资源复本 写到TCP套接字中,有客户端读取。响应报文的格式:
- 状态行
- 响应头部
- 空行
- 响应数据
4.释放TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。
5.客户端浏览器解析HTML内容
客户端浏览器首先会解析状态行,查看请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
DNS域名解析
在浏览器地址栏输入URL,按下回车之后会经历以下流程:
浏览器向DNS服务器请求解析该URL中的域名对应的IP地址;
解析出IP地址后,根据该IP地址和默认端口80,和服务器建立TCP连接;
浏览器发出读取文件(URL中域名后面部分对应的文件)的HTTP请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器;
服务器对浏览器请求做出响应,并把对应的HTML文本发送给浏览器;
释放TCP连接;
-
浏览器将该HTML文本并显示内容;
HTTP协议版本以及区别
HTTP协议的版本:HTTP/1.0、HTTP/1.1、HTTP/2.0
- 在HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源。
- 在HTTP1.1协议,允许客户端与web服务器建立连接后,在一个连接上获取多个web资源。
- 在HTTP2.0协议中,
- 新的二进制格式:HTTP1.x的解析是基于文本协议的格式 解析存在天然的缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二级制在不同,只有0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制的格式,实现方便且健壮。
- 多路复用:即连接共享,每个request都是用作连接共享机制的。
- header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
- 服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能。
URI和URL的区别
URL是统一资源地位符(Uniform Resource Locator)。URL是URI的一种,不仅标识了Web 资源,还指定了操作或者获取方式,同时指出了主要访问机制和网络位置。
http://michaeljian.top/
URI是统一资源标识符(Uniform Resource Identifier)。URI是个纯粹的语法结构,用于指定标识Web资源的字符串的各个部分。
例子:ftp://ftp.is.co.za/rfc/rfc1808.txt (also a URL because of the protocol)
URN是统一资源名称(Uniform Resource Name)URN是URI的一种,用特定命名空间的名字标识资源。使用URN可以在不知道其网络位置及访问方式的情况下讨论资源。
HTTP之请求消息Request
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
请求行
请求行中个请求方式最常用的是GET和POST,用户如果没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。
两种方式的主要区别:
如果请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:
GET /mail/1.html?name=abc&password=xyz HTTP/1.1
。在URL地址后附带的参数是有限制的-
如果请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,Post方式的特点:传送的数据量无限制。
HTTP之响应消息Response
一个HTTP响应代表服务器向客户端回送的数据,它包括: 一个状态行、若干消息头、以及实体内容 。
HTTP之状态码
HTTP与HTTPS的区别
HTTP是HTTP协议运行在TCP之上。所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。
HTTPS是HTTP运行在SSL/TLS之上,SSL/TLS运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。此外客户端可以验证服务器端的身份,如果配置了客户端验证,服务器方也可以验证客户端的身份。