浏览器如何访问的服务器

image.png

扩展

url/uri:

URI = Universal Resource Identifier 统一资源标志符,用来标识抽象或物理资源的一个紧凑字符串。
URL = Universal Resource Locator 统一资源定位符,一种定位资源的主要访问机制的字符串,一个标准的URL必须包括:protocol、host、port、path、parameter、anchor。
URN = Universal Resource Name 统一资源名称,通过特定命名空间中的唯一名称或ID来标识资源。
系统架构&原理 - 图2

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报文格式
系统架构&原理 - 图3
特点:
1.无状态:协议对客户端没有状态存储,对事物处理没有“记忆”能力,比如访问一个网站需要反复进行登录操作
2.无连接:HTTP/1.1之前,由于无状态特点,每次请求需要通过TCP三次握手四次挥手,和服务器重新建立连接。比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量。
3.基于请求和响应:基本的特性,由客户端发起请求,服务端响应
4.简单快速、灵活
5.通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性

https:

《图解HTTP》这本书中曾提过HTTPS是身披SSL外壳的HTTP。HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。

PS:TLS是传输层加密协议,前身是SSL协议,由网景公司1995年发布,有时候两者不区分。

特点:

  1. 内容加密:采用混合加密技术,中间者无法直接查看明文内容
  2. 验证身份:通过证书认证客户端访问的是自己的服务器
  3. 保护数据完整性:防止传输的内容被中间人冒充或者篡改

    网络传输层

    系统架构&原理 - 图4

三次握手四次挥手

Tomcat系统总体架构

Tomcat请求处理大致过程

tomcat是一个http服务器主要接收和处理http请求,因此tomcat是一个http服务器。

image.png
当一个请求过来的时候会在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对象给客户端
image.png

tomcat系统总体架构

image.png
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(传输层)相关内容。
image.png
支持的协议和IO模型
默认是http/1.1,NIO
image.png

内部组件

image.png
总的来说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分布

image.png
通过 Coyote 模块提供链接通信,Jasper 模块提供 JSP 引擎,Naming 提供JNDI 服务,Juli 提供⽇志服务。

Catalina结构图

Tomcat/Catalina实例
image.png
一个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中存在体现