HTTP 协议简介
Page 1
E2HyperText TraTsfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。HTTP的发展是由蒂姆·伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起。HTTP的标准制定由万维网协会(World Wide Web Consortium,W3C)和互联网工程任务组(Internet Engineering Task Force,IETF)进行协调,最终发布了一系列的RFC,其中最著名的是1999年6月公布的 RFC 2616,F0mlth.616HTTP2cfr/atarr14年12月,互联网工程任务组(Ien超文本传输协议(英文:)的Hypertext Transfer Protocol Bis(httpbis)工作小组将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。 HTTP/2标准于2015年5月以RFC 7540正式发表,取代HTTP 1.1成为HTTP的实现标准。-enRFC文档ihttps://www.rfc-editor.org/rfc/inl 协议简介 1H。.1TTP 协议中现今广泛使用的一个版本——PTTH定义了
Page 2
HTTPRFC图解⽂档的定义请求格式
Page 3
HTTP请求格式
Page 4
HTTPRFC图解⽂档定义响应格式
Page 5
HTTP响应格式
Page 6
HTTP URI
Page 7
w/Hostttp:可以部署多个h/wwww./index.htmltest2http://w.Host.test1.comco有些代理不接受⾃定义的mHTTP HeadersWEB站,根据请求头域说明了正在请求资源的⽹络主机和端⼝号,同⼀台服务器服务器收到了这两个请求,会根据oHst这个⾸⻚,在浏览器访问如下两个地址Host定位到正确的资源的资源,⽐如⼀台deraHestiltmh/iHndex.sto/ ndex.html Ho BWEstHo服务器部署了两个⽹站,都有字段来区分是请求哪个⽹是是tecoww..cost2mwwww.test1m.
Page 8
ded-ForX-Forwarded-For格式如下:]X-Forwarded-For: client,”proxy1, proxy2R可以看到,XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP。D如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息:DX-Forwarded-For: IP0, IP1,AIP2Proxy3 直连服务器,它会给 ETOMER[“REV X-ForwarRES$ 是 php 的方式不一样,例如 sserddA etmoeR Remote Address 字段获得。我们知道 HTTP 连接基于 TCP 连接,HTTP 协议中没有 IP 的概念,Remote Address 来自 TCP 连接,表示与服务端建立 TCPHTTP Headers连接的设备 IP,在这个例子里就是 IP3。同语言获取Remote Address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求。不 X-aForwdred – 可以在服务端通过yxorP 2,表示它是在帮I 追加 r转发请求。列表中并没有 PIP3,IP3 o2F
Page 9
节E表单.1表单是HTTP协议中最常用的类型1重点是urlencodedP/英文:T编码为%{字符的16进制}T需要编码的Ascii字符集如下(实现方式不一样,有的在百度上可能不编码,比如!) H空格!#$%&’()*+,/:=?@[]\V比如空格的Ascii是20(1Contet-T进制)会被编码为%207非英文:%8对字符串进行编码,此时就会用到charset,表示我传输的字符是什么编码的,这样服务器才会根据这个charset进行解码,才不会有乱码6比如两个字,utf8编码的字6ype0个字节 0x是4,0xB8,0xAD,0xE6,0x96,六x87,所以经过urlencode之后的字符串是%9%E4%B8%AD%E6%96%87%AD%E6比如请求8http://beta.py.fqparty.com/user/leaveMic?中文k=中文V%B消息的请求行如下:=%E4GET /user/leaveMic?%E4%B8%AD%E6%96%87k application/x-www-form-urlencoded
Page 10
O目Contet-TTN前常用的还有JSON那就需要使用可以如果要传输JS表单ypeS带body的请求方法,比如PO application/json
Page 11
Contet-Length / Transfer-EncodingContent-Length: 标识包体的长度Transfer-Encoding: 标识包体的传输方式,在传输大文件和不确定数据长度时很有用,比如下载一个1G的小电影,服务器收到请求后不可能New出1G的内存然后读1G的数据,然后发给客户端,Content-Length虽然也能实现但是在发送时需要先知道文件的大小,带到Content-Length这个Header里,chunk是一块一块的发,发完之后最后一块长度写0

Page 12
F编码TTP是文本传输协议,虽然是文本传输协议,但是基于TCP协议的,最终所有传输的数据F是二进制服务器收到的请求都是二进制数据,所以需要把二进制转换成字符串,字符串就会有编码,比如utf8 gbk gb2312等,目前应用最广的是utf8,具体的编码方式大家自行百度会有各种语言,就会涉及到编码,下面是中文两个字的各种编码后在内存存储的字节utf8: [E4,B8,AD,E6,96,87]gbk: [D6,D0,CE,C4]了gb2312: [D6,D0,CE,C4]问题unicode [4E2D,6587] unicode是每2个字节存储一个字符统一编码就没有时服务器交互utf16 [FF,FE,2D,4E,87,65] # 这个是python转出来的,带两个字节F,H都E的所谓的BOM,utf32中的FF字符串编码FE,00,00也是一样的,utf8的BOM是EF,BB,BF三个字节,带BOM一般是给编辑器用的跟utf32 [FF,FE,00,00,2D,4E,00,00,87,65,00,00]户端从上面的编码和字节的对应关系能看出为什么会出现乱码,比如客户端发的utf8编码,服务器按照gbk去解析,那gbk每2个字节解析为一个字符那就会当成三个字符,而系统又不认识,所以就会出现乱码保证客如何避免乱码:要,只有在输入输出时才有意义,某些语言内部的实现是统一格式的,java的String在内部是unicode存储的,只有在输入,输出时才会指定编码,所以只
Page 13
H文代理一下几个原则安全1.IDE编码设置为u总结f8可以看到,不2.前后端统一编码utf8都3.数据库统一编码utf8T4.t保持尽量P请求时禁止自己拼接参数明5.T不要自定义Header,有些代理不支持,另外Header是








oplrpppfhrtmozhzyiplhmodsqgvsm
BxQzMyngsViyXJoUVE