浏览器如何访问的服务器
扩展
url/uri:
URI = Universal Resource Identifier 统一资源标志符,用来标识抽象或物理资源的一个紧凑字符串。
URL = Universal Resource Locator 统一资源定位符,一种定位资源的主要访问机制的字符串,一个标准的URL必须包括:protocol、host、port、path、parameter、anchor。
URN = Universal Resource Name 统一资源名称,通过特定命名空间中的唯一名称或ID来标识资源。
http/https:
http:
超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。
版本 | 产生时间 | 内容 |
---|---|---|
HTTP/0.9 | 1991年 | 不涉及数据包传输,规定客户端和服务器之间通信格式,只能GET请求 |
HTTP/1.0 | 1996年 | 传输内容格式不限制,增加PUT、PATCH、HEAD、 OPTIONS、DELETE命令 |
HTTP/1.1 | 1997年 | 持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码 |
HTTP/2 | 2015年 | 多路复用、服务器推送、头信息压缩、二进制协议等 |
多路复用:通过单一的HTTP/2连接请求发起多重的请求-响应消息,多个请求stream共享一个TCP连接,实现多留并行而不是依赖建立多个TCP连接。
http报文格式
特点:
1.无状态:协议对客户端没有状态存储,对事物处理没有“记忆”能力,比如访问一个网站需要反复进行登录操作
2.无连接:HTTP/1.1之前,由于无状态特点,每次请求需要通过TCP三次握手四次挥手,和服务器重新建立连接。比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量。
3.基于请求和响应:基本的特性,由客户端发起请求,服务端响应
4.简单快速、灵活
5.通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性
https:
《图解HTTP》这本书中曾提过HTTPS是身披SSL外壳的HTTP。HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。
PS:TLS是传输层加密协议,前身是SSL协议,由网景公司1995年发布,有时候两者不区分。
特点:
三次握手四次挥手
Tomcat系统总体架构
Tomcat请求处理大致过程
tomcat是一个http服务器主要接收和处理http请求,因此tomcat是一个http服务器。
当一个请求过来的时候会在servlet容器找能处理请求的servlet,Servlet 容器通过Servlet接⼝调⽤业务
类。Servlet接⼝和Servlet容器这⼀整套内容叫作Servlet规范。
Tomcat两个重要角色:
1.充当http服务器。
2.整个tomcat也是一个大的servlet容器。
Servlet容器执行流程
1.http服务器将请求封装成servletRequest进行发送。
2.容器收到这个servletRequest后会通过url和servlet的映射关系找到对应的Servlet进行处理
3.如果这个servlet未被加载,通过反射机制对它进行加载,并且调用init方法完成初始化
4.处理完成后将处理结果封装成servletResponse对象发送给http服务器
5.http返回response对象给客户端
tomcat系统总体架构
Tomcat 设计了两个核⼼组件连接器(Connector)和容器(Container)来完成 Tomcat 的两⼤核⼼
功能。
连接器,负责对外交流: 处理Socket连接,负责⽹络字节流与Request和Response对象的转化;
容器,负责内部处理:加载和管理Servlet,以及具体处理Request请求;
连接器组件Coyote
概述
客户端通过Coyote与服务器建立连接、发送请求并接收响应
主要做了以下几件事情
1)封装了底层的网络通信(socket请求和响应)
2)是Catalina容器与具体的请求解耦
3)将socket输入转换为request对象并对request对象进一步封装为Catalina能处理的对象交给Catalina处理,并解析处理好的response
4)coyote是具体协议(应用层)和IO(传输层)相关内容。
支持的协议和IO模型
默认是http/1.1,NIO
内部组件
总的来说coyote主要就输针对发送来的请求做处理的过程(如何连接,如何处理数据),并将请求数据处理后交由catalina处理并接收处理结果对象返还的一个中间组件
组件 | 描述 |
---|---|
EndPoint | EndPoint 是 Coyote 通信端点,即通信监听的接⼝,是具体Socket接收和发送处理器,是对传输层的抽象,因此EndPoint⽤来实现TCP/IP协议的 |
Processor | Processor 是Coyote 协议处理接⼝ ,如果说EndPoint是⽤来实现TCP/IP协议的,那么Processor⽤来实现HTTP协议,Processor接收来⾃EndPoint的Socket,读取字节流解析成Tomcat Request和Response对象,并通过Adapter将其提交到容器处理,Processor是对应⽤层协议的抽象 |
ProtocolHandler | Coyote 协议接⼝, 通过Endpoint 和 Processor , 实现针对具体协议的处理能⼒。Tomcat 按照协议和I/O 提供了6个实现类 : AjpNioProtocol ,AjpAprProtocol, AjpNio2Protocol , Http11NioProtocol , Http11Nio2Protocol ,Http11AprProtocol |
Adapter | 由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat定义了⾃⼰的Request类来封装这些请求信息。ProtocolHandler接⼝负责解析请求并⽣成Tomcat Request类。但是这个Request对象不是标准的ServletRequest,不能⽤Tomcat Request作为参数来调⽤容器。Tomcat设计者的解决⽅案是引⼊CoyoteAdapter,这是适配器模式的经典运⽤,连接器调用CoyoteAdapter的Sevice⽅法,传⼊的是Tomcat Request对象,CoyoteAdapter负责将Tomcat Request转成ServletRequest,再调⽤容器 |
Servlet容器 Catalina组件
Tomcat模块分层结构图及Catalina分布
通过 Coyote 模块提供链接通信,Jasper 模块提供 JSP 引擎,Naming 提供JNDI 服务,Juli 提供⽇志服务。
Catalina结构图
Tomcat/Catalina实例
一个server对应多个Service实例,每一个Service实例又对应多个Connector和Container
Catalina
负责解析Tomcat的配置⽂件(server.xml) , 以此来创建服务器Server组件并进⾏管理
Server
服务器表示整个Catalina Servlet容器以及其它组件,负责组装并启动Servlaet引擎,Tomcat连接
器。Server通过实现Lifecycle接⼝,提供了⼀种优雅的启动和关闭整个系统的⽅式
Service
服务是Server内部的组件,⼀个Server包含多个Service。它将若⼲个Connector组件绑定到⼀个
Container
Container
容器,负责处理⽤户的servlet请求,并返回对象给web⽤户的模块
Container具体组件
可以看到Container中含有多个组件分别是Engine、Host、Context和Wrapper。这4中容器为父子关系
Engine 表示整个Catalina的Servlet引擎,⽤来管理多个虚拟站点,⼀个Service最多只能有⼀个Engine,
但是⼀个引擎可包含多个Host
Host
代表⼀个虚拟主机,或者说⼀个站点,可以给Tomcat配置多个虚拟主机地址,⽽⼀个虚拟主机下
可包含多个Context
Context
表示⼀个Web应⽤程序, ⼀个Web应⽤可包含多个Wrapper
Wrapper
表示⼀个Servlet,Wrapper 作为容器中的最底层,不能包含⼦容器
上面的组件都可以在server.xml中存在体现