HTTP就是这么简单
为什么要学HTTP?
我们绝大多数的Web应用都是基于HTTP来进行开发的。我们对Web的操作都是通过HTTP协议来进行传输数据的。
简单来说,HTTP协议就是客户端和服务器交互的一种通迅的格式。
HTTP的诞生主要是为了能够让文档之间相互关联,形成超文本可以互相传阅
可以说,Http就是Web通信的基础,这是我们必学的。
HTTP基础概念
我们学计算机网络的时候就知道,我们把计算机网络分层了5层,一般我们现在用的都是TCP/IP这么一个分层结构。
虽然官方的是ISO 提出的7层结构,但是仅仅是理论基础,在实际上大多人都是使用TCP/IP的分层结构
首先,我们先得知道,为什么我们要在计算机网络中分层次???
因为如果两台计算机能够相互通信的话,实际实现起来是非常困难操作的...我们分层的目的就是为了将困难的问题简单化,并且如果我们分层了,我们在使用的时候就可以仅仅关注我们需要关注的层次,而不用理会其他层。
如果需要改动设计的时候,我们只需要把变动的层替换即可,并不用涉及到其他的层次。这与我们程序设计中的低耦合是一个概念。
而我们的HTTP协议是在最上层,也就是应用层。这是最贴近我们的程序员的层次。
网站通信粗略过程
我们知道HTTP是在应用层中的,显然,我们在Web通信的过程中,不仅仅是需要HTTP协议的,还会涉及到其他的协议的。
DNS:负责解析域名
- 我们访问一个网页的时候,往往是通过域名来访问的
www.zhongfucheng.site
,而计算机通信只认的是我们的主机地址(192.168.xxx.xxx),因此,当我们输入域名的时候,需要DNS把域名解析成主机来进行访问。
HTTP:产生请求报文数据
- 当我们对Web页面进行操作的时候,就会产生HTTP报文数据,请求对应的服务端进行响应。
TCP协议:分割HTTP数据,保证数据运输
- TCP协议采用了三次握手的方式来保证数据的准确运输,在运输的数据的时候,发送标识过去给服务器,服务器也返回标识给客户端,而客户端收到消息后再次返回标识给服务器。这样一来就保证了数据运输是可靠的。
IP协议:传输数据包,找到通信目的地地址。
- IP协议把我们的产生的数据包发送给对方,IP地址指明了节点被分配的地址,但IP地址可能会变换,我们可以使用ARP协议来将IP地址反射为MAC地址。MAC地址是不会更改的,是网卡所属的固定地址。
- 在找到通信目的地之前,我们是需要不断的中转的,这过程我们称作为:“路由中转”,我们并不知道路由中转了多少次的。因此是不能全面了解到互联网中的传输状况的。
接下来就离我们比较远了,属于硬件相关的了,也就是链路层和物理层。以后复习到计算机网络的时候再来补充吧!
我们网页上请求数据就是上边这么一个流程。
告知服务器请求的意图
我们如果开发过Web程序的话,我们知道常用的提交方式有POST和GET方法
我们也知道GET是用来获取数据的,POST是用来提交数据的。
其实HTTP协议中还支持着其他的方法,比如:Input、Delete、OPTIONS很多这样的方法。而由于常用,于是我们也可能仅仅知道GET和POST方法了。
HTTP提供方法的目的就是为了告知服务器该客户端想进行什么操作。当HTTP是OPTIONS方法的时候,服务器端就会返回它支持什么HTTP方法。
当然了,现在RESTful盛行,也就是充分利用了HTTP协议的这些方法。
HTTP是不保存状态的协议
HTTP是无状态的,也就是说,它是不对通信状态进行保存的。它并不知道之前通信的对方是谁。这样设计的目的就是为了让HTTP简单化,能够快速处理大量的事务!
但是,我们经常是需要知道访问的人是谁,于是就有了Cookie技术了。
- 要是服务器端想要记住客户端是谁,那么就颁发一个cookie给客户端
- 客户端把Cookie保存在硬盘中,当下次访问服务器的时候,浏览器会自动把客户端的cookie带过去。
- 就这样,服务器就能够知道这家伙是谁了。
持久连接
在HTTP1.0的时候,每一次进行HTTP通信就会断开一次连接。如果容量很少的文本传输是没有问题的。但是如果我们访问一个网页,该网页有非常多的图片。一个图片就算上一个HTTP请求了。那么在中途中就不断地建立TCP连接、获取图片、断开TCP连接。
这样是非常浪费资源的,因此在HTTP1.1版本,就是持久连接了。一次HTTP连接能够处理多个请求。
持久连接为“管线化”方式发送成为了可能:在一次HTTP连接里面,不需要等待服务器响应请求,就能够继续发送第二次请求。
提升传输效率
在说明之前,首先我们要知道什么是实体主体
- 实体主体就是作为数据在HTTP中传输的数据。
一般地,实体主体可以等价为报文主体,报文主体是HTTP中的一部分。
我们如果不使用任何手段,服务器返回的数据实体主体是原样返回的。我们可以使用两种方式来提高传输效率
- 使用压缩技术把实体主体压小,在客户端再把数据解析
- 使用分块传输编码,将实体主体分块传输,当浏览器解析到实体主体就能够显示了。
我们如果在下载东西的过程中断了,按照以前我们是需要重新下载的,但是现在可以在中断中继续下载。我们可以使用到获取范围数据,这种叫做范围请求!
这种请求只会下载资源的一部分。
- 比如我的图片下载到一半了,我们只需要下载另一半就可以组成一张完整的图片了。那么请求的时候请求没有下载的一部分即可。
常用的状态码简述
2XX
一般是请求成功
200 正常处理
204 成功处理,但服务器没有新数据返回,显示页面不更新
206 对服务器进行范围请求,只返回一部分数据
3XX
一般表示重定向
301 请求的资源已分配了新的URI中,URL地址改变了。【永久重定向】
302 请求的资源临时分配了新的URI中,URL地址没变【转发】
303 与302相同的功能,但明确客户端应该采用GET方式来获取资源
304 发送了附带请求,但不符合条件【返回未过期的缓存数据】
307 与302相同,但不会把POST请求变成GET
4XX
表示客户端出错了。
400 请求报文语法错误了
401 需要认证身份
403 没有权限访问
404 服务器没有这个资源
5XX
服务器出错了
500 内部资源出错了
503 服务器正忙
服务器与客户端之间的应用程序
首先要说的是,一个HTTP服务器可以拥有多个站点,也就是说:HTTP下可以配置多个虚拟主机。当用户访问不同主机的时候,实际上都是访问同一台HTTP服务器。
在客户端和服务器中还有一些用于通信数据转发的应用程序:
- 代理
- 可以用来缓存数据,当代理缓存了数据以后,客户端就可以直接用代理获取数据
- 可以用来对网站进行访问控制,获取访问日志记录
- 网关
- 能够提供非HTTP请求的操作,访问数据库什么的
- 隧道
- 建立一条安全的通信路径,可以使用SSL等加密手段进行通信。
HTTP首部简述
HTTP请求报文
HTTP请求报文:在请求中,HTTP报文由方法、URI、HTTP版本、HTTP首部字段等部分组成。
- 请求行【描述客户端的请求方式、请求的资源名称,以及使用的HTTP协议版本号】
- 首部字段【描述客户端请求哪台主机,以及客户端的一些环境信息等】
- 一个空行
首部字段例子:
- Accept: text/html,image/* 【浏览器告诉服务器,它支持的数据类型】
- Accept-Charset: ISO-8859-1 【浏览器告诉服务器,它支持哪种字符集】
- Accept-Encoding: gzip,compress 【浏览器告诉服务器,它支持的压缩格式】
- Accept-Language: en-us,zh-cn 【浏览器告诉服务器,它的语言环境】
- Host: www.it315.org:80【浏览器告诉服务器,它的想访问哪台主机】
- If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT【浏览器告诉服务器,缓存数据的时间】
- Referer: http://www.it315.org/index.jsp【浏览器告诉服务器,客户机是从那个页面来的---**反盗链**】
- 8.User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)【浏览器告诉服务器,浏览器的内核是什么】
- Cookie【浏览器告诉服务器,带来的Cookie是什么】
- Connection: close/Keep-Alive 【浏览器告诉服务器,请求完后是断开链接还是保持链接】
- Date: Tue, 11 Jul 2000 18:23:51 GMT【浏览器告诉服务器,请求的时间】
HTTP响应报文
HTTP响应报文:在响应中,HTTP报文由HTTP版本、状态码(数字和原因短语)、HTTP首部字段3部分组成。
- 一个状态行【用于描述服务器对请求的处理结果。】
- 首部字段【用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据】
- 一个空行
- 实体内容【服务器向客户端回送的数据】
状态行:
- 格式: HTTP版本号 状态码 原因叙述
- 状态行:HTTP/1.1 200 OK
- 状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类
首部字段例子:
- Location: http://www.it315.org/index.jsp 【服务器告诉浏览器要跳转到哪个页面】
- Server:apache tomcat【服务器告诉浏览器,服务器的型号是什么】
- Content-Encoding: gzip 【服务器告诉浏览器数据压缩的格式】
- Content-Length: 80 【服务器告诉浏览器回送数据的长度】
- Content-Language: zh-cn 【服务器告诉浏览器,服务器的语言环境】
- Content-Type: text/html; charset=GB2312 【服务器告诉浏览器,回送数据的类型】
- Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器该资源上次更新时间】
- Refresh: 1;url=http://www.it315.org【服务器告诉浏览器要**定时刷新**】
- Content-Disposition: attachment; filename=aaa.zip【服务器告诉浏览器以下载方式打开数据】
- Transfer-Encoding: chunked 【服务器告诉浏览器数据以分块方式回送】
- Set-Cookie:SS=Q0=5Lb_nQ; path=/search【服务器告诉浏览器要保存Cookie】
- Expires: -1【服务器告诉浏览器不要设置缓存】
- Cache-Control: no-cache 【服务器告诉浏览器不要设置缓存】
- Pragma: no-cache 【服务器告诉浏览器不要设置缓存】
- Connection: close/Keep-Alive 【服务器告诉浏览器连接方式】
- Date: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器回送数据的时间】
对于HTTP首部这一部分是非常庞大的一个章节,知识点也很多,我就没有一一去记录了。用到的时候再查吧。我看的是《图解HTTP》。
HTTPS简述
HTTP在安全上是不足的
- 通信使用明文【没有加密过内容的】
- 不验证通信方身份,无论是客户端和服务器,都是随意通信的
- 无法证明报文的完整性【别人监听后,可以篡改】
我们一般在上网时,使用抓包工具就很容易获取到HTTP请求的信息了,这是TCP/IP在网络通信中无法避免的。
假设我们对HTTP报文进行加密了, 那也仅仅是是内容的加密。别人获取到了HTTP内容了,即使无法破解HTTP内容,还是能够篡改的。
我们最好就是使用SSL建立安全的通信线路,就可以在这条线路上进行HTTP通信了。
其实HTTPS就是披着SSL的HTTP...
HTTPS使用的是共享密钥和公开私有密钥混合来进行加密的。由于公开私有密钥需要太多的资源,不可能一直以公开私有密钥进行通信。因此,HTTP在建立通信线路的时候使用公开私有密钥,当建立完连接后,随后就使用共享密钥进行加密和解密了
对于认证方面,HTTPS是基于第三方的认证机构来获取认受认可的证书、因此,可以从中认证该服务器是否是合法的。
而客户端方面则需要自己购买认证证书、这实施起来难度是很大的【认证证书需要钱】。
所以,一般的网站都是使用表单认证就算了,这是用得最广泛的客户端认证了。
如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章的同学,可以关注微信公众号:Java3y
HTTP就是这么简单的更多相关文章
- 【造轮子】打造一个简单的万能Excel读写工具
大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...
- Fabio 安装和简单使用
Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 哪种缓存效果高?开源一个简单的缓存组件j2cache
背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...
- 在Openfire上弄一个简单的推送系统
推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- 使用 Nodejs 搭建简单的Web服务器
使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块. ...
- ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面
前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...
- 简单入门canvas - 通过刮奖效果来学习
一 .前言 一直在做PC端的前端开发,从互联网到行业软件.最近发现移动端已经成为前端必备技能了,真是不能停止学习.HTML5新增的一些东西,canvas是用的比较多也比较复杂的一个,简单的入门了一下, ...
- 简单粗暴地理解js原型链--js面向对象编程
原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...
随机推荐
- 整理C++面试题for非CS程序猿——更新至【48】
结合网上的C++面试题+自己的面经,进行整理记录,for我这种非CS的程序猿.(不定期更新,加入了自己的理解,如有不对,请指出) [1] new/delete和malloc/free的区别和联系? 1 ...
- 把玩爬虫框架Gecco
如果你现在接到一个任务,获取某某行业下的分类. 作为一个非该领域专家,没有深厚的运营经验功底,要提供一套摆的上台面且让人信服的行业分类,恐怕不那么简单. 找不到专家没有关系,我们可以爬虫.把那些专家的 ...
- 2017ecjtu-summer training # 9 HDU 4544
湫湫系列故事--消灭兔子 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- Codeforces__Raising Bacteria
题目传送门:Raising Bacteria //问题描述:一个盒子里面放一个细菌在一天可以增生两个细菌. 现在已知盒子里面细菌的个数,问你最初放多少个细菌可以增生盒子里面的细菌数量 //输入:盒子中 ...
- ASP.NET没有魔法——ASP.NET OAuth、jwt、OpenID Connect
上一篇文章介绍了OAuth2.0以及如何使用.Net来实现基于OAuth的身份验证,本文是对上一篇文章的补充,主要是介绍OAuth与Jwt以及OpenID Connect之间的关系与区别. 本文主要内 ...
- Docker版本升级至17.03
2017/3/3,Docker官方发表了一篇博客,Docker版本从1.13.*直接跳入17.03,该版本的意思是17年3月.同时,还声明了Docker以后会以CE(Community Edition ...
- 迈向c++的一次尝试
从C到C++说着容易做起来也不难,今天做一下尝试. ★:题目介绍:今天是一次尝试所以先从简单的题开始. ★:试题分析:由题可了解到本题目的是要做到由一个数字到一个字符串的转变. 题目简单是由于它只是让 ...
- Java-String.intern的深入研究
When---什么时候需要了解String的intern方法: 面试的时候(蜜汁尴尬)!虽然不想承认,不过面试的时候经常碰到这种高逼格的问题来考察我们是否真正理解了String的不可变性.String ...
- 机器学习——kNN(1)基本原理
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- 【Java框架型项目从入门到装逼】第九节 - 数据库建表和CRUD操作
1.新建学生表 这节课我们来把和数据库以及jdbc相关的内容完成,首先,进行数据库建表.数据库呢,我们采用MySQL数据库,我们可以通过navcat之类的管理工具来轻松建表. 首先,我们得建一个数据库 ...