Analysis of tomcat architecture <2>

Insert picture description here

下一步 此时会创建一个过滤器链,这个过滤器链就是我们假如要定义一个Filter
此时需要执行的逻辑

	   //...执行servlet之前[pre]
		filterChain.dofiter()// 在执行这个过滤器链子过程钟 我可能会执行servlet
	  //..执行servlet之后[after]
	 类似于这样,也就是说一个请求,被tomcat接受后 先执行fitler的pre方法   再执行	filterChain.dofiter()  这个方法 ,在这个中间就会执行servlet,然后再会执行after方法 

Insert picture description here
So at this time, the real doget method to execute the servlet is to
Insert picture description here
look at his input and see that it is the object at this time.
Insert picture description here
This method is clicked in and it is servlet.service

Insert picture description here
Back to servle, isn’t it called here right now?
So

所以说真正调用doget的逻辑 并不在在tomcat 而是在Httpservlet,
也就是说tomcat里面实际上调用的是我们的servlet.service,最终会让我们
HttpServlet来负责并且判断调用doget(), 并且执行接下来的逻辑

Insert picture description here
Now let me talk about the second half, and now the first half is how the request object is generated?
What happened to the browser from a request to the request object

说白了 tomcat此时就是接受数据 然后将数据封装成request对象,
呢么tomcat毕竟是一个应用程序,应用程序的数据从哪里来的,肯定是操作系统给的
呢么操作系统的数据又是从哪里来,肯定是另外一台服务器给的
所以此时可以这么想

服务器A---------->服务器B
(浏览器)
服务器A 给服务器B发送数据
数据+ip(服务器B)
我们此时的每一个请求都是安全可靠的,此时的可靠就代表着在发送数据过程中间
数据是不可以丢失的 ,	此时就涉及到tcp协议
================================================>
tcp协议可以保证服务器B 接受的数据是完整的 也就是说不会丢失
协议只是规范,此时需要有人来实现这个协议 操作系统来实现 的 比方说window,linux 
因为tcp 协议只是一个传输协议,[负责数据的传输]具体传输的数据是什么 此时与我不关心 ,所以此时用操作系统来实现比较好 
============================================?
也就是数据是应用程序生成的数据然后再来掉用操作系统的接口将数据进行传输
应用程序生成的数据调用操作系统的接口来传输数据
tcp协议肯定是在操作系统这个层面上实现的
===========================>
{
    
    
所以说此时
	应用程序生产数据
	建立一个tcp连接
	基于Tcp连接发送数据
}
建立一个tcp连接  最开始要进行3次握手
但是此时我Java程序需要建立tcp连接 不可能调用到你操作系统的方法底层(tcp-connect)方法,或者说操作系统的核心方法不会让你上层的应用程序来调用
 此时操作系统会创建一个socket接口来 供上层应用程序调用 继而调用底层的核心来建立tcp
 	socket是操作系统提供的接口 而我们的上层的应用程序只能使用这个socket











Insert picture description here

当我new 一个Socket的时候 最终会调用本地的这个方法来进行tcp连接
socket是操作系统提供的, 供我们建立tcp连接用
源码就不看了 不好找

Back to our tomcat, for tocmat, it is to fetch data because it often accepts the data sent by others and then encapsulates it into a request
. Where does tomcat receive the data?
Of course it is on the socket, what tomcat is going to do next It is the data retrieved from the socket for analysis, and then encapsulated into Request

接下来 我们tomcat 要做的事情就是把我从socket拿出来的数据
	进行解析 解析成请求  通过什么方式来解析 我们通常用的http协议
	Http协议是一个应用层面得协议,
	 说白了 我不关注于数据得传输,我只关心数据得格式
==================================================》
也就是下一步tomcat 接受到了一个http协议也就是说一个请求得时候,
就要吧数据按照http协议的格式吧这个数据解析出来对吧然后解析成request对象
-------------------->
 tomcat从socket中取数据,此时需要涉及到io模型, Bio nio aio
 tomcat7 可以配置的bio nio
 tomact8 默认的是nio
 

Insert picture description here

tomcat里面有个组件 Connector ,
connector 就是一个连接器 
 负责 接收数据以及解析数据,处理的协议格式为HTTP/1.1

Insert picture description here

Insert picture description here

也就是说如果此时 你在这里配置的 是 HTTP/1.1 这个的话
我就用 org.apache.coyote.http11.Http11Protocol[协议处理器]
 这个协议处理器来处理你的请求,自然讲此时可以自定义协议处理器
也就是说
 我现在要解析数据  呢么你到底是那个类 负责来解析数据   

我们吧这个类点进去 看看他的构造方法 此时就涉及到io模型了

Insert picture description here

这个endPoint就和io模型有关 这里的jioEndPoint 就是我们常说的bio
也就是说tomcat此时提供不同的io模型来取处理数据


Insert picture description here

也就是说tomcat现在使用 bio的io模型来接受socket的数据,
呢么接下来要做的就是依据http协议来解析数据 对吧 他是如何解析的  

Insert picture description here

他里面有一个内部类

Insert picture description here

Insert picture description here

我们现在这种Bio的这种方式
tomcat每接受一个socket 他会怎么做呢

Insert picture description here

如果io模型是bio模型 ,呢么每一个socket连接对应一个线程
然后将这个线程放入线程池中来管理这个线程
 也就是说这个线程中的run方法是执行 解析数据的流程
 

Insert picture description here

 他解析的第一步就是此时的请求是一个https请求 ,就需要握手
 第二步就是处理

Insert picture description here

 然后点进来  就可以看到如何处理的请求   Http协议   请求行 请求报头 请求体 空白行
 今天只是大致说下请求的流程

Guess you like

Origin blog.csdn.net/weixin_43689953/article/details/109588786