浅谈tomcat原理(涉及网卡、套接字等)
什么是tomcat
想要了解tomcat 原理我们首先要了解tomcat是什么,有什么功能,在什么地方起作用?
一、网卡
首先我们知道如果一台计算机如果想要其他计算机交换数据的话,必须要走网卡的端口交换数据。网卡能够把把物理电信号转化成计算机能够识别的数字信号。
网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件。由于其拥有MAC地址,因此属于OSI模型的第2层。它使得用户可以通过电缆或无线相互连接。每一个网卡都有一个被称为MAC地址的独一无二的48位串行号,它被写在卡上的一块ROM中。在网络上的每一个计算机都必须拥有一个独一无二的MAC地址。没有任何两块被生产出来的网卡拥有同样的地址。这是因为电气电子工程师协会(IEEE)负责为网络接口控制器(网卡)销售商分配唯一的MAC地址。
网卡的三个功能
1、数据的封装与解封
发送时将上一层传递来的数据加上首部和尾部,成为以太网的帧。接收时将以太网的帧剥去首部和尾部,然后送交上一层
2、链路管理
主要是通过CSMA/CD(Carrier Sense Multiple Access with Collision Detection ,带冲突检测的载波监听多路访问)协议来实现
即曼彻斯特编码与译码。其中曼彻斯特码,又称数字双向码、分相码或相位编码(PE),是一种常用的的二元码线路编码方式之一,被物理层使用来编码一个同步位流的时钟和数据。在通信技术中,用来表示所要发送比特 流中的数据与定时信号所结合起来的代码。 常用在以太网通信,列车总线控制,工业总线等领域。
关于网卡端口需要注意的:
计算机如果想跟其他设备进行交互,必须通过端口。一台计算机最多能开2的16次方个端口(约六万多个);别看只有六万多个,但并不会出现不够使用的情况,因为端口如果开的开的多了,内存会首先撑不住,虽然在逻辑上有2的16次方个端口,但在物理上都是在一个地方。
任何两个独立的程序(一个进程)不能使用同一个端口,端口会被进程占用,线程之间也只能占用一个端口但是可以共享数据,进程之间不行。
二、什么是tomcat
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。
tomcat最初是由Sun的软件架构师詹姆斯·邓肯·戴维森开发的。是用java语言写的,后来他帮助将其变为开源项目,并由Sun贡献给Apache软件基金会。
tomcat功能就是是请求分发,对请求进行分配,协调各个网站之间的请求。
socket套接字:
监听端口,读取数据,发送数据,是和网卡直接交互的。监听,轮询:每隔一段时间看一次,如果有数据,就取走;是通过while循环实现的;socket是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。socket会自动包装网络协议数据(头尾标记),也会自动去掉识别协议的数据,提取主要数据。
先谈一点个人理解,这样大家看下面的流程就会变的So rasy!
tomcat启动时会扫描所有.class文件,遍历是会拿到所以java文件的所有文件名和路径,带有WebServlet标记的会背挑出来,注解跟路径会使用HASh map存储。
当tomcat拿到一个请求时,会先通过socket套接字,去掉协议数据,提取主要数据,因为是请求都是字符串数据,每个字符串之间会通过换行符隔开,进行字符串处理后会把数据中的请求的URL地址提取出来。
tomcat根据数据中的请求的URL地址,利用java反射确定请求那个servlet,类信息跳出来带有WebServlet的信息然后存在map结构里( 例如: map.put(“TestDomeServlet”,com.bdrjxy.TestDomeServlet ) )
tomcat
main{
socket.. //提取主要数据
拿到了网络数据:字符串str,请求之间都是字符串,利用换行符隔开
HttpServletRequest request= 字符串处理函数(str);//字符串处理
HttpServletResponse response = ...
DemoServlet ob =new DemoServlet();
ob.doGet(request,response );//处理get中的请求
String url1=request.getHeader("Request URL"); // 把请求中的URL提取出来
map.put(“TestDomeServlet”,com.bdrjxy.TestDomeServlet )//把遍历得到的类信息放到map结构中
map.put(“DomeServlet”,com.bdrjxy.DomeServlet )
map.get(url1);//得到路径
"com.bdrjxy.TestDomeServlet " ---> class---->newinstance //利用反射对class的类型 实例化
ss.invoke();//涉及代理
}
注意:当需要使用自己写的框架时,必须将框架先在tomcat注册才能在tomcat启动时,同时要开始启动时遍历自己所写方法,才能获取自己所写的注解信息
tomcat的执行流程:
一个比较详细的tomcat的容器组件分析和执行流程,有兴趣可以看下https://www.cnblogs.com/651434092qq/p/11063158.html
1.用户在浏览器中输入请求地址;
2.客户端通过浏览器将请求地址发送给WEB容器;
3.WEB容器根据请求地址找到*.jsp文件;
4.将*.jsp文件转换成*.java文件;
5.将*.java文件经过编译成*.class文件;
6.服务器执行*.class文件并将结果反馈给浏览器。
当请求发生时的流程图及过程:
1、用户点击网页内容,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得。
2、Connector(连接器)把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。
3、Engine(发动)获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host。
4、Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该 Engine的默认主机),
名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有的Context。
Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“ ”的Context去处理)。
5、path=“/test”的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL PATTERN为*.jsp的Servlet,对应于JspServlet类。
6、构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost().执行业务逻辑、数据存储等程序。
7、Context把执行完之后的HttpServletResponse对象返回给Host。
8、Host把HttpServletResponse对象返回给Engine。
9、Engine把HttpServletResponse对象返回Connector。
10、Connector把HttpServletResponse对象返回给客户Browser。