Tomcat基于Coyote的HTTP 1.1协议连接器

从一次线上故障复盘:聊聊Tomcat的HTTP协议解析与那些‘非法字符‘的坑(附Wireshark实战分析) 本文深度剖析Tomcat处理HTTP协议时遇到的'Invalid character found in method name'故障,结合RFC标准和Wireshark实战分析,揭示HTTP方法名的严格校验规则。通过对比主流Web容器的行为差异,提供客户端和服务端的防御性编程方案,帮助开发者避免类似协议解析问题。 阅读详情

1. 模块架构

org.apache.coyote.http11包支持http1.1协议,内部分为三类:ARP、NIO、普通http,这里只对最基本的普通http(使用java的IO流,而非NIO流)作简单研究。

这个包主要有以下几个类:

  1. Http11Protocol,实现了ProtocolHandler接口
  2. Http11Processor,实现了ActionHook接口
  3. InternalInputBuffer,实现了InputBuffer接口
  4. InternalOutputBuffer,实现了OutputBuffer接口
  5. InputFilter和OutputFilter接口,具体的实现类在 org.apache.coyote.http11.filters 中。

架构图如下所示(转自王程斯的博客):

HTTP 1.1 Connector Architecture 

       处理流程:

  1. JIOEndpoint起到一个连接池的作用,可以启动多个socket监听,一旦收到浏览器发来的请求后,把对应的socket对象通过process方法,传递给Http11ConnectionHandler,再交给Http11Processor
  2. Http11Processor内部有个InternalInputBuffer(图上未画出),InternalInputBuffer是真正对socket中包含的字节流进行处理的,它将字节转换为Request
  3. Request流经过滤器filters,最后到达实现了Adapter接口的容器,模块的工作就到此为止,回头继续处理下一个socket

2. 代码研究

  1. Http11Protocol

该类是http1.1协议的ProtocolHandler实现,主要包含了内部类Http11ConnectionHandler和Http11ConnectionHandler的实例对象,它的初始化代码和过程如下:

复制代码
public Http11Protocol() {
        endpoint = new JIoEndpoint(); //新建endpoint,启动若干socket server,监听服务器端口
        cHandler = new Http11ConnectionHandler(this); //协议连接处理对象,用于对socket连接的处理
        ((JIoEndpoint) endpoint).setHandler(cHandler); //一旦endpoint接收到请求,会将对应socket实例传给cHandler.process方法进行处理
        setSoLinger(Constants.DEFAULT_CONNECTION_LINGER);
        setSoTimeout(Constants.DEFAULT_CONNECTION_TIMEOUT);
        setTcpNoDelay(Constants.DEFAULT_TCP_NO_DELAY);
    }
复制代码

Http11ConnectionHandler内部类则继承了AbstractConnectionHandler,它主要实现了createProcessor方法,用于将Http11Processor应用于连接处理流程中。函数内新建了一个Http11Processor实例,并将该实例绑定到ConnectionHandler上。ConnectionHandler一旦接收到从endpoint发来的处理请求,使用对应的Processor对接收到的数据进行处理,形成Request对象。

  2. Http11Processor

这个类的作用就是生成Request(当然本质上还是InternalInputBuffer完成的),交给实现了Adapter接口的容器。它有adapter、request、response、inputbuffer、outputbuffer等几个关键字段,还有很多和http 1.1协议有关的字段和方法,用于协议的解析(这里就不对解析过程进行分析了)。

这个类对socket对象依次做如下的处理:

1)        把socket的inputstream和outputstream分别与inputbuffer和outputbuffer关联起来

2)        通过inputBuffer.parseRequestLine() 和 inputBuffer.parseHeaders() 方法,解析socket字节流中的头字段,写到request中

3)        通过prepareRequest方法组装filter,用于处理http消息体

4)        adapter.service(request, response) 把生成的request和response交给容器处理

5)        如果一切顺利,开始处理socket中的下一个请求(因为http1.1是支持持续连接的,所以一个socket中可能包含多个请求),循环回到第一步

6)        如果出错,则设置response的响应码,并终止循环

其中的prepareRequest方法,是用于准备inputbuffer的filter,主要包括一下几个过程:

1)        根据之前对http头字段的解析,分别检查protocol、method、expect、user-agent和MIMEheaders,此外还检查URI的格式

2)        准备加载filter

3)        如果有transfer-encoding这个头字段,则分别设置不同编码的filter

4)        校验content-length头字段

  3. InternalInputBuffer

这个类的主要功能是:从socket中获取字节流,将字节读入一个缓冲区buf,然后从缓冲区逐个解析http请求头以及内容。

主要的字段有:

  request:Request对象,从缓冲区中解析出的信息会写入request中

  buf:缓冲区,从socket的inputstream读取的字节放入此缓冲区中

  headers : MimeHeaders,保存以键值对出现的报头,也就是除去请求报文第一行之后的所有头部

主要的方法有:

  parseRequestLine()

  解析请求报头的第一行,形如:GET http://class/download.microtool.de:80/somedata.exe,包括请求方法(GET or POST)、协议(http)、URI。解析后,放入request中

  parseHeader()

  解析刚才parseRequestLine()之后的报头,由于RequestLine之后的报头都是以“:”分隔的键值对,因此每执行一次本方法,则在headers 中加入一个键值对,如果格式错误则返回false

  endRequest()

  结束一个request的处理,把多余的字节清空

  nextRequest()

  准备下一个request的处理,这个方法主要用来对所有的标记位和指针进行复位

  fill()

  从socket的inputstream中读出一定数量的字节,填充buf,在很多方法中都有用到。例如解析报头时,当发现buf已经读取完了,就调用fill重新填充buf,如果inputstream已经读完了,fill返回false。

  4. InternalOutputBuffer

  这个类是用来从response中读取信息,然后写入socket的outputstream中,返回给客户端的。里面的很多方法和InternalInputBuffer基本相似,有两个是专门用于处理Response的:nextRequest()和endRequest()。这两个函数的功能主要是在当前Request处理完并发出Response之后,跳转到下一个Request的处理或者结束处理。

3. org.apache.coyote.http11.upgrade

Apache在基于coyote的HTTP 1.1连接器实现模块中还实现了能够供基于HTTP 1.1的一些协议和在HTTP 1.1基础上进行操作的接口和实现,方便进行扩展。它主要有以下几个类:

  1. UpgradeInbound接口

接口定义了基于socket数据流处理需要实现的一些接口,主要功能是当连接器从socket中读取出数据后,会通知UpgradeInbound实现类进行数据解析,即onData函数。  

  2. UpgradeProcessor类

这个类是基于HTTP 1.1连接器的upgrade连接器Processor的模板类,定义了一个标准的UpgradeProcessor必须要重写的读写处理函数:

复制代码
// Output methods
    public abstract void flush() throws IOException;
    public abstract void write(int b) throws IOException;
public abstract void write(byte[] b, int off, int len) throws IOException;
// Input methods
    public abstract int read() throws IOException; 
    public abstract int read(boolean block, byte[] bytes, int off, int len)
            throws IOException;
复制代码

  3. UpgradeOutbound类

该类继承了OutputStream类,重写了write函数。这个类是一个功能封装类,在类初始化的时候传入用于解析数据的UpgradeProcessor,而在重写的write函数中则直接调用Processor的处理函数,使得数据能够被写到Upgraded的数据流中。

DeepSeek Tomcat连接器与协议处理 100道面试题及详细答案 答案: Tomcat连接器(Connector)是Tomcat服务器的网络通信组件,主要功能包括:答案: 在Tomcat的整体架构中: 连接器是Tomcat的"网络门户",负责与外界的通信,而容器(包括Engine、Host、Context、Wrapper)负责处理业务逻辑。连接器通过Coyote框架与容器通信。答案: Coyote是Tomcat的连接器框架,它是:答案: 通过:答案: ProtocolHandler是Tomcat连接器的核心接口,主要职责:答案:答案: 方法1:查看启动日志 方法2:查看s 阅读详情

相关推荐

Tomcat架构深度解析:从连接器到容器的请求处理全链路

本文深度解析了Tomcat的核心架构,详细阐述了从连接器(Coyote)接收网络请求,到容器(Catalina)内Engine、Host、Context、Wrapper四层模型的路由与处理全链路。通过剖析协议处理、组件协作及请求流转过程,帮助开发者深入理解Tomcat工作原理,并为性能调优与问题排查提供实战洞察。

weixin_29281915的博客 238

Tomcat架构解析之Coyote

一、什么是Coyote?     Coyote是Tomcat链接器框架的名称,是Tomcat服务器提供的供客户端访问的外部接口。客户端通过Coyote与服务器建立链接、发送请求并且接收响应。     Coyote封装了底层的网络通信(Socket请求以及响应处理),为Catalina容器提供了统一的接口,是Catali...

weixin_42146366的博客 5395

5分钟看懂LTE注网全流程:从PLMN选择到小区驻留的log分析技巧

本文深入解析了LTE终端从开机到成功驻留小区的完整流程,重点分享了基于QXDM和QCAT工具的log分析实战技巧。文章详细拆解了PLMN选择、System/Band扫频、小区搜索与同步、系统消息解析及驻留等关键步骤,并提供了高频问题场景的排查思路,帮助网络优化工程师快速定位终端侧、射频环境或网络配置问题。

app77的博客 432

[Tomcat] 基于Coyote的HTTP 1.1协议连接器

1. 模块架构 org.apache.coyote.http11包支持http1.1协议,内部分为三类:ARP、NIO、普通http,这里只对最基本的普通http(使用java的IO流,而非NIO流)作简单研究。 这个包主要有以下几个类: Http11Protocol,实现了ProtocolHandler接口 Http11Processor,实现了ActionHook接口 Inter...

weixin_30764771的博客 275

sid图像数据_遥感影像数据

影像数据基本概念影像数据是由卫星或飞机上的成像系统获得的影像,多为遥感影像数据。影像数据的每个像元都有一个值,表示传感器探测到像素对应地面面积上目标物的电磁辐射强度,也叫亮度值、灰度值。SuperMap支持的影像数据格式有:*.img、*.tif、*.tiff、*.bmp、*.jpg、*.png、*.gif、*.raw、*.sid等。计算机以二进制记录数据,所以其量化的等级以二进制来划分,即2n。...

weixin_39534395的博客 1627

西门子与汇川伺服脉冲连接(速度模式)

如何使用西门子PLC与汇川伺服进行脉冲连接

2301_77347966的博客 1万+

Tomcat报错:org.apache.coyote.http11.Http11Processor.service 解析 HTTP 请求 header 错误

这个错误我仔细的观察了下,是浏览器的坑,先看下报错 [http-nio-8080-exec-6] org.apache.coyote.http11.Http11Processor.service 解析 HTTP 请求 header 错误注意:HTTP请求解析错误的进一步发生将记录在DEBUG级别。 java.lang.IllegalArgumentException: 在方法名称中发现无效的字符串, HTTP 方法名必须是有效的符号. at org.apache.coyote.http11.Http1

学不死就往死里学 3万+

AS5600磁编码器IIC通信与角度读取实战指南

本文提供了AS5600磁编码器通过IIC通信协议实现高精度角度读取的完整实战指南。详细解析了硬件连接要点、IIC通信时序、Arduino与STM32平台驱动代码,并分享了多圈测量、噪声滤波等进阶应用与避坑技巧,帮助开发者快速将这款非接触式角度传感器集成到电机控制、旋钮等项目中。

weixin_29172201的博客 243

org.apache.coyote.http11.Http11Processor.service 解析 HTTP 请求 header 错误注意:HTTP请求解析错误的进一步发生将记录在DEBUG级别。

运行tomcat时,本以为成功了 结果,突然出现这两个错误 信息: 解析 HTTP 请求 header 错误注意:HTTP请求解析错误的进一步发生将记录在DEBUG级别。 java.lang.IllegalArgumentException: 在方法名称中发现无效的字符串, HTTP 方法名必须是有效的符号. atorg.apache.coyote.http11.InternalAprInputBuffer.parseRequestLine(InternalAprInputBuffer.jav.

weixin_44479107的博客 2万+

微信服务号配置总是提示“参数错误”?我就是这样一步步查出问题的

前两天,我遇到了一个很诡异的问题:在微信服务号后台配置服务器地址时,总是提示“参数错误,请重新填写”。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1277

Android 14.0 系统开机屏幕设置默认横屏显示

在14.0的系统ROM产品定制化开发中,对于产品需求来说,由于是宽屏设备所以产品需要开机默认横屏显示,开机横屏显示这就需要从 两部分来实现,一部分是系统开机动画横屏显示,另一部分是系统屏幕显示横屏显示,从这两方面就可以做到开机默认横屏显示了

安卓兼职framework和app工程师的博客 2151

Tomcat 连接器组件 Coyote

Tomcat 连接器组件 Coyote Coyote 简介 Coyote 是Tomcat 中连接器的组件名称 , 是对外的接⼝。客户端通过Coyote与服务器建⽴连接、发送请求并接受响应 。 (1)Coyote 封装了底层的⽹络通信(Socket 请求及响应处理) (2)Coyote 使Catalina 容器(容器组件)与具体的请求协议及IO操作⽅式完全解耦 (3)Coyote 将Socket 输⼊转换封装为 Request 对象,进⼀步封装后交由Catalina 容器进⾏处理,处理请求完成后, Catal

qq_40977467的博客 533

【银河麒麟服务器操作系统】安装英伟达4090D显卡驱动操作指南

本文详细介绍了在银河麒麟高级服务器操作系统V10SP3-2403-X86版本上安装NVIDIA RTX4090D显卡驱动的完整流程。主要内容包括:准备工作检查、开源驱动禁用、运行级别切换、依赖包安装以及交互式安装过程中的关键选项选择(32位库选Yes、X配置选No)。通过禁用nouveau驱动、重建内核引导等步骤确保驱动安装成功,最后通过nvidia-smi命令验证驱动安装情况。文档提供了操作检查表和安装流程图,帮助用户在银河麒麟系统上顺利完成显卡驱动部署。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 3105

04 Tomcat 连接器 Coyote,工作原理,IO模型,协议,EndPoint 通信监听的接口,Processor协议处理接口,ProtocolHandler协议接口,Adapter对象转换

Coyote 工作原理 Coyote 的 IO模型与协议 Tomcat 支持的IO模型 Tomcat 支持的应用层协议 连接器Coyote 中的组件 EndPoint 通信监听的接口 Processor :Coyote 协议处理接口 ProtocolHandler : Coyote 协议接口 Adapter 负责Request、ServletRequest对象的转换...

思念十年后 859

AgentScope Java 2.0 最佳实践:9 个完整示例手把手带你开发 Java‑Agent

本文基于9 个完整示例,深入剖析从基础对话(BasicChatExample)、工具调用(@Tool 注解)、结构化输出(POJO Schema)、ToolGroup 自主管理、MCP 外部工具集成、Hook 生命周期监控、Spring Boot SSE 流式 Web、JsonSession 会话持久化到中断恢复的全链路实战教程。

program哲学 1648

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

学习Tomcat(三)之容器连接器

Tomcat最底层使用的是Java标准的SocketServer和Socket接受和处理请求,但是Socket接受到的数据是网络运输层的TCP或UDP协议的数据,需要转为Http或者其它应用层协议的数据。Tomcat中就是通过连接器Connector来管理Socket连接、解析Scoket请求为Request并封装响应数据为Response对象。新版本的Tomcat容器使用的连接器是Coyote框架,本文会详细介绍Connector的Coyote框架原理。本文很多内容参考了这篇博客 什么是Coyote Co

小明的博客 368

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Tomcat之容器连接器3

Tomcat最底层使用的是Java标准的SocketServer和Socket接受和处理请求,但是Socket接受到的数据是网络运输层的TCP或UDP协议的数据,需要转为Http或者其它应用层协议的数据。Tomcat中就是通过连接器Connector来管理Socket连接、解析Scoket请求为Request并封装响应数据为Response对象。新版本的Tomcat容器使用的连接器是Coyote框架,本文会详细介绍Connector的Coyote框架原理。 什么是Coyote Coyote是Tomcat链接

V539413949的博客 976

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Tomcat 源码分析 (连接器) (六)

Tomcat 源码分析 (连接器) (六)

959 772

Tomcat中的连接器——coyote

一. 架构介绍 coyote即Tomcat连接器的名称,客户端通过coyote与服务器建立连接、发送请求并接受需要;coyote只负责具体的协议和IO操作,与Servlet规范并无关系。 二. IO模型与协议 IO模型(自Tomcat8.5起,移除了BIO) O模型 描述 NIO 非阻塞I/O,采用Java NIO类库实现 NIO2 异步I/O,采用JDK7最新的NIO2...

qq_44837912的博客 493

Tomcat 架构分析及配置详解

Coyote是Tomcat中连接器组件的名称,是对外的接口。客户端通过Coyote与服务器建立连接,发送请求并接收响应。Coyote封装了底层的网络通信(Socket请求及响应)Coyote使容器组件与具体的请求协议及IO操作完全解耦Coyote 将Socket输入转换封装为Request对象,进一步封装后交由Servlet的容器处理,请求处理完成后,容器通过Coyote提供的Response对象将结果写入输出流Coyote负责的是具体协议(应用层)和IO(传输层)相关内容。

2401_83384536的博客 1119

Tomcat连接器:Coyote框架

不论Tomcat的容器设计得如何精妙,本质上Tomcat就是个http服务器,需要从socket中获得HTTP数据流;另一方面,容器只能处理封装好的org.apache.coyote.Request (这个类的具体用途下面会讲到),从socket到Request之间需要有个转换过程。因此,连接socket和容器之间的重任就交给了CoyoteCoyote简介coyote(北美的一种狼、山狗)

王程斯的专栏 2万+

Tomcat--Coyote连接器

Coyote连接器 Coyote是Tomcat连接器框架的名称,是Tomcat服务器提供的供客户端访问的外部接口。客户端通过Coyote与服务器建立连接、发送请求并接受响应。 Coyote封装了底层的网络通信(Socket请求及响应处理),为Catalina容器提供了同一的接口,使Catalina容器与具体的请求协议及IO操作方式完全解耦。Coyote将Socket输入转换封装为Request对象...

吴声子夜歌的博客 973

认识 Tomcat 连接器组件 Coyote

Coyote Coyote 是Tomcat 中连接器的组件名称 , 是对外的接⼝。客户端通过Coyote与服务器建⽴连接、发送请 求并接受响应 。 (1)Coyote 封装了底层的⽹络通信(Socket 请求及响应处理) (2)Coyote 使Catalina 容器(容器组件)与具体的请求协议及IO操作⽅式完全解耦 (3)Coyote 将Socket 输⼊转换封装为 Request 对象,进⼀步封装后交由Catalina 容器进⾏处理,处 理请求完成后, Catalina 通过Coyote 提供的Respo

qq_36194388的博客 933

Tomcat 连接器组件-Coyote简介

简介 Coyote 是Tomcat 中连接器的组件名称 , 是对外的接⼝。客户端通过Coyote与服务器建⽴连接、发送请 求并接受响应 。 Coyote 封装了底层的⽹络通信(Socket 请求及响应处理) Coyote 使Catalina 容器(容器组件)与具体的请求协议及IO操作⽅式完全解耦 Coyote 将Socket 输⼊转换封装为 Request 对象,进⼀步封装后交由Catalina 容器进⾏处理,处 理请求完成后, Catalina 通过Coyote 提供的Response 对象将结果写⼊输

小城我家 2017

Tomcat学习积累笔记---Tomcat的连接器组件---Coyote

Tomcat学习积累笔记—Tomcat的连接器组件—Coyote 1.Coyote简介 Coyote 是Tomcat 中连接器的组件名称 , 是对外的接⼝。客户端通过Coyote与服务器建⽴连接、发送请求并接受响应 。 Coyote 封装了底层的⽹络通信(Socket 请求及响应处理) Coyote 使Catalina 容器(容器组件)与具体的请求协议(http请求,应用层)及IO操作⽅式(有一些IO模型:BIO,NIO等,传输层)完全解耦 Coyote 将Socket 输⼊转换封装为 Request 对

qq_39314972的博客 687
上一篇: Kilim框架的Actor并发模型
下一篇: 协程与例程
kobejayandy
博客等级 码龄18年 2853粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值