热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HTTP的基本结构

HTTP协议与TCPUDP类似,需要在实际传输的数据前附加一些头数据。不过与TCPUDP不同的是,HTTP协议是一个“纯文本”协议,头部数据都是ASCII码的文本,可以直接阅读。报

HTTP 协议与 TCP/UDP 类似,需要在实际传输的数据前附加一些头数据。不过与 TCP/UDP 不同的是,HTTP 协议是一个“纯文本”协议,头部数据都是 ASCII 码的文本,可以直接阅读。


报文结构

HTTP 协议的请求报文和响应报文基本相同,由三大部分组成:



  1. 起始行(start line):描述请求和响应的基本信息;

  2. 头部字段集合(header):使用 key-value 形式更详细的说明报文;

  3. 消息正文(entity):实际传输的数据,可以是文本、图片、视频等。

其中前两部分起始行和头部字段经常合称为“请求头”或“响应头”,消息正文又称为“body”。

HTTP 协议规定报文必须有 header,可以没有 body,而且在 header 之后必须要有一个“空行(CRLF)”。

drawing


请求行

GET / HTTP/1.1

请求行由三部分构成:



  1. 请求方法:如 GET、POST,表示对资源的操作;

  2. 请求目标:通常是一个 URI,标记了请求方法要操作的资源;

  3. 版本号:表示报文使用的 HTTP 协议版本。

这三部分通常使用空格(space)来分隔,最后要用 CRLF 换行表示结束。

drawing


状态行

HTTP/1.1 200 OK

响应报文中的起始行称为“状态行”,意思是服务器响应的状态。

状态行也是由三部分构成:



  1. 版本号:表示报文使用的 HTTP 协议版本;

  2. 状态码:一个三位数,表示处理的结果。如 200 是成功,500 是服务器错误。

  3. 原因:作为数字状态码补充,是更详细的解释。

drawing


头部字段

请求行或状态行再加上头部字段集合就构成了 HTTP 报文里完整的请求头或响应头。

头部字段是 key-value 的形式,key 和 value 之间用“:”分隔,最后用 CRLF 换行表示字段结束。

HTTP 头字段非常灵活,不仅可以使用标准里的 Host、Connection 等已有头,还可以任意添加自定义头,这给 HTTP 协议带来了无限拓展可能。


常用头字段

基本可以分为四大类:



  1. 通用字段:在请求头和响应头里都可以出现;

  2. 请求字段:只能出现在请求头里,进一步说明请求信息或额外的附加条件;

  3. 响应字段:只能出现在响应头里,补充说明响应报文的信息;

  4. 实体字段:它实际上属于通用字段,但专门描述 body 的额外信息。


Host

Host 属于请求字段,只能出现在请求头里,同时也是唯一一个 HTTP/1.1 规范里要求必须出现的字段。

Host 字段告诉服务器这个请求该由哪个主机来处理,当一台计算机上托管了多个虚拟主机的时候,服务器端就需要用 Host 字段来选择,有点像一个简单的“路由重定向”。


User-Agent

User-Agent 属于请求字段,只出现在请求头里。描述发起 HTTP 请求的客户端,服务器可以依据它来返回最适合此浏览器显示的页面。


Date

Date 是一个通用字段,但通常出现在响应头里,表示 HTTP 报文创建的时间,客户端可以使用这个时间再搭配其他字段决定缓存策略。


Server

Server 是响应字段,只能出现在响应头里。它告诉客户端当前正在提供 Web 服务的软件名称和版本号。这个字段不是必须要出现的,因为这会把服务器的一部分信息暴露给外界。所以,有的网站响应头里要么没有这个字段,要么就给出一个完全无关的信息。


Content-length

Content-length 表示报文里 body 的长度,也就是请求头或响应头空行后面数据的长度。服务器看到这个字段,就知道了后续有多少数据,可以直接接收。如果没有这个字段,那么 body 就是不定长的,需要使用 chunked 方式分段传输。

问题:



  1. 如果在拼 HTTP 报文的时候,在头字段后多加了一个 CRLF,导致出现了一个空行,会发生什么?

    答:在 header 下面第一个空行以后都会被当作 body 处理



  2. 头字段“:”后面的空格可以有多个,那么为什么绝大多数情况下都只使用一个空格呢?

    答:头部多一个空格就会多一个传输的字节,去掉无用的信息,保证传输的头部字节数尽量小。





推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • 台式电脑的电力消耗:待机一天耗电多少?
    探讨台式电脑的电力消耗问题,特别是待机状态下的能耗。本文将详细介绍影响电脑功耗的因素,并提供计算和优化电源配置的方法。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 配置Windows操作系统以确保DAW(数字音频工作站)硬件和软件的高效运行可能是一个复杂且令人沮丧的过程。本文提供了一系列专业建议,帮助你优化Windows系统,确保录音和音频处理的流畅性。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 选择适合生产环境的Docker存储驱动
    本文旨在探讨如何在生产环境中选择合适的Docker存储驱动,并详细介绍不同Linux发行版下的配置方法。通过参考官方文档和兼容性矩阵,提供实用的操作指南。 ... [详细]
  • 本文详细介绍了C语言中的指针,包括其基本概念、应用场景以及使用时的优缺点。同时,通过实例解析了指针在内存管理、数组操作、函数调用等方面的具体应用,并探讨了指针的安全性问题。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
author-avatar
so杨xi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有