HTTP是什么
HTTP是HyperText Transfer Protocol的缩写,中文就是超文本传输协议,所谓的超,是个学术用语,是基于某种事物增加了更多的信息维度,比如超像素xxx之类的.
协议是什么,协议说白了就是约定,约定就是模板,就是表格,就和你去银行办手续一样,客户不知道要提供什么信息,银行又不能一个客户一个客户教,所以就准备一样表格.
HTTP的脑洞(无事实根据)
为什么会有HTTP叫做报文呢,因为我觉得以前最早大家都是通过电报机来远程快速传递信息.由于每个字都老贵了,所以能简短就简短.就有了报文这个东西,一般包含以下信息
- 发件人
- 收件人
- 干什么
所以说到了现在都超文本这么吊的东西了,说白了还是和电报一样,滴滴滴,你发给服务器一个电报,服务器看看,然后滴滴滴,回给你一个电报.这就是所谓的超文本传输协议.
但是吊就吊在这个超字上,现在电脑便宜了,大街上一百块一台,所以说可以发更多的信息了,所谓更多的信息,就是除了文本本身的内容外,还可以携带一些网络参数以及约定的信息等,是指的信息维度的增加(除去内容还有其它维度),而不是文本内容变长了.
所以说HTTP通信,本质上和以前的电报还是没有什么区别的,唉,人类真是聪明又愚蠢啊.
HTTP报文格式
就像刚刚说的,一张白纸,怎么写才能让两边指导什么写的是什么呢?就牵扯到格式了,这种格式约定就是协议.HTTP其实就是一张这样的表单
HTTP报文头
就如同刚刚脑洞中以电报举例一样,HTTP的报头主要是一些参数信息,类似于
- 发件人
- 收件人
并不包含实际文本内容
HTTP报文头首行有3个数据,来分辨这个是Request报文还是Response报文,接下来每行是一个字段和一个内容,这些字段都是W3C规定好的,你当然可以自定义,但是只不过通用标准不认罢了.所以说字段相当于表格中
姓名: some SB
里的姓名,”some SB”这个内容可能会变,但是不管怎么发报文,姓名这一栏不会变.
HTTP报文体
HTTP报文体是开始于HTTP报文头遇到一个仅有换行的空行开始,这也是为什么会有CRLF换行符注入这种攻击,因为报文都是通过换行符来判断哪里是内容开始,报文头结束.可以通过换行符的注入,当报文头提前结束,进入报文体.
HTTP的Request和Response
就像刚刚说的一样,虽然HTTP都是基于报文,但是你发给服务器的电报和服务器返回给你的电报是不同的,他们的主要区别在于两点
- 报文头的字段
- 报文体是否可以省略
在Request中报文体并不是必须的,有些Request方法中可以省略,而Response中是不可以省略的,如果报文体因为各种情况没有了,那么就是空返回.
HTTP报文头的字段
通用字段
- Connection
- Content-Encoding
- Content-Length
- Content-Type
- Transfer-Encoding
请求Request字段
- Accept
- Accept-Encoding
- Authorization
- Cookie
- Host
- If-Modified-Since
- If-None-Match
- Origin
- Referer
- User-Agent
响应Response字段
- Access-Control-Allow-Origin
- Cache-Control
- ETag
- Expires
- Location
- Pragma
- Server
- Set-Cookie
- WWW-Authenticate
- X-Frame-Options
HTTP的Request方法
HTTP一共有六种Request方法,其中最重要的是GET和POST方法,除了这两个外还有剩下四种,但是不太常用.
- HEAD
- TRACE
- OPTIONS
- PUT
虽然不太常用,并不是不用注意
比如有根据TRACE的机制进行攻击的方法.TRACE方法主要用于诊断,服务器会返回Request里所有的报文头诶报文内容信息,所以在某下情况下,如果本地无法获取到Request的报文头,可以通过伪造链接,使用TRACE方法从返回报文里都出来Request中的信息.