专栏首页KaliArchHTTP 协议Note
原创

HTTP 协议Note

一、基本概念

名称含义:HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写。

作用:HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等),用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

特点

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

三、HTTP报文

HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

3.1 HTTP报文之Request

HTTP Request报文由:请求行(request line)、请求头部(header)、空行(empty line)和请求数据(body)四个部分组成。

<method><request-URL><version>
<headers>

<entity-body>

start line

  • 一个 HTTP 方法,一个动词 (像 GET, PUT 或者 POST) 或者一个名词 (像 HEAD 或者 OPTIONS), 描述要执行的动作. 例如, GET 表示要获取资源,POST 表示向服务器推送数据 (创建或修改资源, 或者产生要返回的临时文件)。
  • 请求目标 (request target),通常是一个 URL,或者是协议、端口和域名的绝对路径,通常以请求的环境为特征。请求的格式因不同的 HTTP 方法而异。
  • HTTP 版本 (HTTP version),定义了剩余报文的结构,作为对期望的响应版本的指示符。

Header

来自请求的 HTTP headers 遵循和 HTTP header 相同的基本结构:不区分大小写的字符串,紧跟着的冒号 (':') 和一个结构取决于 header 的值。 整个 header(包括值)由一行组成,这一行可以相当长。

  • General headers,例如 Via,适用于整个报文。
  • Request headers,例如 User-Agent,Accept-Type,通过进一步的定义(例如 Accept-Language),或者给定上下文(例如 Referer),或者进行有条件的限制 (例如 If-None) 来修改请求。
  • Entity headers,例如 Content-Length,适用于请求的 body。显然,如果请求中没有任何 body,则不会发送这样的头文件。

body

请求的最后一部分是它的 body。不是所有的请求都有一个 body:例如获取资源的请求,GET,HEAD,DELETE 和 OPTIONS,通常它们不需要 body。 有些请求将数据发送到服务器以便更新数据:常见的的情况是 POST 请求(包含 HTML 表单数据)。

  • Single-resource bodies,由一个单文件组成。该类型 body 由两个 header 定义: Content-Type 和 Content-Length.
  • Multiple-resource bodies,由多部分 body 组成,每一部分包含不同的信息位。通常是和 HTML Forms 连系在一起。

3.2 HTTP报文之Response

HTTP Response报文由:状态行、消息报头、空行和响应正文组成。

<version<status><reason-phrase>
<headers>

<entity-body>

status line

HTTP 响应的起始行被称作 状态行 (status line),包含以下信息:

  • 协议版本,通常为 HTTP/1.1。
  • 状态码 (status code),表明请求是成功或失败。常见的状态码是 200,404,或 302。
  • 状态文本 (status text)。一个简短的,纯粹的信息,通过状态码的文本描述,帮助人们理解该 HTTP 消息。

Header

响应的 HTTP headers 遵循和任何其它 header 相同的结构:不区分大小写的字符串,紧跟着的冒号 (':') 和一个结构取决于 header 类型的值。 整个 header(包括其值)表现为单行形式。

有许多响应头可用,这些响应头可以分为几组:

  • General headers,例如 Via,适用于整个报文。
  • Response headers,例如 Vary 和 Accept-Ranges,提供其它不符合状态行的关于服务器的信息。
  • Entity headers,例如 Content-Length,适用于请求的 body。显然,如果请求中没有任何 body,则不会发送这样的头文件。

body

响应的最后一部分是 body。不是所有的响应都有 body:具有状态码 (如 201 或 204) 的响应,通常不会有 body。

Body 大致可分为三类:

  • Single-resource bodies,由已知长度的单个文件组成。该类型 body 由两个 header 定义:Content-Type 和 Content-Length。
  • Single-resource bodies,由未知长度的单个文件组成,通过将 Transfer-Encoding 设置为 chunked 来使用 chunks 编码。
  • Multiple-resource bodies,由多部分 body 组成,每部分包含不同的信息段。但这是比较少见的。

四、HTTP/2

HTTP/1.x 报文有一些性能上的缺点:

  • Header 不像 body,它不会被压缩。
  • 两个报文之间的 header 通常非常相似,但它们仍然在连接中重复传输。
  • 无法复用。当在同一个服务器打开几个连接时:TCP 热连接比冷连接更加有效。

HTTP/2 引入了一个额外的步骤:它将 HTTP/1.x 消息分成帧并嵌入到流 (stream) 中。数据帧和报头帧分离,这将允许报头压缩。将多个流组合,这是一个被称为 多路复用 (multiplexing) 的过程,它允许更有效的底层 TCP 连接。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 敏捷无敌之Gitlab CI实战

    在目前快节奏生活已经成为社会风潮的大背景下,越来越多的互联网公司为了其应用产品能更快的掌控风向脉搏,抢占市场红利,需要更快速的应用产品开发上线,在市场的反馈下,...

    KaliArch
  • Python实现翻译小工具

    利用Requests模块获取有道词典web页面的post信息,BeautifulSoup来获取需要的内容,通过tkinter模块生成gui界面。

    KaliArch
  • Python实现腾讯云CDB备份文件自动上传到COS

    KaliArch
  • 超两万技术人员如何减少重复造轮子?腾讯推进内部开源协同

    ? 数万人的互联网公司如何高效运转,提升技术开发和运用效率? 截至2019年6月30日,腾讯(00700.HK)共有5.63万名员工。在去年9月30日的大规模...

    腾讯大讲堂
  • 整合IMDb Top 250和BT种子下载

    许杨淼淼
  • 如何使用Marketing Cloud的扩展字段作为搜索条件进行搜索

    需求:我在Marketing Cloud的contact模型上用custom field这个应用创建了一个Extension field,名称为微信ID。

    Jerry Wang
  • Mysql布尔注入自动化脚本

    各种原因,可能导致sqlmap跑不出来,这个时候,自己写脚本就派上用场了,这里写了个简单的脚本,脚本内容是跑user,需要可以自己改。

    Jumbo
  • Octopress中处理加网分享问题

    作为一个以内容为中心的网站,在文章结尾增加社会化分享按钮是一种标配,使用Octopress也不例外,本博客选用了加网的社会化分享按钮。开始的时候一切顺利,但是后...

    技术小黑屋
  • [红日安全]Web安全Day1 - SQL注入实战攻防

    大家好,我们是红日安全-Web安全攻防小组。此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名字叫 Web安全实战 ...

    红日安全
  • Scrapy 爬虫框架学习记录

    安装完 scrapy 后,新建一个爬虫的目录,然后在命令行窗口进入该目录,输入以下命令:

    caoqi95

扫码关注云+社区

领取腾讯云代金券