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 ...
随机推荐
- 《流畅的python》— 列表推导与生成器表达式
列表推导是构建列表(list)的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列.如果你的代码里并不经常使用它们,那么很可能你错过了许多写出可读性更好且更高效的代码的机会. 很多Python ...
- 一台服务器上部署 Redis 伪集群
哈喽大家好,我是咸鱼 今天这篇文章介绍如何在一台服务器(以 CentOS 7.9 为例)上通过 redis-trib.rb 工具搭建 Redis cluster (三主三从) redis-trib.r ...
- Nomad 系列-安装
系列文章 Nomad 系列文章 Nomad 简介 开新坑!近期算是把自己的家庭实验室环境初步搞好了,终于可以开始进入正题研究了. 首先开始的是 HashiCorp Nomad 系列,欢迎阅读. 关于 ...
- 如何正确实现一个自定义Exception(二)
上一篇<如何正确实现一个自定义 Exception>发布后获得不少 star.有同学表示很担忧,原来自己这么多年一直写错了.其实大家不用过分纠结,如果写的是 .NET CORE 1.0+ ...
- 使用docker搭建seafile服务器
工作需要在单位和家里的不同电脑上同步指定文件夹及其内容.对比了一些解决方案,最终还是选择熟悉的seafile来做. 需要按照官方文档进行seafile的安装,选择官方推荐的docker方式快速部署. ...
- python爬虫——爬虫伪装和反“反爬”
前言爬虫伪装和反"反爬"是在爬虫领域中非常重要的话题.伪装可以让你的爬虫看起来更像普通的浏览器或者应用程序,从而减少被服务器封禁的风险:反"反爬"则是应对服务器 ...
- Machine Learning for NetFlow Anomaly Detection With Human-Readable Annotations 笔记
Machine Learning for NetFlow Anomaly Detection With Human-Readable Annotations 关键摘要 我们开发了一个复杂企业网络中的异 ...
- 深入理解 Socket 编程:网络通信的基石
深入理解 Socket 编程:网络通信的基石 引言 在现代计算机网络中,网络通信是各种应用程序之间进行数据交换和信息传输的基础.Socket 编程是实现网络通信的关键组件之一,它提供了一种方便而强大的 ...
- 前端web页面支持MQTT消息推送
MQTT服务一般用直接下载mosquitto,安装后启动服务即可.方便可靠. 但是默认情况下只开通了1883的tcp访问,用html的web页面上调用就不行了. 其实mosquitto是支持多端口的, ...
- C# ref, in, out关键字
写在前面:大内老A的这篇"老生常谈:值类型VS引用类型"放在微信收藏里好几个月了,终于趁着要讲JAVA传参机制的时候仔细地按照这篇博客,自己写代码跑一下,对C#的传参,ref,in ...