Tomcat与JavaWeb开发技术详解(第三版)第⼀章Web运作原理探析笔记⽂章⽬录
第⼀章 Web 运作原理探析
1.1 Web 的概念
Web是⼀种分布式应⽤架构。 旨在共享分布在⽹络上的各个Web服务器中所有互相连接的信息。Web采⽤客户/服务器通信模式,客户与服务器之间⽤HTTP协议通信。
Web具有以下三个特征
信息表达:⽤超级⽂本技术(HTML)来表达信息,以及建⽴信息与信息的连接。
信息定位:⽤统⼀资源定位技术(URL)来实现⽹络上信息的精确定位。
信息传输:⽤⽹络应⽤层协议(HTTP)来规范浏览器与Web服务器之间的通信过程。
1.2 HTML 简介
HTML(Hyper Text Markup Language)超⽂本标记语⾔具有以下特点:
允许直接包含纯⽂本信息。
利⽤<img>、<audio>和<video>等来标记包含图⽚、声⾳和视频等多媒体形式的信息。
利⽤<table>、<p>、<br>、<b>等标记来设定信息在浏览器中的展⽰各式。
利⽤超链接标记<a>来连接其他信息。
1.3 URL简介
当⽤户打开浏览器,输⼊⼀个URL地址时,就能接收远程Web服务器发送过来的数据。统⼀资源定位器(Uniform Resource
Locator,URL)是专为标记⽹络上统⼀资源的位置⽽设的⼀种编址⽅式。
URL⼀般由以下3个部分组成:
应⽤层协议
主机IP地址或域名
资源所在路径或⽂件名
1.4 HTTP 简介
HTTP超⽂本传输协议(Hypertext Transfer Protocol ,HTTP)是关于如何在⽹络上传输超级⽂本(HTML)的协议。
HTTP规定了Web的基本运作过程,以及浏览器与服务器之间的通信细节。
HTTP采⽤客户/服务器通信模式。
在分层的⽹络结构中,HTTP位于应⽤层,建⽴在TCP/IP的基础上,HTTP使⽤可靠的TCP连接,默认端⼝是80。
客户端与服务器之间的⼀次通信过程:
客户端与服务器建⽴TCP连接。
客户端发出HTTP请求。
服务器端发送回相应的HTTP响应。
客户端与服务器之间的TCP连接关闭。
注意: 在HTTP/1.1中,为了提⾼服务器相应客户端请求的性能,在⼀个TCP连接中,允许处理多个HTPP请求。
浏览器应该具备的功能:
1. 请求与Web服务器建⽴TCP连接。
2. 创建并发送HTTP请求。
3. 接收并解析HTTP响应。
4. 在窗⼝中展⽰HTML⽂档。
Web服务应具备的功能:
1. 接收来⾃浏览器的TCP连接。
2. 接收并解析HTTP请求。
3. 创建并发送HTTP响应。
1.4.1 HTTP请求格式
HTTP规定,HTTP请求由如下3部分组成:
请求⽅法、URI和HTTP版本。
请求头(Request Header)。
请求正⽂(Request Content)。
请求⽅式,URI和HTTP的版本
统⼀资源标识符(Uniform Resource Identifier,URI)。
HTTP请求⽅式:
请求头(Request Header)
请求同包含许多有关客户端环境和请求正⽂的有⽤信息。
请求正⽂(Request Content)
HTTP规定,请求头和请求正⽂之间必须以空⾏分隔(CRLF),这个空⾏表⽰请求头已经结束,接下来是请求正⽂。请求正⽂可以包含客户以POST⽅式提交的form表单数据。
如:username=zs&password=123456
1.4.2 HTTP响应的格式
HTTP响应也由3部分组成:
HTTP版本、状态代码和描述
响应头(Response Header)
响应正⽂(Response Content)
1. HTTP的版本、状态代码和描述
HTTP响应的第⼀⾏包括服务器使⽤的HTTP版本,状态码以及对状态码的描述。
HTTP/1.1 200 OK
状态代码是⼀个3位数的整数,以1、2、3、4或5开头:
1xx:信息提⽰,表⽰临时响应 。
2xx:响应成功,表明服务器成功接收到了客户端的请求。
3xx:重定向。
4xx:客户端错误,表明客户端可能有问题。
5xx:服务器错误,表明服务器遇到了某种错误⽽不能响应客户请求。
常见的状态码:
400:错误的请求。客户端发送的HTTP请求不正确。
404:⽂件不存在。在服务器上没有客户要求访问的⽂档。
405:服务器不⽀持客户的请求⽅式。
500:服务器内部错误。
2. 响应头(Response Header)
Server: Apache-Coyote/1.1      //服务器类型
Content-type: text/html;charset=GBK  //正⽂类型
Content-length: 102          //正⽂长度
3. 响应正⽂(Response Content)
响应正⽂就是服务器返回的具体数据,它是浏览器真正请求的访问信息。最常见的是HTML⽂档:
<html>
<head>
<title>helloapp</title>
</head>
<body>
<h1>hello</h1>
</body>
</html>
HTTP请求头和请求正⽂之间是⽤空⾏隔开,同样的,HTTP响应头和响应正⽂之间也必须⽤空⾏隔开。
当浏览器接收到HTTP响应后,会根据响应正⽂的不同类型来进⾏不同的处理。
1.4.3 正⽂部分的MIME协议
MIME(Multipurpose Internet Mail Extension)多⽤途⽹络邮件扩展协议,这⾥的邮件不单指E-Mail,
还包括通过各种应⽤层协议在⽹络上传输的数据。因此,可以将HTTP中的请求正⽂和响应正⽂看作邮件。MIME规定了邮件的标准数据格式,从⽽使得接收⽅能够“看懂”发送⽅发送的邮件。
在HTTP请求头或响应头中,Content-type来表⽰MIME的数据类型。
⽂件扩展名                          MIME类型
未知的数据类型或不可识别的扩展名  content/unknown
.bin、exe、.o、.a、.z、  .application/octet-stream
.pdf  .application/pdf
.zip  .application/zip
.tar  application/x-tar
gif  image/gif
.jgp、.jpeg  image/jpeg
.htm、.html  text/html
.text、.c、.h、.txt、.java  text/plain
.mpg、.mpeg  video/mpeg
.xml  application/xml
1.4.4 HTTP各个版本的特点
1. HTTP/0.9
1991年发布,HTTP请求中不包含HTTP的版本号和头信息,并且只有⼀个GET⽅法。HTTP响应结果只能包含HTML⽂档,不允许包含多媒体⽂件。
2. HTTP/1.0
1996年发布,在HTTP/0.9的基础上做了很⼤的改进。不仅⽀持GET⽅法,还⽀持POST和HEAD⽅法。HTTP响应结果中可以包含⽂档、图⽚、视频或其他类型的数据。
请求和响应都增加了版本号和头部信息。响应结果中包含状态码、授权认证、缓存和内容编码等信息。
HTTP/1.0的⼀个主要缺点: 在⼀次TCP连接中只能发出⼀次TCP请求,即针对每⼀个HTTP请求都要建
⽴⼀个TCP连接。⽽重复建⽴客户端与服务器之间的TCP连接很耗资源,会减慢服务器响应客户端的速度。
3. HTTP/1.1
1999年发布。相对于1.0有很⼤的改进。
(1)持久TCP连接
在HTTP/1.1的请求头中,可以通过以下参数来设置持久TCP连接的参数:
Connection: Keep-Alive      //TCP连接在处理完⼀个请求和不断开(默认)
Keep-Alive: max=5; timeout=120  //max最⼤请求数,timeout指定TCP连接的最长闲置时间
HTTP/1.1 建⽴TCP连接后,默认情况下不会再处理完⼀个请求后⽴即断开,⽽是允许处理多个有序的HTTP请求。客户端如果想要主动关闭连接,那么在最后⼀个请求的请求头中加上 “Connection:close” 来指定关闭这个连接。或者根据配置的参数条件达到会⾃动关闭连接。
(2)管道机制
即在⼀个TCP连接中,客户端发送⼀个请求后,不需要等待收到服务器的HTTP响应后才发送下⼀个请求,客户端可以连续发送多个请求,服务器根据接收请求的先后顺序依次把响应返回给客户端。
(3)⽀持更多的请求⽅法如PUT和DELETE等。
HTTP/1.1的缺点: 虽然⽀持持久TCP连接,并且引⼊了管道机制,但是核⼼处理机制还是按照先后顺序来处理HTTP请求的,并依次返回响应内容。只有前⼀个响应⽣成完毕才能⽣成下⼀个响应如果⽣成前⼀个响应⾮常慢,那么后⾯的响应任务只能等待,导致响应任务队列堵塞。
4. HTTP/2.0
2015年发布,相⽐于1.1,主要在⼆进制协议、多路复⽤、头部信息压缩、推送、请求优先级和安全等⽅⾯做了创新和改进。
(1)⼆进制协议
HTTP/2.0 将数据分成⼀个⼀个的帧,头部帧存储元数据(即头部信息),数据帧存放正⽂数据。HTTP/1.1请求和响应的头部信息是⽂本,正⽂数据即可以是⽂本,也可以是⼆进制数据。HTTP/2.0请求和响应的头部和正⽂部分都是⼆进制数据。
(2)多路复⽤
提供web服务的是什么
在同⼀个TCP连接中,可以并发的传输多个响应的结果⼆进制数据流,解决了HTTP/1.1中的响应任务队列堵塞的问题。
(3)头部压缩
当同⼀个客户端不断访问服务器时,有很多的重复数据,⽐如,Cookie数据会在请求头中反复发送,这会增加带宽的使⽤以及延迟。为了解决这个问题,HTTP/2.0引⼊了头部压缩机制。
头部信息以霍夫曼编码对⽂本值进⾏编码。所有头部信息都被放在⼀张头部信息表⾥⾯,由客户端和服务器共同维护,随后的请求中省略所有的重复信息,仅适⽤⼀个索引号,服务端根据索引号从头部信息表中检索相应的信息。
(4)推送
当服务器知道客户端要请求某个资源时,就会主动将该资源推送到客户端,甚⾄不需要客户端主动发送这个请求。
如:当客户端访问某个⽹页时,若服务器端发现这个⽹页⾥⾯包含了图⽚资源和脚本资源,就会主动把这些资源发送到客户端,这样就减少了客户端发送请求的次数。
(5)请求优先级
客户端可以在请求头⾥添加⼀个优先级信息来为请求的⼆进制流分配优先级。服务器会根据优先级来处理请求信息。
(6)安全
默认情况下,HTTP/2.0都是基于 安全传输层协议(Transport Layer Security,TLS) 来进⾏通信的。TLS 协议会确保客户端与服务器通信过程中数据的保密性和完整性。
1.5 ⽤Java套接字穿件HTTP客户与服务器程序
package server;
import java.io.InputStream;
import java.io.OutputStream;
import java.ServerSocket;
import java.Socket;
public class HTTPServer {
public static void main(String[] args){
int port;
ServerSocket serverSocket;
try{
port = Integer.parseInt(args[0]);
}catch(Exception e){
System.out.println("port = 8080 (默认)");
port =8080;
}
try{
//创建⼀个服务器
serverSocket =new ServerSocket(port);
System.out.println("服务器正在监听端⼝:"+ LocalPort());
while(true){//服务器再⼀个⽆限循环中不断接收来做客户端的TCP连接请求
try{
//accpet()接收⼀个套接字中已建⽴的连接
final Socket socket = serverSocket.accept();
System.out.println("建⽴了与客户的⼀个新的连接,该客户的地址为:"
+ InetAddress()+":"+ Port());
service(socket);
}catch(Exception e){
e.printStackTrace();

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。