深入拆解 Tomcat & Jetty
李号双
eBay 技术主管
38890 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
开篇词 (1讲)
深入拆解 Tomcat & Jetty
15
15
1.0x
00:00/00:00
登录|注册

02 | HTTP协议必知必会

报文主体
响应报头
状态行
请求正文
请求报头
请求行
提供多种持久化方案
服务器端创建
通过Session ID与请求对应
服务器端存储用户状态
每次请求中包含Cookie
存储用户标识信息
使用Connection:keep-alive
HTTP/1.1引入长连接概念
发送响应
处理请求
解析请求数据
接受连接
HTTP响应数据包组成
HTTP请求数据包组成
浏览器解包并展示数据
响应数据包经过网络传输到达浏览器
服务端处理请求并发送响应
服务端解包获取客户端意图
数据包经过网络传输
请求数据打包成HTTP协议格式
TCP三次握手建立连接
TCP连接请求
用户操作
规定客户端和服务器之间的通信格式
基于TCP/IP协议传递数据
浏览器与服务器之间的数据传送协议
HTTP的无状态特点与长连接的矛盾
Session创建与存储
Session技术
Cookie技术
HTTP长连接
Tomcat和Jetty作为HTTP服务器的工作
请求响应实例
工作原理
本质
思考题
Cookie和Session
HTTP协议

该思维导图由 AI 生成,仅供参考

在开始学习 Web 容器之前,我想先问你一个问题:HTTP 和 HTML 有什么区别?
为什么我会问这个问题?你可以把它当作一个入门测试,检测一下自己的对 HTTP 协议的理解。因为 Tomcat 和 Jetty 本身就是一个“HTTP 服务器 + Servlet 容器”,如果你想深入理解 Tomcat 和 Jetty 的工作原理,我认为理解 HTTP 协议的工作原理是学习的基础。
如果你对这个问题还稍有迟疑,那么请跟我一起来回顾一下 HTTP 协议吧。

HTTP 的本质

HTTP 协议是浏览器与服务器之间的数据传送协议。作为应用层协议,HTTP 是基于 TCP/IP 协议来传递数据的(HTML 文件、图片、查询结果等),HTTP 协议不涉及数据包(Packet)传输,主要规定了客户端和服务器之间的通信格式。
下面我通过一个例子来告诉你 HTTP 的本质是什么。
假如浏览器需要从远程 HTTP 服务器获取一个 HTML 文本,在这个过程中,浏览器实际上要做两件事情。
与服务器建立 Socket 连接。
生成请求数据并通过 Socket 发送出去。
第一步比较容易理解,浏览器从地址栏获取用户输入的网址和端口,去连接远端的服务器,这样就能通信了。
我们重点来看第二步,这个请求数据到底长什么样呢?都请求些什么内容呢?或者换句话说,浏览器需要告诉服务端什么信息呢?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

HTTP协议是Web开发中不可或缺的一部分,承担着浏览器与服务器之间的数据传输任务。本文深入探讨了HTTP的本质、工作原理、请求响应实例、Cookie和Session技术以及Tomcat的Session管理。通过对HTTP协议的解析,读者能够了解到HTTP是一种通信格式,而HTML才是通信的目的。此外,文章还介绍了Cookie和Session技术,以解决HTTP协议无状态的问题,保持用户状态。Tomcat作为Web容器,负责创建和管理Session,并提供了多种持久化方案来存储Session,以提升高可用性。在HTTP/1.1中,引入了HTTP长连接的概念,使用长连接的HTTP协议可以提高通信效率。尽管HTTP具有无状态的特点,但通过Cookie和Session技术以及HTTP长连接,可以实现多个请求之间的关联,从而解决了这一矛盾。本文为读者提供了对HTTP协议基本原理和相关技术的快速了解,为进一步学习Web容器打下基础。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解 Tomcat & Jetty 》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(89)

  • 最新
  • 精选
  • 吃饭饭
    置顶
    我一直不太理解什么是无状态,restful经常听说是无状态的,是一个概念吗?求解答

    作者回复: 我的理解是REST是一种架构风格:将网络上的信息实体看作是资源,可以是图片、文件、一个服务...资源用URI统一标识,URI中没有动词哦,这是因为它是资源的标识,那怎么操作这些资源呢,于是定义一些动作:GET、POST、PUT和DELETE。通过URI+动作来操作一个资源。所谓的无状态说的是,为了完成一个操作,请求里包含了所有信息,你可以理解为服务端不需要保存请求的状态,也就是不需要保存session,没有session的好处是带来了服务端良好的可伸缩性,方便failover,请求被LB转到不同的server实例上没有差别。从这个角度看,正是有了REST架构风格的指导,才有了HTTP的无状态特性,顺便提一下,REST和HTTP1.1出自同一人之手。但是理想是丰满的,现实是骨感的,为了方便开发,大多数复杂的Web应用不得不在服务端保存Session。为了尽量减少Session带来的弊端,往往将Session集中存储到Redis上,而不是直接存储在server实例上..

    2019-05-13
    7
    90
  • 阿斯蒂芬
    Http的无状态我理解是指不同请求间协议内容无相关性,即本次请求与上次请求没有内容的依赖关系,本次响应也只针对本次请求的数据,至于服务器应用程序为用户保存的状态是属于应用层,与协议是无关的。 keep-alive表示tcp的连接可以复用,指的是利用已有的传输通道进行http协议内容的传输,省去创建/关闭连接的开销达到提升性能的效果。应用程序其实一般不关心这次Http请求的TCP传输细节,只关心Http协议的内容,因此只要复用tcp连接时做好必要的数据重置,是不算有状态的。

    作者回复: 说的很清楚 👍

    2019-05-13
    5
    179
  • 而立斋
    无状态的协议,使用cookie、session等机制实现有状态的的web。 无状态是指协议对于事务处理没有记忆功能,对同一个url请求没有上下文关系,每次的请求都是独立的,服务器中没有保存客户端的状态。HTTP协议长连接、短连接实质上是TCP协议的长连接、短连接。长连接省去了较多的TCP建立、关闭操作,减少了浪费,节约时间;短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。具体的应用场景采用具体的策略,没有十全十美的选择,只有合适的选择。 那为什么HTTP协议会被设计成无状态的呢?http最初设计成无状态的是因为只是用来浏览静态文件的,无状态协议已经足够,也没什么其他的负担。随着web的发展,它需要变得有状态,但是不是就要修改http协议使之有状态呢?是不需要的。因为我们经常长时间逗留在某一个网页,然后才进入到另一个网页,如果在这两个页面之间维持状态,代价是很高的。其次,历史让http无状态,但是现在对http提出了新的要求,按照软件领域的通常做法是,保留历史经验,在http协议上再加上一层实现我们的目的。所以引入了cookie、session等机制来实现这种有状态的连接。

    作者回复: 说的很好很详细👍

    2019-05-14
    3
    73
  • yang
    http1.0: 买一个信封只能传送一个来回的信。 http1.1: keep–alive:买一个信封可以重复使用,但前提是得等到服务端把这个信封送回来。

    作者回复: 优秀👍

    2019-05-13
    3
    67
  • 刘为红
    sessionid是服务端生成的,服务端通过set-cookie放在http的响应头里,然后浏览器写到cookie里,后续每次请求就会自动带上来了,这点感觉讲得不是很清楚

    作者回复: 谢谢指出~

    2019-05-14
    5
    62
  • 逍遥哥哥
    老师,您好,现在的web容器都支持将session存储在第三方中间件(如redis)中,为什么很多公司喜欢绕过容器,直接在应用中将会话数据存入中间件中?

    作者回复: 用Web容器的Session方案需要侵入特定的Web容器,用Spring Session可能比较简单,不需要跟特定的Servlet容器打交道。 这正是Spring喜欢做的事情,它使得程序员甚至感觉不到Servlet容器的存在,可以专心开发Web应用。但是Spring到底做了什么,Spring Session是如何实现的,我们还是有必要了解了解~ 其实它是通过Servlet规范中的Filter机制拦截了所有Servlet请求,偷梁换柱,将标准的Servlet请求对象包装了一下,换成它自己的Request包装类对象,这样当程序员通过包装后的Request对象的getSession方法拿Session时,是通过Spring拿Session,没Web容器什么事了。

    2019-05-14
    4
    39
  • 微信小助手
    HTTP的无状态性与共用TCP连接发送多个请求之间没有冲突, 这些请求之间相对独立,唯一的关系可能只有发送的先后顺序关系。 此外,HTTP/1.1中的长连接依然没有解决 head of line blocking 的问题, 后面的连接必须等待前面的返回了才能够发送, 这个问题直到HTTP/2.0采取二进制分帧编码方式才彻底解决。

    作者回复: 👍Tomcat和Jetty都支持HTTP2.0了

    2019-05-13
    3
    38
  • Geek_28b75e
    老师,我们经常说的cookie跨域问题中,跨域是什么概念呢

    作者回复: cookie有两个重要属性: domain字段 :表示浏览器访问这个域名时才带上这个cookie path字段:表示访问的URL是这个path或者子路径时才带上这个cookie 跨域说的是,我们访问两个不同的域名或路径时,希望带上同一个cookie,跨域的具体实现方式有很多..

    2019-05-24
    2
    32
  • Royal
    您好!上面提到的引入session是因为cookie存在客户端,有安全隐患;但是session id也是通过cookie由客户端发送到服务端,同样有安全隐患啊?

    作者回复: 是的,虽然敏感的用户信息没有在网络上传输了,但是攻击者拿到sessionid也可以冒充受害者发送请求,这就是为什么我们需要https,加密后攻击者就拿不到sessionid了,另外CSRF也是一种防止session劫持的方式。

    2019-05-13
    2
    18
  • 有所思
    用token机制呢

    作者回复: token比如jwt token本质是个加密的cookie

    2019-08-08
    2
    16
收起评论
显示
设置
留言
89
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部