HTTP请求报文格式

客户端连上服务器后,向服务器发出获取某个Web资源的消息,称之为客户端向服务器发送了一个HTTP请求。

HTTP请求报文主要由请求行、请求头部、请求正文3部分组成。例如,GET /index.html HTTP/1.1

请求示例:

GET请求示例:

POST请求示例:

tips:回车符 \r 换行符 \n

请求行

由3部分组成,分别为:请求方法、URL以及协议版本,之间由空格分隔

请求方法包括GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE以及扩展方法,当然并不是所有的服务器都实现了所有的方法,部分方法即便支持,处于安全性的考虑也是不可用的

URL地址中如果包含中文,浏览器会自动对中文字符进行编码之后再发送

协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1

GET

请求获取Request-URI所标识的资源

POST

在Request-URI所标识的资源后附加新的数据

HEAD

请求获取由Request-URI所标识的资源的响应消息报头

PUT

请求服务器存储一个资源,并用Request-URI作为其标识

DELETE

请求服务器删除Request-URI所标识的资源

TRACE

请求服务器回送收到的请求信息,主要用于测试或诊断

CONNECT

HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器

OPTIONS

请求查询服务器的性能,或者查询与资源相关的选项和需求

请求头部

请求头部为请求报文添加了一些附加信息,由“键/值”对组成,每行一对,名和值之间使用冒号分隔

常见请求头如下:

请求头

说明

Host

接受请求的服务器地址,可以是IP:端口号,也可以是域名

User-Agent

发送请求的应用程序名称

Connection

指定与连接相关的属性,如Connection:Keep-Alive

Accept-Charset

通知服务端可以发送的编码格式

Accept-Encoding

通知服务端可以发送的数据压缩格式

Accept-Language

通知服务端可以发送的语言

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 表示客户端可以接受的内容类型,多个值使用;分号隔开q=0.9 表示权重优先级,*/*表示可以接受任意类型内容
Content-Type: application/x-www-form-urlencoded 表单提交时才有可能出现,表示表单的数据类型,使用url编码,url编码 % 16位数
Upgrade-Insecure-Requests 告诉服务器,浏览器可以处理https协议

请求头部的最后会有一个空行,表示请求头部结束,接下来为请求正文,这一行非常重要,必不可少

请求正文

可选部分,比如GET请求就没有请求正文

POST请求体中存放的是表单提交的键值对。例如Json格式:{"name":"c","age":10}

HTTP响应报文格式

所谓响应其实就是服务器对请求处理的结果,或者如果浏览器请求的直接就是一个静态资源的话,响应的就是这个资源本身。

HTTP响应报文主要由状态行、响应头部、响应正文3部分组成。

响应示例:

状态行

状态行格式为:HTTP-Version Status-Code Reason-Phrase CRLF,分别为:协议版本,状态码,状态码描述,之间由空格分隔。

其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。

状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

  • 1xx:指示信息--表示请求已接收,继续处理。
  • 2xx:成功--表示请求已被成功接收、理解、接受。
  • 3xx:重定向--要完成请求必须进行更进一步的操作。
  • 4xx:客户端错误--请求有语法错误或请求无法实现。
  • 5xx:服务器端错误--服务器未能实现合法的请求。

常见状态代码、状态描述的说明如下:

状态码

说明

200                    

响应成功

301

永久重定向,搜索引擎将删除源地址,保留重定向地址

302

暂时重定向,重定向地址由响应头中的Location属性指定(JSP中Forward和Redirect之间的区别)

由于搜索引擎的判定问题,较为复杂的URL容易被其它网站使用更为精简的URL及302重定向劫持

304

缓存文件并未过期,还可继续使用,无需再次从服务端获取

400

客户端请求有语法错误,不能被服务器识别

403

服务器接收到请求,但是拒绝提供服务(认证失败)

404

请求资源不存在

500

服务器内部错误

响应头部

与请求头部类似,为响应报文添加了一些附加信息

常见响应头部如下:

响应头

说明

Server

服务器应用程序软件的名称和版本

Content-Type

响应正文的类型(是图片还是二进制字符串)

Content-Length

响应正文长度

Content-Charset

响应正文使用的编码

Content-Encoding

响应正文使用的数据压缩格式

Content-Language

响应正文使用的语言

Expires: -1、Cache-control:no-cache、Pragma:no-cache

三个响应头一起使用, 表示禁止浏览器缓存当前页面.

每个浏览器厂商对认识的禁止头不同因此三个一起使用。

在解析请求的时候,可能遇见的Transfer-Encoding响应头,而没有Content-Length。

Transfer-Encoding编码方式

compress

采用 Lempel-Ziv-Welch (LZW) 压缩算法

deflate

采用 zlib 结构 (在 RFC 1950 中规定),和 deflate 压缩算法(在 RFC 1951 中规定)

gzip

表示采用 Lempel-Ziv coding (LZ77) 压缩算法,以及32位CRC校验的编码方式

identity

用于指代自身(例如:未经过压缩和修改)。除非特别指明,这个标记始终可以被接受

chunked

数据以一系列分块的形式进行发送。 Content-Length 首部在这种情况下不被发送

HTTP 工作原理

  HTTP 协议采用请求/响应模型。客户端向服务器发送一个请求报文,服务器以一个状态作为响应。

  以下是 HTTP 请求/响应的步骤:

  ● 客户端连接到web服务器:HTTP 客户端与web服务器建立一个 TCP 连接;

  ● 客户端向服务器发起 HTTP 请求:通过已建立的TCP 连接,客户端向服务器发送一个请求报文;

  ● 服务器接收 HTTP 请求并返回 HTTP 响应:服务器解析请求,定位请求资源,服务器将资源副本写到 TCP 连接,由客户端读取;

  ● 释放 TCP 连接:若connection 模式为close,则服务器主动关闭TCP 连接,客户端被动关闭连接,释放TCP 连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

  ● 客户端浏览器解析HTML内容:客户端将服务器响应的 html 文本解析并显示;

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

  1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;

  2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立 TCP 连接;

  3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;

  4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;

  5、释放 TCP 连接;

  6、浏览器将该 html 文本并显示内容;

HTTP协议的主要特点

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

HTTP URL 的格式: http://host[:port][abs_path]

URL

http://host[:port][abs_path]

http

表示要通过HTTP协议来定位网络资源

host

表示合法的Internet主机域名或IP地址

port

用于指定一个端口号,拥有被请求资源的服务器主机监听该端口的TCP连接(如果port是空,则使用缺省的端口80。当服务器的端口不是80的时候,需要显式指定端口号)

abs_path

指定请求资源的URI(Uniform Resource Identifier,统一资源定位符),如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出。通常这个工作浏览器就帮我们完成了

PS:

1,URI、URL和URN之间的区别

URI全名为Uniform Resource Indentifier(统一资源标识),用来唯一的标识一个资源,是一个通用的概念,URI由两个主要的子集URL和URN组成

URL全名为Uniform Resource Locator(统一资源定位),通过描述资源的位置来标识资源

URN全名为Uniform Resource Name(统一资源命名),通过资源的名字来标识资源,与其所处的位置无关,这样即使资源的位置发生变动,其URN也不会变化

HTTP规范将更通用的概念URI作为其资源标识符,但是实际上,HTTP应用程序处理的只是URI的URL子集

参考:

https://blog.csdn.net/a19881029/article/details/14002273

https://www.cnblogs.com/CodingUniversal/p/7524088.html

https://zhuanlan.zhihu.com/p/135864492

https://blog.csdn.net/xmxt668/article/details/89461183

Http请求报文格式和响应报文格式相关推荐

  1. HTTP请求报文和HTTP响应报文(转载)

    本文转载自HTTP请求报文和HTTP响应报文,感谢作者~ HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的.HTTP有两类报文:请求报文和响应报文. HTT ...

  2. 深度理解HTTP请求报文和HTTP响应报文

    HTTP请求报文和HTTP响应报文 HTTP协议简介 超文本传输协议(英文:Hyper Text Transfer Protocol,缩写:HTTP)是互联网上应用最为广泛的一种网络协议.设计HTTP ...

  3. HTTP请求报文(请求行、请求头、请求体),响应报文

    转载:https://www.cnblogs.com/lmh001/p/9928517.html 一.HTTP请求报文 HTTP请求报文由3部分组成(请求行+请求头+请求体): 请求行: ①是请求方法 ...

  4. 痛定思痛!!!结合fidller抓包,简单介绍http请求报文和http响应报文

    简单介绍http请求报文和http响应报文 前言 1. http请求报文的组成 1.1 请求行的内容 1.2 请求头的组成 1.3 请求体 2. HTTP响应报文组成 前言 各类书上在介绍http请求 ...

  5. http详解 请求报文格式和响应报文格式

    题外话: <Pi Network 免费挖矿国外热门项目 一个π币大约值3元到10元>相信过去BTC的人,信不信未来的PI,了解一下,唯一一个高度与之持平的项目 HTTP 工作原理 超文本传 ...

  6. HTTP请求报文和HTTP响应报文(转)

    原文地址:http://blog.csdn.net/zhangliang_571/article/details/23508953 HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串, ...

  7. HTTP请求报文和HTTP响应报文

    HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的.HTTP有两类报文:请求报文和响应报文. 一. HTTP请求报文 一个HTTP请求报文由请求行(reque ...

  8. 【项目学习】C++实现高并发服务器——代码学习(二)存储解析HTTP请求报文,创建响应报文

    项目来源:WebServer 上一篇:Reactor高并发模型 本文介绍以下功能的代码实现 利用标准库容器封装char,实现自动增长的缓冲区: 利用正则与状态机解析HTTP请求报文,实现处理静态资源的 ...

  9. HTTP 请求报文、响应报文格式详解

    HTTP请求报文格式: 图片只做参考 HTTP请求报文主要由请求行.请求头部.请求正文(附属体)3部分组成 1,请求行 由3部分组成,分别为:请求方法.URL(见备注1)以及协议版本,之间由空格分隔 ...

最新文章

  1. YOLOv3模型剪枝,瘦身80%,提速100%,精度基本不变
  2. (双引号)与 ' '(单引号)的区别
  3. npm package.json文件中的依赖关系,devDependencies和peerDependencies之间有什么区别?
  4. Intel Realsense D435报错 RuntimeError: MFCreateDeviceSource(_device_attrs, _source) returned: HResult
  5. LeetCode Algorithm 22. 括号生成
  6. 移动开发:iphone开发之触摸事件详解
  7. applecare多少钱?_否,AppleCare +无法覆盖丢失或被盗的iPhone
  8. 谷歌、CMU发文:别压榨单模型了!集成+级联上分效率更高!
  9. 凸包 poj 1113
  10. 推荐几个win8系统下载比较好的网站
  11. Mybatis-plus插入数据遇到主键没有默认值的问题
  12. eXeScope 提取.exe/.dll中的图片资源
  13. 如何固定电脑桌面便签 win7便签怎么设置?
  14. 设备控制接口之百度 OCR在Total Control的应用
  15. ubuntu运行迅雷极速版
  16. 怎么把腾讯视频qlv格式转换成为mp4视频(无需软件详细操作)
  17. 【人工智能项目】MNIST手写体识别实验及分析
  18. 邮件营销整体解决方案
  19. 计算机导论模板,计算机导论论文提纲范文模板 计算机导论论文大纲怎样写
  20. Tomcat部署Web项目

热门文章

  1. NXP imx6ull GPIO简介
  2. OpenCV 中的 remap 函数
  3. 计算机对护理工作的应用研究,【计算机专业论文】护理专业计算机实践教学改革研究(共3924字)...
  4. Typora+PicGo+Girhub+坚果云创建云笔记
  5. CUDA python 3.9 安装
  6. 校园是一本生物书 之显微镜下的微世界
  7. XPath-语法大全
  8. 百度李彦宏:几乎每年我都有做不下去了的感觉
  9. Ubuntu16.04下多版本pip共存
  10. 产品成长之路——商汤商业分析