02 | HTTP协议必知必会

HTTP 和 HTML 有什么区别?

为什么会问这个问题?你可以把它当作一个入门测试,检测一下自己的对HTTP协议的理解.因为Tomcat和Jetty本身就是一个"HTTP服务器 + Servlet容器",如果你想深入理解Tomcat和Jetty的工作原理,我认为理解Http协议的工作原理是学习的基础.

HTTP的本质

HTTP协议是浏览器与服务器之间的数据传送协议。作为应用层协议,HTTP 是基于TCP/IP协议来传递数据的(HTML文件,图片,查询结果等),HTTP协议不涉及数据包(Packet)传输,主要规定了客户端和服务器之间的通信格式.

下面我通过一个例子来告诉你HTTP的本质是什么.

假如浏览器需要从远程HTTP服务器获取一个HTML文本,再这个过程中,浏览器实际要做两件事情.

与服务器建立Socket连接.

生成请求数据并通过Socket发送出去.

第一步比较容易理解,浏览去从地址栏获取用户输入的网址和端口,去连接远端的服务器,这样就能通信了.

我们重点来看第二步,这个请求数据到底长什么样呢?都请求些什么内容呢?或者换句话说,浏览器需要告诉服务端什么信息呢?

首先最基本的是,你要让服务端知道你的意图,你是想获取内容还是提交内容;其次你需要告诉服务端你想要哪个内容,要么把这些信息以一种什么样的格式放到请求里去呢?这就是HTTP协议要解决的问题.也就是说,HTTP协议的本质就是一种浏览器与服务器之间约定好的通信格式,那浏览器与服务器之间具体是怎么工作的呢?

HTTP工作原理

从上图你可以看到,这个过程是:

1.用户通过浏览器进行了一个操作,比如输入网址并回车,或者点击链接,接着浏览器获取了这个事件.

2.浏览器先服务器发出TCP连接请求.

3.服务程序接受浏览器的连接请求,并经过TCP三次握手建立连接.

4.浏览器将请求数据打包成一个HTTP协议格式的数据包.

5,浏览器将该数据包推进网络,数据包经过网络传输,最终达到端服务程序.

6.服务端程序拿到这个数据包后,同样以HTTP协议格式解包,获取到客户端的意图.

7.得知客户端意图后进行处理,比如提供静态文件或者调用服务端程序获得动态结果.

8.服务器将响应结果(可能是 HTML 或者图片等)按照 HTTP协议格式打包.

9.服务器将响应数据包推入网络,数据包经过网络传输最终达到到浏览器.

10.浏览器拿到数据包后,以HTTP协议的格式解包,然后解析数据,夹着这里的数据是HTML.

11.浏览器将HTML文件展示在页面上.

那我们想要探究的Tomcat和Jetty作为一个HTTP服务器,在这个过程中都做了些什么事情呢?主要是接受连接,解析请求数据,处理请求和发送响应这几个步骤.这里请你注意,可能有成千上万的六篮球同时请求同一个HTTP服务器,因此Tomcat和Jetty为了提高服务的能力和并发度,往往会将自己要做的几个事情并行化,具体来说就是使用多线程的技术.

HTTP请求响应实例

你有没有注意到,在浏览器和HTTP服务器之间通信的过程中,首先要将数据打包成HTTP协议的格式,那HTTP协议的数据包具体长什么样呢?这里我以极客时间的登录请求为例,用户在登录页面输入用户名和密码,点击登录,浏览器发出了这样的HTTP请求:


你可以看到,HTTP请求数据由三部分组成,分别是请求行,请求报头,请求正文.当这个HTTP请求数据达到Tomcat后,Tomcat会把HTTP请求数据字节流解析成一个Request对象,这个Request对象封装了HTTP所有的请求信息,接着Tomcat会把这个Request对象交给Web应用去处理,处理完后得到一个Response对象,Tomcat会把这个Response对象转成HTTP格式的响应数据并发送给浏览器.

我们再来看看HTTP响应的格式,HTTP响应也是有三部分组成的,分别的状态行,响应报头,报文主体,同样,我还以极客时间登录请求的响应为例.


为了更好地帮助你理解HTTP服务器(比如Tomcat)地工作原理,接下来我想谈一谈Cookie跟Session地原理.

Cookie和Session

我们知道,HTTP协议有一个特点是无状态,请求与请求之间是没有关系的.这样会出现一个很尴尬的问题:Web应用不知道你是谁,比如你登录淘宝后,在购物车中添加了三件商品,刷新一下网页,这是系统提示你仍然处于为登录的状态,购物车也空了,很显然这种情况是不可接受的.因此HTTP协议需要一种技术让请求与请求之间建立起联系,并且服务器需要知道这个请求来自哪个用户,于是Cookie技术出现了.

1.Cookie技术

Cooike是HTTP报文的一个请求头,Web应用可以将用户的标识信息或者其他一些信息(用户名等)存储在Cookie中,用户经过验证之后,每次HTTP请求报文中都包含Cookie,这样服务器读取这个Cookie请求头就知道用户是谁了.Cookie本质上就是一份存储在用户本地的文件,里面包含了每次请求中都需要传递的信息.

2.Session技术

由于Cookie以明文的方式存储在本地,而Cookie中往往带有用户信息,.这样就造成了非常大的安全隐患.而Session的互相解决了这个问题.Session可以理解为服务器端开辟的存储空间,里面能保存了用户的状态,用户信息以Session的形式存储在服务端,当用户请求到来时,服务端可以把用户的轻轨和用户的Session对应起来.那么Session时怎么和请求对应起来的呢?答案是通过Cookie,浏览器在Cookie中填充了一个Session ID之类的字段用来标识请求.

具体工作过程是怎这样的:服务器在创建Session 的同时,会为该Session生成唯一的Session ID,当浏览器再次发起请求的时候,会见这个Session ID带上,服务器接受到请求之后就会依据Session ID找到对应的Session,找到Session后,就可以在Session中获取或者添加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session ID,这样相对安全,也节省了网络流量,因为不需要再Cookie中存储大量用户信息.

3.Session创建与存储

那么Session再何时何地创建呢?当然还是再服务器端程序运行的过过程中创建的.不同语言实现的应用程序有不同的创建Session的方法,再JAVA中,是Web应用程序在调用HttpServletRequest的getSession方法时,由Web容器(比如Tomcat)创建的.那HttpServletRequest又是什么呢?

Tomcat的Session管理器提供了多种持久化方案来存储Session,通常会采用高性能的存储方式,比如Redis,并且通过集群部署的方式,防止单点故障,从而提升高可用.同时,Session由过期时间,因此Tomcat会开启后台线程定期轮询,如果Session过期了就将Session失效.

本期精华

HTTP协议和其他应用层协议一样,本质上是一种通信格式.回到文章开头,HTTP是通信的方式,HTML才是通信的目的,就好比HTTP是信封,信封里面的信(HTML)才是内容;但是没有信封,信也没办法寄出去,HTTP协议就是浏览器与服务器之间的沟通语言,具体交互过程是请求,处理和响应.

由于HTTP是无状态的协议,为了识别请求时哪个用于发过来的,出现了Cookie和Session技术.Cookie本质上就是一份存储在用户本地的文件,里面包含了每次请求中都需要传递的信息;Session可以理解为服务器端开辟的存储空间,里面保存的信息用于保持状态.作为Web容器,Tomcat负责创建和管理Session,并提供了多种持久化方案来存储Session.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容