博主也是小白,所以随时欢迎大家在评论中指出错误、交流意见✌
版本 | 日期 | 修改内容 |
---|---|---|
1.0 | 2020-03-09 | 完成文章第一版 |
文章目录
1.前言
1.1.表情包说HTTP介绍
- 最近系统学习了HTTP相关的知识,于是想要把所学的东西,结合理论与实践(我学的真的不是马克思主义),记录在博客中。其中穿插了各种自己原创的表情包。希望既能够加深大家所学,又能放松大家的心情。
- 理论部分:首先概览HTTP的基本知识(也就是这篇文章的内容),随后着重介绍HTTP的报文首部,最后介绍一下HTTPS协议。
- 实践部分:通过JAVA代码,使用大名鼎鼎的apache的HTTPClient包进行代码练习,并使用抓包观察发送与接收的请求报文。
1.2.概览HTTP介绍
- 这篇文章主要对HTTP进行一个宏观的讲解,让各位看官老爷姑娘们对HTTP有个总体的了解。所以这篇文章不对深入地去讲解请求头中的字段。看完这篇文章之后,能够让大家在后续的详细学习中更得心应手,避免讲到一个点,都没有上下文环境做支撑。
1.3.学习HTTP的前置知识
- 学习HTTP之前,你得先了解TCP/IP协议簇。
- 什么叫了解呢?举个栗子,说一说TCP、UDP、IP、DNS协议是什么东西?能解决什么问题?他们大概的处理流程是怎么样的?
- 如果你都能顺口答上来,或者悄悄百度回顾一下,然后背着答上来。这种程度就算是了解了。
- 知道HTTP是用在什么地方的、作用是什么。对,没错,虽然是HTTP教程,但是俺不想告诉你HTTP是拿来干嘛的,那就太麻烦了(我可没说是因为我懒啊)。
- 知道HTTP的三个版本——1.0、1.1、2.0。目前最主流的还是HTTP/1.1。
- 知道什么是URL、什么是URI。
- 英语词汇量得有,毕竟HTTP不是天朝之物,里面的字段可都不是中文哦。能够认识那些字段都什么意思,有助于你更好地理解HTTP。
废话不在多说,下面进入正题:
2.HTTP的基本特点
2.1.请求和响应成双成对
- 一次HTTP请求发送给服务器,就必定会有一次HTTP响应返回给客户端
- HTTP是单方面发起的,意思是只有发送了HTTP请求,才会有HTTP响应。你不吭声,她就不说话,你吭声了,她可能还404(像极了生气时的女朋友)。
2.2.HTTP薄情寡义
- HTTP协议本身是无状态的。服务器和客户端都是如此,不会保存之前一切的请求和响应报文。所以客户端和服务器通信时,对话是这样的:
- 客户端:你刚刚说的啥?
- 服务器:啊?我刚刚说的啥?
- 旁白:像极了要分手的小情侣。薄情寡义!
- 听起来很傻,但是这样设计肯定是有道理的。好处就是快!俗话说,天下武功唯快不破,无状态能够让HTTP在相同时间内处理更多的数据。
- 这时候敦厚老实的客户端和服务器就不爽了,说自己想记录曾经的美好回忆。HTTP/1.1说:成,拿着这块记忆小饼干,你们就是HTTP中最靓的一对儿。于是服务器和客户端就拿着COOKIE来实现有状态通信了。
2.3.HTTP/1.1默认是持久的
看到这个标题,男人流下了眼泪
- 首先说明的是,HTTP协议在传输层使用的是TCP协议。目的很简单,为了让通信更加稳定。
- HTTP/1.0的时候,每进行一次HTTP请求和响应的传递,都会连接、释放一次TCP连接。爱TCP保护协会表示强烈谴责,毕竟通常要完成一件事情,请求和响应得来来回回很多次呀!你们这是让TCP比圣诞老人还忙活呢?
- 于是在HTTP/1.1,他,持久了!只要任意一端没有明确说要释放TCP连接,则不会释放。期间可以传递无数次请求和响应。
3.HTTP报文
- 报文是应用层的网络传输单元,位于应用层的HTTP协议也不例外。客户端发送至服务端的叫请求报文,服务端发送至客户端的叫响应报文。
3.1.HTTP报文结构
- HTTP报文由报文首部、一个空行、报文主体构成。如果只关注HTTP协议的话,其灵魂就在报文首部中了,可以说HTTP中实现的各种骚操作,都是通过首部中的字段进行控制的。
3.2.报文首部
- 因为报文首部是HTTP协议的核心,所以RFC对报文首部中的内容又进行了一下划分:
3.2.1.请求行
- 包括请求方法、URI和HTTP版本。
- 请求方法是什么呢?其实大家并不陌生,比如每一名前端都写吐了的GET(获取资源)和POST(传输主体)。关于方法的详细内容,等详解HTTP首部的时候再说吧。
3.2.2.状态行
- 包括状态码、原因短语和HTTP版本。
- 状态码表明了响应报文的各种状态。例如大家最熟悉的404(资源找不到啦),就是状态码的一种。状态码我们后面再详解。
3.2.3.首部字段
- 首部字段十分庞杂,就不在这一章里面讲了,第二章专门来讲一讲首部字段。这里就先介绍一下这几种字段的作用:
- 通用首部字段:请求和响应报文都可以使用的字段。例如Date,说明报文创建的日期。
- 请求首部字段:请求报文用来补充说明请求、描述客户端信息的字段。例如Authorization,Web的认证信息。
- 响应首部字段:响应报文用于补充说明响应的字段。例如Location,让客户端重定向到指定URI。
- 实体首部字段:用于描述实体内容特点的字段。例如大家见得比较多的Content-Type。
- 其他字段:还有一些RFC中没有定义的字段,就被放到了这里。例如大名鼎鼎的Cookie。
3.3.报文主体
- 报文主体的具体内容其实并不是HTTP的重点。因为报文主体实在是太多了,而且大家其实都比较熟悉。比如HTML、XML等,都可以作为报文主体的内容。所以就不详细地说明了。
- 如下代码就可以直接作为报文的主体:
<HTML>
<p>帅</p>
</HTML>