7 HTTP 的报文
1 报文结构
TCP的报文
- TCP头部数据:20字节,发送方的端口号、接收方的端口号、包序号、标志位。
- 实际传输的数据:通常大小是 1460 字节
HTTP协议的报文
起始行+头部字段集合+消息正文
- 起始行(strat line):描述请求或响应的基本信息
- 头部字段集合(header):使用 key-value 形式更详细地说明报文,前面这两部分合称请求头或响应头
- 消息正文(entity):实际传输的数据,二进制数据,也叫实体或body
报文必须有 header,但是可以没有body(如 get 请求报文),在 header 之后必须要有一个“空行”,即“CRLF”,十六进制的“0D0A”。
各个web服务器都不允许过大的请求头,因为头部太大会占用太多服务器资源,影响运行效率。

2 请求行:request line
请求方法+请求目标+版本号,空格隔开,CRLF 换行结束。
- 请求方法:是一个动词,如 get/post ,表示对资源的操作
- 请求目标:通常是一个 URI,标记了 请求方法要操作的资源
- 版本号:表示报文使用的HTTP协议版本
3 状态行:status line
版本号+状态码+原因
- 版本号:表示报文使用的 HTTP 协议版本
- 状态码:三位数,如 200 是成功,500 是服务器错误
- 原因:作为数字状态码补充,是更为详细的解释文字,帮助人理解原因
- 以上三部分空格分隔,CRLF 换行结束

4 头部字段
- 请求行或状态行再加上头部字段集合就构成了 HTTP 报文里完整的请求头 或 响应头。
- 头部字段 是 key-value 的形式,key和value之间用 “:” 分隔,最后用 CRLF 换行表示字段结束
- HTTP 头部支持自定义


使用头字段的注意点:
- 字段名 不区分大小写
- 字段名 不允许出现空格
- 字段名后面必须紧接着 “:”,不能有空格,而 “:” 后的字段值前可以有多个空格
- 字段的顺序是没有意义的,可以任意排列不影响语义
- 字段原则上不能重复,除非这个字段本身的语义允许
5 常用头字段
种类很多,基本分为 四大类:
- 通用字段:在请求头和响应头里都可以出现
- 请求字段:只能出现在请求头里,补充说明请求信息或额外条件
- 响应字段:仅能出现在响应头里,补充说明响应报文的信息
- 实体字段:实际上属于通用字段,但是专门描述 body 的额外信息。
对报文的解析实际上就是对头字段的处理。
基本的头信息
1. Host 字段(必须)
- 请求字段,只能出现在请求头。
- 唯一一个 HTTP/1.1 规范里要求必须出现的字段,如果没有就是一个错误报文。
- Host 字段告诉请求应该由哪个主机来处理,当一台计算机上托管了多个虚拟主机,服务端就需要用 Host 字段来选择。
- Host 字段可以区分IP相同但是域名不同的网站。
2. Uesr-Agent
- 请求字段,只能出现在请求头。
- 使用一个字符串来描述发起HTTP请求的客户端,服务器可以依据它来返回最合适此浏览器显示的页面。
- 实际上每个浏览器自称 “chrome”,“Mozilla” 等,是这个字段越来越长却毫无意义。
3. Date 字段
- 通用字段,通常出现在响应头里。
- 表示HTTP 报文的创建时间。
- 和其他字段搭配绝对缓存策略。
4. Server 字段
- 响应字段,只能出现在响应头里。
- 告诉客户端当前正在提供Web服务的软件名称和版本号。
- 非必须,容易暴露信息给外界被黑客攻击。
- 一般会给出一个无关紧要的描述信息。
基本的实体字段
1. Content-length
- 表示报文里body的字段长度,也就是请求头或响应头空行后数据的长度。
- 服务器看到这个字段就知道后续有多少数据,可以直接接受。
- 没有这个字段,表示 body 是不定长的,需要使用 chunked 方式分段传输。
7 HTTP 的报文的更多相关文章
- 重温Http协议--请求报文和响应报文
http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应的内容再通过h ...
- Tcp/ip 报文解析
在编写网络程序时,常使用TCP协议.那么一个tcp包到底由哪些东西构成的呢?其实一个TCP包,首先需要通过IP协议承载,而IP报文,又需要通过以太网传送.下面我们来看看几种协议头的构成 一 .Ethe ...
- 前端学HTTP之报文首部
前面的话 首部和方法配合工作,共同决定了客户端和服务器能做什么事情.在请求和响应报文中都可以用首部来提供信息,有些首部是某种报文专用的,有些首部则更通用一些.本文将详细介绍HTTP报文中的首部 结构 ...
- [httpserver]如何解析HTTP请求报文
这个http server的实现源代码我放在了我的github上,有兴趣的话可以点击查看哦. 在上一篇文章中,讲述了如何编写一个最简单的server,但该程序只是接受到请求之后马上返回响应,实在不能更 ...
- dhcp协议交互报文
DHCP共有八种报文,分别为DHCP Discover.DHCP Offer.DHCP Request.DHCP ACK.DHCP NAK.DHCP Release.DHCP Decline.DHCP ...
- 前端学HTTP之报文起始行
前面的话 如果说HTTP是因特网的信使,那么HTTP报文就是它用来搬东西的包裹了.HTTP报文是在HTTP应用程序之间发送的简单的格式化数据块,每条报文都包含一条来自客户端的请求,或者一条来自服务器的 ...
- DNS报文格式(RFC1035)
一.域名和资源记录的定义 1.Name space definitions 2.资源记录定义(RR definitions) 2.1 格式 后面分析报文的时候详细解释. ...
- Jmeter+TCP\Scoket(8583)报文压力测试
Jmeter一般被用来测试HTTP协议,我第一次拿来测试socket协议,pos机传输报文为8583,协议属于socket,也是TCP协议的一种,网上有LR怎么测试8583报文,我就研究了一下怎么用J ...
- Java Web ——http协议响应报文
HTTP 响应报文 HTTP 响应报文由状态行.响应头部.空行 和 响应包体 4 个部分组成,如下图所示: 下面对响应报文格式进行简单的分析: 状态行:状态行由 HTTP 协议版本字段.状态码和状态码 ...
- ARP报文发送的可视化实现
一.安装VS2013,下载wpdpack,为VS2010配置WinpCap环境: ⑴首先在View中选择Property Manager,然后展开工程,再展开Debug|Win32 ,接着右击 Mir ...
随机推荐
- doris单机安装部署
原文出处 doris单机安装部署 下载Doris 环境要求 Linux系统:Centos7.x或Ubantu16.04及以上版本 Java运行环境: JDK8 java -version 在windo ...
- 《小白WEB安全入门》02. 开发篇
@ 目录 初识HTML潜在漏洞 初识CSS潜在漏洞 初识JS潜在漏洞 初识后端潜在漏洞 后端能做什么 后端种类 后端框架 潜在漏洞 本系列文章只叙述一些超级基础理论知识,极少有实践部分 本文涉及到的语 ...
- 千万级数据的表,我把慢sql优化后性能提升30倍!
分享技术,用心生活 背景:系统中有一个统计页面加载特别慢,前端设置的40s超时时间都加载不出来数据,因为是个统计页面,基本上一猜就知道是mysql的语句有问题,遗留了很久没有解决,正好趁不忙的时候,下 ...
- 2.12 PE结构:实现PE字节注入
本章笔者将介绍一种通过Metasploit生成ShellCode并将其注入到特定PE文件内的Shell注入技术.该技术能够劫持原始PE文件的入口地址,在PE程序运行之前执行ShellCode反弹,执行 ...
- Unity - UIWidgets 1. 从Hello world开始
安装参照github的README.UIWidgets相当于Flutter的一个Unity实现(后面表示UIWidgets和UGUI区别时直接称"Flutter"),是把承载的所有 ...
- YXの每日挂分记录
7.11 T1 不开两倍数组 100->60. 7.18 T2 dp+矩乘 转移不判边界 100->10. 7.20 T2 人类智慧 1e6 n log n 100->10,求前 5 ...
- HTML5学习内容-3
(一)行高 line-height,一行文字的高度 例子 <!DOCTYPE html> <html lang="en"> <head> < ...
- 关于Linux性能监控之CPU篇详解
http://news.chinaunix.net/opensource/2013/0228/2654519.shtml # vmstat 1 procs -----------memory----- ...
- Python 异常处理:try、except、else 和 finally 的使用指南
异常处理 当发生错误(或我们称之为异常)时,Python 通常会停止执行并生成错误消息. try 块用于测试一段代码是否存在错误. except 块用于处理错误. else 块用于在没有错误时执行代码 ...
- [Python急救站课程]圆的面积计算
利用公式计算圆的面积程序 radius = 25 # 设置圆的面积 area = 3.1415926 * radius * radius # 输入计算公式 print(area) # 输出计算值 pr ...