http协议基础
http协议定义了浏览器(即万维网客户程序)怎样向万维网服务器请求万维网文档以及服务器怎样把文档传送给服务器。从层次的角度上看,http是面向事务的应用层协议。
1. http报文的传送
http使用了面向连接的tcp作为运输层协议,保证了数据的可靠传输。http不比考虑数据在传输过程中被丢弃后又怎样重传。
http协议本身是无连接的,指的是虽然http使用了tcp连接,但通信双方在交换http报文之前不需要建立http连接。
http协议是无状态的(stateless),指的是同一个客户第二次访问同一个服务器上的页面时,服务器不记得访问过的这个客户,服务器的响应时间与第一次访问时相同。
连接过程:http协议首先要和服务器建立tcp连接,当三次握手的前两部分完成后,万维网客户就把http请求报文作为三次握手的第三个报文的数据发送给服务器。服务器收到http请求报文后,就把请求的文档作为响应报文返回给客户。
http/1.0协议里,每请求一个文档就要有两倍RTT(往返时间)的开销,所以这种非持续连接会使万维网服务器负担很重。而在http/1.1协议中,使用了持续连接,也就是服务器在发送响应后仍然在一段时间内保持这条连接,使同一个客户和该服务器可以继续在这条连接上传送后续的http请求报文和响应报文。
持续连接有两种工作方式,即非流水线方式和流水线方式
非流水线方式:客户在收到一个响应后才能发出下一个请求
流水线方式:客户在收到http响应报文之前就能够接着发送新的请求报文
代理服务器:代理服务器是一种网络实体,又称为万维网高速缓存。代理服务器吧最近的一些请求和响应暂存在本地磁盘中。当新请求到达时,若代理服务器发现这个请求与暂放的请求相同,就返回暂存的响应,而不需要按url的地址再去访问该资源。代理服务器可在客户端或服务器端工作,也可在中间系统工作。(burpsuite工具就是作为一个本地的代理,所有经过burpsuite访问Web的请求都会被拦截到)
2.http报文
http是面向文本的(还有二进制的…),因此在报文中的每一个字段都是一些ascii码串,因为各个字段的长度是不确定的。
注:CRLF都是必需的,“CR”和“LF”分别代表“回车”和“换行”
常见方法:
GET和POST方法区别
最直观的来说,GET把参数包含在URL中,POST通过request body传递参数。
“标准答案”:
-
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST么有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
GET和POST还有一个重大区别(没有测试过,网上看到的,暂时先写下来):
GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
GET:使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。通过GET方式传递的数据直接放在在地址中,所以GET方式的请求一般不包含”请求内容”部分,请求数据以地址的形式表现在请求行。地址中”?”之后的部分就是通过GET发送的请求数据,各个数据之间用”&”符号隔开。显然这种方式不适合传送私密数据。另外,由于不同的浏览器对地址的字符限制也有所不同,一般最多只能识别1024个字符,所以如果需要传送大量数据的时候,也不适合使用GET方式。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
POST:允许客户端给服务器提供信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中。POST方式请求行中不包含数据字符串,这些数据保存在“实体主体”部分,各数据之间也是使用”&“符号隔开。POST方式大多用于页面的表单中。因为POST也能完成GET的功能,因此多数人在设计表单的时候一律都使用POST方式,其实这是一个误区。GET方式也有自己的特点和优势,我们应该根据不同的情况来选择是使用GET还是使用POST。
状态码:
- 1xx表示通知信息,如请求收到了或正在进行处理
- 2xx表示成功,如接受或知道了
- 3xx表示重定向
- 4xx表示客户端的错误
- 5xx表示服务器的错误
3.Cookie
因为http是无状态的,但是一些万维网站点有事需要识别用户。可以使用Cookie来跟踪用户,Cookieb表示http服务器和客户之间传递的状态信息。Cookie只是一个小小的文本文件,不是计算机的可执行程序。
工作原理:
当用户浏览某个使用Cookie的网站是,该网站的服务器就为该用户产生一个唯一的识别码,并以此为索引在服务器的后端数据库中产生一个项目,接着再给给用户的响应报文中添加一个叫做Set-cookie的首部行。首部字段名就是Set-cookie,后面的值就是该用户的识别码。如:Set-cookie:1234567
当该用户收到这个响应时,其浏览器就在它管理的特定Cookie文件中添加一行,其中包括这个服务器的主机名和Set-cookie后面给出的识别码。当用户继续访问这个网站时,没发送一个http请求报文,浏览器就会从其Cookie文件中取出这个网站的识别码,并放到http请求报文的Cookie首部行中:Cookie:1234567
4.危险首部行参数
- User-Agent:中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。一些网站常常通过判断 UA 来给不同的操作系统、不同的浏览器发送不同的页面,因此可能造成某些页面无法在某个浏览器中正常显示,但通过伪装 UA 可以绕过检测。
- X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。格式为:X-Forwarded-For: client1, proxy1, proxy2。XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP。
- Referrer:网站来路。HTTP Referer是header的一部分,当浏览器向web服务器发出请求的时候,一般会带上Referer,告诉服务器用户从那个页面连接过来的,服务器由此可以获得一些信息用语处理。