一、HTTP协议
HTTP(超文本传输协议):HTTP协议定义了浏览器(万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。
HTTP协议是无状态的。
用户浏览页面方法:
1.输入URL
2.点击超链接
看一个示例(书上的),便于我们理解万维网的具体工作流程(··):
假如用户点击了一个超链接指向“清华大学院系设置”的页面,URL为(http://www.tsinghua.edu.cn/yxsz/index.html),那在点击之后究竟经历了哪些步骤?
1.浏览器分析链接指向页面的URL
2.浏览器向DNS请求解析www.tsinghua.edu.cn的IP地址,域名转换IP地址
3.域名系统DNS解析出清华大学服务器的IP地址为166.111.4.100
4.浏览器与服务器建立TCP连接(在服务器端IP地址是166.111.4.100,端口是80)
5.浏览器发出取文件命令:GET/chn/yxsz/index.html
6.服务器www.tsinghua.edu.cn给出响应,把文件index.html发送给浏览器
7.释放TCP连接
8.浏览器显示“清华大学院系设置“文件index.html的内容
HTTP使用了面向连接的TCP作为运输层协议,保证了数据的可靠传输。HTTP不必考虑数据在传输过程中被丢弃后又怎样被重传。因为HTTP是无状态的,所以HTTP不要求服务器保留客户的任何状态信息。则同一个用户上一次对服务器的访问不会影响其对该服务器的下一次访问结果,所以cookie就诞生了。
Cookie是由服务器端生成,发送给User-Agent,浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器。这个之后与session和token放在一起聊。
二、HTTP/1.0和HTTP/1.1
1.非持续连接
HTTP/1.0协议采用非持续连接方式,即一次请求/响应对应一个TCP连接。如果想要再次请求某个资源,就必须重新建立连接,即再进行三次握手。可以看出,请求一个万维网文档所需的时间是该文档的传输时间(与文档大小成正比)加上两倍往返时间RTT(一个RTT用于TCP连接,另一个RTT用于请求和接收万维网文档)。当RTT值较大时,请求一个较小的文档的开销就相对较大。不懂三次握手的同学可以看我上个文章TCP三次握手和四次挥手
HTTP/1.0的主要缺点就是没请求一个文档就要有两倍的RTT的开销。每次建立新的TCP连接都要分配缓存和变量,并出示化各种状态,在关闭连接时又要释放各种资源,特别时万维网服务器往往要同时服务于大量客户请求,这样会使万维网服务器的负担很重。
2.持续连接
HTTP/1.1协议使用持续连接,持续连接其实就是对非持续连接的改进,在发送响应后仍然保持这条连接,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文。不局限于一个页面上的对象,而是在同一个服务器上的文档都可。
图上所示为非流水线。
为了提高效率,HTTP/1.1协议的持续连接使用了流水线方式工作,即浏览器在收到HTTP的响应报文之前就可连续发送多个请求报文。当请求报文到达服务器后,服务器就回复一个接一个的响应报文(对比HTTP/1.0就节省了很多隔RTT时间)。流水线工作方式使TCP连接中的空闲时间减少,提高下载文档的效率。
三、HTTP的报文格式
HTTP有两类报文:
(1) 请求报文-----从客户端向服务器发送请求报文
(2)响应报文-----从服务器到客户的回答
由于HTTP是面向文本的,因此在报文中的每一个字段都是一些ASCLL码串,因此每个字段的的长度都是不确定的。
HTTP请求报文和响应报文都是由三个部分组成。区别就是开始行不同。
(1)请求行/状态行,用于区分是请求报文还是响应报文。在请求报文的第一行是请求行(Request-Line),而在响应报文中的第一行是状态行(Status-Line).最后的”CRLF“代表回车换行
(2)首部行,用来说明浏览器、服务器或报文主体的一些信息。首部可以有好几行,也可以不使用,在每一个首部行中都有首部字段名和它的值,在每一行在结束的地方都要有”CRLF",整个首部行结束后,还有一个"CRLF"标志首部行的结束,实体主体的开始
(3)实体主体(Entity Body),在请求报文中一般不用这个字段,而在响应报文中通常就是返回给客户的文档,也可能没有这个字段。
1.HTTP请求报文一些常见的方法
方法(操作) | 意义 |
---|---|
OPTION | 请求一些选项的信息 |
GET | 请求URL标志的文档 |
HEAD | 请求URL标志文档的首部 |
POST | 向服务器发送数据 |
PUT | 向指明的URL下存储一个文档 |
DELETE | 删除URL所标志的文档 |
TRACE | 用来进行环回测试的请求报文 |
CONNECT | 用于代理服务器 |
2.响应报文
状态行包括三项内容。即HTTP的版本,状态码,以及解释状态码的简单短语。
**状态码(Status-Code)**都是三位数字的,分为5大类共33种。
状态码 | 意义 | 常见 |
---|---|---|
1xx | 表示通知信息的,如接受收到了或正在处理 | |
2xx | 表示成功,如接受或知道了 | 200(成功) |
3xx | 表示重定向,表示要完成请求还需采取进一步行动 | **301 Moved Permanently:**永久性重定向,表示请求的资源被分配了新的URL,之后应使用更改的URL **302 Found:**临时性重定向,表示请求的资源被分配了新的URL,希望本次访问使用新的URL 301与302的区别:前者是永久移动,后者是临时移动(之后可能还会更改URL) |
4xx | 表示客户差错,如请求中有错误的语法或不能完成 | 400(错误请求)404 Not Found(表示服务器上无法找到请求的资源,除此之外,也可以在服务器拒绝请求但不想给拒绝原因时使用) |
5xx | 表示服务器的差错,如服务器失效无法完成请求 | 500(表示服务器在执行请求时发生了错误,也有可能是web应用存在的bug或某些临时的错误时)503(表示服务器暂时处于超负载或正在进行停机维护,无法处理请求) |
3.存在哪些安全隐患
HTTP协议的实现本身非常简单,无论是谁发送过来的请求都会响应,因此不确认通信方,会存在一下各种隐患:
- 无法确定请求发送至目标的Web服务器是否按真是意图返回响应的那台服务器,有可能是伪装的Web服务器
- 无法确定响应返回到的客户端是否按真实意图接受响应的那个客户端。有可能是已伪装的客户端
- 无法确定正在通信的对方是否具备访问权限。因为某些Web服务器上保存着重要的信息,只想发给特定用户通信的权限
- 无法判定请求是来自哪里,谁发送的请求
- 即使是无意义的请求也会照单全收。无法阻止海量请求下的DoS攻击(Denial of Service,拒绝服务攻击)
上篇文章中提到的TCP SYN泛洪攻击就是DoS攻击的一种。
HTTPS协议:HTTP是明文传输,HTTPS是加密安全的,需要知道HTTPS是如何加密的、数字证书如何形成。啥是对称加密、非对称加密