ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

一篇文章,帮你搞懂HTTP

2021-09-19 11:58:29  阅读:156  来源: 互联网

标签:HTTP 一篇 响应 首部 header 搞懂 连接 请求


前言

本篇是网络部分的第二篇,介绍WEB开发常用的通讯工具HTTP,帮助你在阅读完后,能对HTTP有一个更高层次的认知,遇到相关的面试题,也不用紧张得手心冒汗。下面正式开始本篇的内容介绍:

1、什么是HTTP

它的全英文名是HyperText Transfer Protocol,HTTP是缩写,中文解释是:超文本传输协议。“超文本”是指HTML、CSS、JavaScript、图片、视频和文件等等;“传输协议”这个大家不要望文生义,HTTP是OSI七层模型中的应用层协议,基于TCP传输层协议,所以它的连接是可靠的OSI七层模型不清楚的,可以看博主的这篇文章,里面有详细讲解。

2、资源

万维网联盟编制了一套标准,规定使用URL(uniform resource locator)描述一台特定服务器上某资源的特定位置。URL通常被写成如下形式:<方案>:<方案描述部分>,常见的“方案”有HTTP、FTP、RTSP等等。HTTP协议的URL是由三部分组成:HTTP协议、服务器地址、主机资源的具体地址。

3、HTTP协议

3.1、历史版本

HTTP协议是客户端和服务器端之间数据传输的规则,历史上有三个版本:

  1. 第一版HTTP 0.9是最早的版本,已过时。只允许客户端发送GET这一种请求,且不支持HTTP头,只能传输文本;
  2. 第二版HTTP 1.0,增加了POST方法、HTTP头和内容,传输的内容不仅仅局限文本,还有图片、视频等等,值得一提的是,这个版本默认采用短连接
  3. 第三版HTTP 1.1,也是目前使用最广泛的,默认采用长连接,这是HTTP1.0和HTTP1.1最大的区别(这个放在本篇后面介绍)。
  4. 第四版HTTP 2.0,致力于性能方面,改进传输性能,实现低延迟和高吞吐量,有逐渐替代第三版的趋势。

3.2、HTTP请求和响应

HTTP请求由三部分组成,起始行、首部(header)、内容(body),下面看一段客户端请求服务器的报文:

***@*** ~ % curl -v http://www.baidu.com/index.html
*   Trying 14.215.177.38...
* TCP_NODELAY set
* Connected to www.baidu.com (14.215.177.38) port 80 (#0)
> GET /index.html HTTP/1.1         #起始行
> Host: www.baidu.com			   #请求首部(header) 含义:指定请求的服务器的ip和端口
> User-Agent: curl/7.64.1		   #请求首部(header) 含义:告诉服务器,客户端使用的操作系统、浏览器版本和名称
> Accept: */*					   #请求首部(header) 含义:能接收哪些媒体类型,*/*表示所有类型
  • 起始行写法是固定的,由三部分组成,第一部分是请求方法,第二部分是请求网址URI,第三部分是HTTP版本。
  • 首部(header)在HTTP请求中可以分为通用首部(请求和响应都可以使用)、请求首部(请求特有)、实体首部(针对实体说明)。
  • 内容(body)只在POST的方法中有,因为GET请求并不包含任何实体。

3.3、HTTP响应

HTTP响应类似HTTP请求,也是由三部分组成,起始行、首部(header)、响应内容(body),下面是上面客户端请求服务器响应的报文:

< HTTP/1.1 200 OK									#起始行									
< Accept-Ranges: bytes								#响应首部(header)  含义:对此资源来说服务器可接受的范围单位,这里是byte
< Cache-Control: private, no-cache,no-store		#通用首部(header)  含义:是否缓存
< Connection: keep-alive							#通用首部(header)  含义:控制网络连接是否保持打开状态,keep-alive表示持久连接
< Content-Length: 2381								#实体首部(header)  含义:实体主体的大小
< Content-Type: text/html							#实体首部(header)  含义:实体主体的类型
< Date: Sat, 18 Sep 2021 00:39:51 GMT				#通用首部(header)  含义:报文创建时间
< Etag: "588604dd-94d"								#实体首部(header)  含义:实体标记
< Last-Modified: Mon, 23 Jan 2017 13:27:57 GMT		#实体首部(header)  含义:实体最后一次被修改的时间
< Pragma: no-cache									#通用首部(header)  含义:传送指示,但不专用于缓存
< Server: bfe/1.0.8.18								#响应首部(header)  含义:服务器应用程序的名称和版本
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/	   #响应首部(header)	含义:在客户端设置一个令牌
<!DOCTYPE html>										#响应内容(body)
<!--STATUS OK--><html>
中间省略响应内容……
</html>
  • 响应的起始行是由HTTP版本、响应状态码、状态码的描述组成。
  • 首部(header)在HTTP响应中可以分为通用首部(请求和响应都可以使用)、响应首部(响应特有)、实体首部(针对实体说明)。
  • 响应内容可以通过Content-Type这个实体首部指定是text/html(HTML)、image/jpeg(图片)、video/quicktime(视频)等等。

4、HTTP相关补充

4.1、状态保持

HTTP协议是无状态协议,在一些场景中,我们需要跟踪用户的状态,通用的三种方式是:

  1. 服务器端通过Set-Cookie响应首部设置Cookie信息,客户端保存Cookie信息,下次请求的时候通过Cookie请求首部,将Cookie信息带给服务端,完成会话跟踪。
  2. 客户端和服务器端共同维护一个表单隐藏变量(标识用户),每次会话都带上。
  3. 客户端将标识用户的信息通过参数的形式,传递给服务器端,完成会话跟踪。

4.2、长连接、短连接

HTTP基于传输层的TCP协议,TCP连接需要客户端和服务器端三次握手,HTTP的长连接和短连接本质上是TCP长连接和短连接:

  • 短连接,每个TCP连接只能发送一个请求,发送数据完毕后,连接就关闭了,如果还要请求就必须要新建一个请求连接
  • 长连接,TCP连接默认不关闭,可以被多个请求复用,只有在一段时间内,没有请求,才会自动关闭。

HTTP/1.0中默认使用短连接,适用早期HTML中Web资源(如 JavaScript 文件、图像文件、CSS 文件等)少的场景。

随着互联网的发展,一个HTML中Web资源越来越多,每遇到这样一个 Web 资源,浏览器就会重新建立一个 HTTP 会话,给服务器带来了沉重的负担,于是从 HTTP/1.1 起,默认使用长连接,用以保持连接特性。使用长连接的 HTTP 协议,会在响应头加入:

Connection:keep-alive

4.3、HTTPS协议

HTTP协议使用明文(不加密)传输数据,会存在报文被截取、篡改和身份无法验证的问题。为了解决上面的安全问题,产生了HTTPS协议(HTTP+SSL/TLS),在HTTP的基础上,通过 TLS 对服务端和客户端之间传输的信息进行加密。

那么SSL又是什么?SSL(Secure Socket Layer,安全套接字层)协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持,是TLS(Transport Layer Security,传输层安全)的前身。

客户端(浏览器) 服务端 1、请求HTTPS连接 返回证书(公钥) 2、产生随机对称密钥 3、使用公钥对步骤2中的密钥加密 4、发送3步骤加密后的对称密钥 5、通过对称密钥加密的密文通信 客户端(浏览器) 服务端 HTTPS传输数据的流程

相比较HTTP协议,HTTPS协议使用了SSL/TLS协议进行了加密处理,导致页面的加载时间会延长,涉及到的安全算法会消耗 CPU 资源。最后补充一点,HTTP和HTTPS默认端口是不一样的,HTTP是80,HTTPS是443。

结束语

今天是中秋节放假的第一天,早上6点起床送老婆去考试后,就在家写这篇文章,好在午饭前终于写完了,精神食粮快掏完,要去补充点物理食粮。

各位读者如果觉得对您有帮助的话,请帮忙点个赞,您的赞赏是支持博主继续创作的动力。

标签:HTTP,一篇,响应,首部,header,搞懂,连接,请求
来源: https://blog.csdn.net/cool_summer_moon/article/details/120341299

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有