HTTP协议 | 青训营笔记

105 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天

今天我学习了字节跳动青训营掘金内部课程的HTTP协议课程

1、概述

HTTP协议,超文本传输协议

应用层的协议,基于TCP协议,简单可扩展(可以自定义header)

每个HTTP请求都可以分为请求和响应两个部分

无状态的(不知道之前的请求是携带过什么信息)

当我们在浏览器输入一个网址,此时浏览器就会给对应的服务器发送一个HTTP 请求,对应的服务器收到这个请求之后,经过计算处理,就会返回一个HTTP 响应。并且当我们访问一个网站时,可能涉及不止一次的 HTTP 请求和响应的交互过程。

2、协议分析

发展

1.1版本是目前使用最多的,功能足够用了

不过1.1有很多值得优化的地方,然后就出了http2,现在很多大厂开始用http2了

HTTP/1.1

状态码

HTTP/2概述

更快、更稳定、更简单 

帧:HTTP/2通信的最小单位,每个帧都包含帧头,至少也会标识出当前帧所属的数据流 

消息:逻辑请求或响应消息对应的完整的一些列帧 

数据流:已建立的连接内的双向字节流,可以承载一条或多条信息 

帧是不需要一个个顺序发送的,可以乱序的并行的发,因为每个帧都有标识信息,所有效率高很多 

HTTP/2连接都是永久的,而且仅需要每个来源一个连接 可以流控制,阻止发送方向接收方发送大量数据的机制

HTTP 请求响应过程

你是不是很好奇,当你在浏览器中输入网址后,到底发生了什么事情?你想要的内容是如何展现出来的?让我们通过一个例子来探讨一下,我们假设访问的 URL 地址为www.someSchool.edu/someDepartm… 

  • DNS服务器会首先进行域名的映射,找到访问www.someSchool.edu所在的地址,然后HTTP 客户端进程在 80 端口发起一个到服务器 www.someSchool.edu 的 TCP 连接(80 端口是 HTTP 的默认端口)。在客户和服务器进程中都会有一个套接字与其相连。 
  • HTTP 客户端通过它的套接字向服务器发送一个 HTTP 请求报文。该报文中包含了路径 someDepartment/home.index 的资源,我们后面会详细讨论 HTTP 请求报文。
  • HTTP 服务器通过它的套接字接受该报文,进行请求的解析工作,并从其存储器(RAM 或磁盘)中检索出对象 www.someSchool.edu/someDepartm… HTTP 响应报文中,并通过套接字向客户进行发送。
  • HTTP 服务器随即通知 TCP 断开 TCP 连接,实际上是需要等到客户接受完响应报文后才会断开 TCP 连接。
  • HTTP 客户端接受完响应报文后,TCP 连接会关闭。HTTP 客户端从响应中提取出报文中是一个 HTML 响应文件,并检查该 HTML 文件,然后循环检查报文中其他内部对象。 
  • 检查完成后,HTTP 客户端会把对应的资源通过显示器呈现给用户。 

至此,键入网址再按下回车的全过程就结束了。上述过程描述的是一种简单的请求-响应全过程,真实的请求-响应情况可能要比上面描述的过程复杂很多。

HTTP 请求特征

从上面整个过程中我们可以总结出 HTTP 进行分组传输是具有以下特征 

  • 支持客户-服务器模式
  • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有 GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。
  • 灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记。
  • 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • 无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。