简介

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议,是万维网通信的基础。

那么什么是超文本呢?
超文本指的是HTML,css,JavaScript和图片等,HTTP的出现是为了接收和发布HTML页面,经过不断的发展也可以用于接收一些音频,视频,文件等内容。

包含内容

请求与响应模式、报文、端口号、URL、特性、状态码(大分类和小分类)、请求头字段(user-agent、content-type、gzip、encoding)

请求响应模式

HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准。通常,由HTTP客户端发起一个请求(浏览器、爬虫等),创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。

请求响应报文



请求方法、URL、协议版本、connection、content-Type、都会在后面讲到。其中,最后一行内容实体的name=那一串是我们告诉服务端要请求的数据,Content-Length则是它的长度(正好16字符)。
除了图上所示的,协议还有类似Cookie、User-Agent:的内容。其中,user-agent代表请问的客户端信息,可以根据其内容,服务端区分手机、PC端,以优化显示效果和反爬虫机制(如果我们做爬虫,可能要注意这个,防止被反爬虫机制屏蔽)等。
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

响应报文


HTTP 协议的 8 种请求类型介绍

HTTP 协议中共定义了八种方法或者叫“动作”来表明对 Request-URI 指定的资源的不同操作方式,具体介绍如下:

  • OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*'的请求来测试服务器的功能性。
  • HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
  • GET:向特定的资源发出请求。
  • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。
  • PUT:向指定资源位置上传其最新内容。
  • DELETE:请求服务器删除 Request-URI 所标识的资源。
  • TRACE:回显服务器收到的请求,主要用于测试或诊断。
  • CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。

虽然 HTTP 的请求方式有 8 种,但是我们在实际应用中常用的也就是 get 和 post,其他请求方式也都可以通过这两种方式间接的来实现。

状态码分类

常见的HTTP状态码:

200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
302-临时移动 以后客户端应该继续使用原URL
305-必须使用代理访问
400-语法错误 服务器无法理解
401-要求身份认证
403-拒绝 服务器端理解需求 但是拒绝执行
404 - 请求的资源(网页等)不存在
405-客户端请求中的方法被禁止
500 - 内部服务器错误

MIME Type与Content-type

简单来说 content-type是类型key,MIME TYPE是那些标准化的类型value

浏览器显示的内容都有 HTML、XML、GIF、Flash 等,浏览器是通过 MIME Type 区分它们,决定用什么内容什么形式来显示。

注释:MIME Type 是该资源的媒体类型,MIME Type 不是个人指定的,是经过互联网(IETF)组织协商,以 RFC(是一系列以编号排定的文件,几乎所有的互联网标准都有收录在其中) 的形式作为建议的标准发布在网上的,大多数的 Web 服务器和用户代理都会支持这个规范 (顺便说一句,Email 附件的类型也是通过 MIME Type 指定的)。

媒体类型通常通过 HTTP 协议,由 Web 服务器告知浏览器的,更准确地说,是通过 Content-Type 来表示的。例如:Content-Type:text/HTML。

通常只有一些卓哉互联网上获得广泛应用的格式才会获得一个 MIME Type,如果是某个客户端自己定义的格式,一般只能以 application/x- 开头。

常见的媒体格式类型如下:

  • text/html : HTML格式
  • text/plain :纯文本格式
  • text/xml : XML格式
  • image/gif :gif图片格式
  • image/jpeg :jpg图片格式
  • image/png:png图片格式

以application开头的媒体格式类型:

  • application/xhtml+xml :XHTML格式
  • application/xml: XML数据格式
  • application/atom+xml :Atom XML聚合格式
  • application/pdf:pdf格式
  • application/msword : Word文档格式
  • application/octet-stream : 二进制流数据(如常见的文件下载)
  • application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式) 例如:name=张三&age=18
  • application/json: JSON数据格式 如{“name”:“张三”,“age”:“18”}
  • 另外一种常见的媒体格式是上传文件之时使用的:
    multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

x-www-form-urlencoded格式代码不需要写contentType,而json格式代码需要加上contentType: ‘application/json;charset=UTF-8’
x-www-form-urlencoded格式传输后端不需要添加@RequestBody注解,而json格式需要
x-www-form-urlencoded格式传输的时候data里的数据不要用’‘包裹,否则会得到null,而json使用data去传输的时候恰恰相反,需要使用’'包裹

URL

超文本传输协议(HTTP)的统一资源定位符(URL)将从因特网获取信息的五个基本元素包括在一个简单的地址中:
http://www.luffycity.com:80/news/index.html?id=250&page=1 为例, 其中:

http,是协议;
www.luffycity.com,是服务器;
80,是服务器上的默认网络端口号,默认不显示;
/news/index.html,是路径(URI:直接定位到对应的资源);
?id=250&page=1,是查询。
大多数网页浏览器不要求用户输入网页中“http://”的部分,因为绝大多数网页内容是超文本传输协议文件。同样,“80”是超文本传输协议文件的常用端口号,因此一般也不必写明。一般来说用户只要键入统一资源定位符的一部分(www.luffycity.com:80/news/index.html?id=250&page=1)就可以了。

由于超文本传输协议允许服务器将浏览器重定向到另一个网页地址,因此许多服务器允许用户省略网页地址中的部分,比如 www。从技术上来说这样省略后的网页地址实际上是一个不同的网页地址,浏览器本身无法决定这个新地址是否通,服务器必须完成重定向的任务。

通信下层协议与端口号

尽管TCP/IP协议是互联网上最流行的应用,HTTP协议中,并没有规定必须使用它或它支持的层。事实上,HTTP可以在任何互联网协议上,或其他网络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因此也就是其在TCP/IP协议族使用TCP作为其传输层。
HTTP默认端口号为80,但是你也可以改为8080或者其他端口。

在浏览器地址栏键入URL,按下回车之后会经历以下流程:

  • 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
  • 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
  • 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
  • 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
  • 释放 TCP连接;
  • 浏览器将该 html 文本并显示内容;

特性

1、无连接

HTTP是无连接的无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间,并且可以提高并发性能,不能和每个用户建立长久的连接,请求一次相应一次,服务端和客户端就中断了。但是无连接有两种方式,早期的http协议是一个请求一个响应之后,直接就断开了,但是现在的http协议1.1版本不是直接就断开了,而是等几秒钟,这几秒钟是等什么呢,等着用户有后续的操作,如果用户在这几秒钟之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒钟用户没有发送新的请求,那么就会断开连接,这样可以提高效率,减少短时间内建立连接的次数,因为建立连接也是耗时的,默认的好像是3秒中现在,但是这个时间是可以通过咱们后端的代码来调整的,自己网站根据自己网站用户的行为来分析统计出一个最优的等待时间。

2、无状态

HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
使用HTTP协议,每当有新的请求发送时,就会有对应的新响应产 生。协议本身并不保留之前一切的请求或响应报文的信息。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
可是,随着Web的不断发展,因无状态而导致业务处理变得棘手 的情况增多了。比如,用户登录到一家购物网站,即使他跳转到该站的 其他页面后,也需要能继续保持登录状态。针对这个实例,网站为了能 够掌握是谁送出的请求,需要保存用户的状态。HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能, 于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了

3、媒体独立:

这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。

HTTP各个版本的区别:

https://blog.csdn.net/qq_22238021/article/details/81197157
https://zhuanlan.zhihu.com/p/37387316

HTTP/0.9

HTTP协议的最初版本,功能简陋,仅支持请求方式GET,并且仅能请求访问HTML格式的资源。

HTTP/1 :

加入了header Content-Type 增加了POST方法 支持cache

HTTP/1.1

1.1 版的最大变化,就是引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。
解决了1.0版本的keepalive问题,1.1版本加入了持久连接,一个TCP连接可以允许多个HTTP请求;
客户端和服务器发现对方一段时间没有活动,就可以主动关闭连接。不过,规范的做法是,客户端在最后一个请求时,发送Connection: close,明确要求服务器关闭TCP连接。

加入了管道机制,在同一个TCP连接里,允许多个请求同时发送,增加了并发性,进一步改善了HTTP协议的效率;举例来说,客户端需要请求两个资源。以前的做法是,在同一个TCP连接里面,先发送A请求,然后等待服务器做出回应,收到后再发出B请求。管道机制则是允许浏览器同时发出A请求和B请求,但是服务器还是按照顺序,先回应A请求,完成后再回应B请求。

http中的长连接keep-alive和websocket的长连接不太一样, websock的长连接可以保持几个小时不断线, 而http的长连接也就几秒钟而已,

HTTP/2.0

多路复用、双工模式 即不仅客户端能够同时发送多个请求,服务端也能同时处理多个请求,而且不用按照顺序一一对应

头部压缩: HTTP请求和响应中,状态行和请求/响应头都是些信息字段,并没有真正的数据,因此在2.0版本中将所有的信息字段建立一张表,为表中的每个字段建立索引,客户端和服务端共同使用这个表,他们之间就以索引号来表示信息字段,这样就避免了1.0旧版本的重复繁琐的字段,并以压缩的方式传输,提高利用率。

服务器推送

HTTP/1.1 版的头信息肯定是文本(ASCII编码),数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧"(frame):头信息帧和数据帧。

二进制协议的一个好处是,可以定义额外的帧。HTTP/2 定义了近十种帧,为将来的高级应用打好了基础。如果使用文本实现这种功能,解析数据将会变得非常麻烦,二进制解析则方便得多。

简而言之

0.9 get和纯网页
1.0 新增方法 mime cache
1.1 管道,keepalve
2.0帧 二进制 头压缩(gzip和维持一个表) 多工复用 主动推送

https看另一篇博客

HTTP协议详解 简单易懂超详细整理版相关推荐

  1. c语言指针用法及实际应用详解,通俗易懂超详细

    c语言指针用法及实际应用详解,通俗易懂超详细! \\\插播一条:文章末尾有惊喜哟~/// 今天给大家来讲解一下指针. 我会由浅到深,最后联合实际应用讲解,让大家学会指针的同时,知道大佬们都用指针来干嘛 ...

  2. mqttnet 详解_MQTT协议详解,非常易懂

    MQTT 协议详解 , 非常易懂 http://blog.csdn.net/y281252548/article/details/506849852 016 协议地址: http://public.d ...

  3. MQTT协议详解,非常易懂

    MQTT协议详解一 协议地址:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html 当然也有PDF版的,百度 ...

  4. JavaSE08:详解多线程(超详细)

    写在前面 经过两天的学习,超梦终于将多线程的基础知识学了一遍,笔记做完之后,赶紧写篇博客再巩固一下.为了保证效果,博客也会像笔记一样的详细~(部分截图来自尚硅谷宋红康老师课件) 程序.进程.线程 程序 ...

  5. c语言指针用法及实际应用详解,通俗易懂超详细!

    大家好,我是无际. 今天给大家来讲解一下指针. 我会由浅到深,最后结合实际应用讲解,让大家学会指针的同时,知道大佬们都用指针来干嘛! 长文预警!全文大约5200多字,学指针看这篇文章就够了! 很多人跟 ...

  6. dijkstra算法详解—简单易懂

    文章目录 1 简介 2 算法思想与原理 3 具体步骤 4 动态展示 5 代码实现(以邻接矩阵为例) 5.1 基本数据 5.2 初始化 5.3 dijkstra算法核心 5.4 主函数与头文件等 6 拓 ...

  7. linux操作系统之常用远程管理命令:关机和重启命令shutdown详解 简单易懂~

    1.shutdown命令的使用格式:shutdown 选项(关机或重启电脑 ) 2.怎样才能通过终端来远程的控制电脑呢? 通过控制终端,向重新启动或者关闭电脑的时候,就可以在终端输入shutdown的 ...

  8. linux操作系统之超级用户(root)及sudo命令概念及用途详解 简单易懂

    一 超级用户 1.linux操作系统中,有一个概念叫做超级用户(root):拥有操作系统的资源的所有访问权限,用于对系统的维修和管理(添加或删除用户或组,安装软件等对系统进行管理的操作). 2.在Li ...

  9. 查看文件终端命令之cat命令和more命令详解 简单易懂

    1.首先我们要明确为什么要使用终端命令的形式而不直接使用图形界面? 在终端中只能用终端命令来操作,不能再用图形的界面了(这也是我们学习终端命令的原因) 2.cat命令和more命令都可以查看文件但是有 ...

最新文章

  1. 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...
  2. 【ASP.NET MVC 学习笔记】- 16 Model Binding(模型绑定)
  3. 十六款值得关注的NoSQL与NewSQL数据库--转载
  4. 由防止表单重复提交引发的一系列问题--servletRequest的复制、body值的获取
  5. P5044-[IOI2018] meetings 会议【dp,笛卡尔树,线段树二分】
  6. 系统文件-- lsof
  7. (11)css常用样式—display显示模式
  8. win10下装win7双系统_分享电脑安装win7win10双系统教程
  9. python关键词提取源码,python实现textrank关键词提取
  10. 幸福之路---罗素,2017-12-6 周三
  11. 开源项目推荐:3D点云处理软件CloudCompare,基于Qt和OpenGL
  12. AD14中自定义PCB板形状
  13. 服务器复制文件出现io错误,win10系统复制文件提示“由于io设备错误”的图文方案...
  14. 期末排名算不算计算机成绩,智学网怎么看年级排名 智学网如何查看期末考试成绩...
  15. Uber无人车愈挫愈勇 估值百亿 已运送数万乘客
  16. 对网页 ‘’为所欲为‘’ 之手动实现深色模式?
  17. 嵌入式单片机基础篇(十三)之 STM32 内部温度传感器
  18. 戴特科技MES制造执行系统解决方案及生产计划
  19. ZWeily的小品文(一)MFC中的文件读写问题
  20. windows2016服务器优化,注册表优化Windows Server 2016 大全

热门文章

  1. kubectl get pods指令说明
  2. 什么是RAID和JBOD
  3. mac 语音召唤siri_如何让Siri在Mac上为您阅读文章
  4. canal部署、原理和使用介绍
  5. “中银杯”辽宁省第十九届职业院校技能大赛软件测试赛项
  6. php的service层和logic层,mvc深刻理解,logic,service,model层的作用
  7. web前端面试题最全版总结
  8. mobaxterm多屏操作_MobaXterm远程连接Linux图形用户界面
  9. Jmeter接口及性能报告监控插件
  10. 天池龙珠计划训练营——python3