Http请求报文格式和响应报文格式
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协议的主要特点
- 支持C/S(客户/服务器)模式。
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST,每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 无状态: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请求报文格式和响应报文格式相关推荐
- HTTP请求报文和HTTP响应报文(转载)
本文转载自HTTP请求报文和HTTP响应报文,感谢作者~ HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的.HTTP有两类报文:请求报文和响应报文. HTT ...
- 深度理解HTTP请求报文和HTTP响应报文
HTTP请求报文和HTTP响应报文 HTTP协议简介 超文本传输协议(英文:Hyper Text Transfer Protocol,缩写:HTTP)是互联网上应用最为广泛的一种网络协议.设计HTTP ...
- HTTP请求报文(请求行、请求头、请求体),响应报文
转载:https://www.cnblogs.com/lmh001/p/9928517.html 一.HTTP请求报文 HTTP请求报文由3部分组成(请求行+请求头+请求体): 请求行: ①是请求方法 ...
- 痛定思痛!!!结合fidller抓包,简单介绍http请求报文和http响应报文
简单介绍http请求报文和http响应报文 前言 1. http请求报文的组成 1.1 请求行的内容 1.2 请求头的组成 1.3 请求体 2. HTTP响应报文组成 前言 各类书上在介绍http请求 ...
- http详解 请求报文格式和响应报文格式
题外话: <Pi Network 免费挖矿国外热门项目 一个π币大约值3元到10元>相信过去BTC的人,信不信未来的PI,了解一下,唯一一个高度与之持平的项目 HTTP 工作原理 超文本传 ...
- HTTP请求报文和HTTP响应报文(转)
原文地址:http://blog.csdn.net/zhangliang_571/article/details/23508953 HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串, ...
- HTTP请求报文和HTTP响应报文
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的.HTTP有两类报文:请求报文和响应报文. 一. HTTP请求报文 一个HTTP请求报文由请求行(reque ...
- 【项目学习】C++实现高并发服务器——代码学习(二)存储解析HTTP请求报文,创建响应报文
项目来源:WebServer 上一篇:Reactor高并发模型 本文介绍以下功能的代码实现 利用标准库容器封装char,实现自动增长的缓冲区: 利用正则与状态机解析HTTP请求报文,实现处理静态资源的 ...
- HTTP 请求报文、响应报文格式详解
HTTP请求报文格式: 图片只做参考 HTTP请求报文主要由请求行.请求头部.请求正文(附属体)3部分组成 1,请求行 由3部分组成,分别为:请求方法.URL(见备注1)以及协议版本,之间由空格分隔 ...
最新文章
- YOLOv3模型剪枝,瘦身80%,提速100%,精度基本不变
- (双引号)与 ' '(单引号)的区别
- npm package.json文件中的依赖关系,devDependencies和peerDependencies之间有什么区别?
- Intel Realsense D435报错 RuntimeError: MFCreateDeviceSource(_device_attrs, _source) returned: HResult
- LeetCode Algorithm 22. 括号生成
- 移动开发:iphone开发之触摸事件详解
- applecare多少钱?_否,AppleCare +无法覆盖丢失或被盗的iPhone
- 谷歌、CMU发文:别压榨单模型了!集成+级联上分效率更高!
- 凸包 poj 1113
- 推荐几个win8系统下载比较好的网站
- Mybatis-plus插入数据遇到主键没有默认值的问题
- eXeScope 提取.exe/.dll中的图片资源
- 如何固定电脑桌面便签 win7便签怎么设置?
- 设备控制接口之百度 OCR在Total Control的应用
- ubuntu运行迅雷极速版
- 怎么把腾讯视频qlv格式转换成为mp4视频(无需软件详细操作)
- 【人工智能项目】MNIST手写体识别实验及分析
- 邮件营销整体解决方案
- 计算机导论模板,计算机导论论文提纲范文模板 计算机导论论文大纲怎样写
- Tomcat部署Web项目