HTTP那些事

来源:互联网 时间:2017-01-21


前言

很久没碰网络这部分,所以一直感觉很生疏,最近买了本《图解HTTP》,花了几天时间看完了。通俗易懂,读起来非常快。读完后将一些比较重要的HTTP知识整理记录一下。本文将很多地方省略了,并不是因为其不重要。其中主要有两类,其一省略了基础记忆性的知识,比如报文首部字段的解释等;其二省略了一些东西的深入详解,比如HTTPS怎样从多方面保证安全性等,因为这些要解释清楚的话得花大量篇幅,而且要画很多图进行图解。时间有限,写得比较简单。什么时候想深入复习了,再翻翻书就行了。再次推荐《图解HTTP》,看完应该对HTTP会了解得差不多,如果想深入学习那就再买《HTTP权威指南》,这本买了,块头太大,暂时搁置。


HTTP是什么?

HTTP(HyperText Transfer Protocol,超文本传输协议)。它是用于客户端和服务器之间通信的协议。
所谓协议,就是为达成某种目的而建立的约定。我们把互联网相关的各类协议族总称为TCP/IP。我们先来了解一下协议族。


——TCP/IP的分层管理——

TCP/IP协议族按层次分为4层:应用层、传输层、网络层、数据链路层。
协议族为什么要分层?可以说它和代码里的解耦思想是类似的。(从广义上来讲,人类社会生活中的社会分工行为也有解耦、提高效率的等作用...)
应用层:应用层决定了向用户提供应用服务时通信的活动。FTP(File Transfer Protocol,文件传输协议)和DNS(Domain Name System,域名系统),及HTTP协议均属于应用层协议。
传输层:传输层提供处于网络连接中的两台计算机之间的数据传输。在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。
网络层:数据包在网络中从一台计算机到达目的计算机要转经多台计算机或者网络设备。而网络层的作用就是选择规划出一条传输路线。
数据链路层:用来处理连接网络的硬件部分。


DNS:域名解析系统,顾名思义,它提供域名到IP地址之间的解析服务。人习惯使用具有语义域名来访问某台计算机,但计算机作为极其更擅长处理数字形式的IP地址来指代计算机,因此在它们两者之间必须存在转换工作,这边是域名系统DNS干的事。
TCP:TCP位于传输层,提供可靠地字节流服务,“字节流服务”指为传输方便,它将大块数据分割为多个数据包进行管理。“可靠的”指为了确认数据是否最终送到对方而采用了着名的三次握手策略。


我们了解了协议族的知识后,现在我们来梳理一下一个普通的通信过程:
首先客户端想访问服务器的某个资源,比如说http://hackr.jp/xss/Web页面,要想访问服务器,计算机擅长处理的是IP地址,所以要先在应用层启动DNS服务,把域名hackr.jp转换为IP地址20x.189.105.112。紧接着,根绝HTTP协议,针对客户端的要求,生成HTTP请求报文;然后建立TCP连接,将请求报文分割成报文段分别可靠地传输给对方;而在传往服务器的历程里,转经多台计算机,一边中转一边传送,直到服务器。 到达服务器后进行和客户端发出数据时相逆的动作。


HTTP报文的结构

关于HTTP的报文结构,只要清楚它的大概结构,理解它的原理性的东西就行了。一些字句的解释这些都是需要记忆的基础知识,网上有很多资料可查,在此不赘述了。需要时上网查阅,或者翻阅翻阅书籍就行了。


除了需要掌握HTTP报文的大体结构外,也去区分几种常见请求方法(GET/POST/HEAD/PUT/DELETE等)。还要清楚在响应报文中一些状态码代表的含义(2xx:成功、3xx:重新向、4xx:客户端问题、5xx:服务器端问题)。另外,还要清楚一些报文首部字段的含义,有些很重要,决定了该HTTP请求的功能性质。


几个比较重要的问题

———— HTTP是不保存状态的协议————
HTTP协议是“无状态协议”,即不保存状态的协议,它是无记忆的,每次请求和响应后都是不保留信息的。但在实际应用中,保存用户状态却又是实实在在存在的需求,所以我们引进了Cookie技术用于保存用户信息,保持状态。
Cookie会根据从服务器发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端在往该服务器发送请求时客户端会自动在请求报文中加入Cookie值后发送出去。服务器发现客户端发送过来的Cookie值后,回去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,得到其状态信息。


———— 持久连接,节省通信量————
在HTTP的初始版本里,每进行一次HTTP通信就要断开一次TCP连接。这在以文本传输为主的当年,是没问题的。但是现在资源类型越来繁多。当要加载一个复杂Web时,既有文档又有图片,那得是多个请求,即多个HTTP通信。若进行一次HTTP通信便断开一次TCP连接的话,那加载一个如此Web,得多次断开多次重连TCP,给服务器造成了不必要的巨大开销。所以就有了“持久连接”,只要没有一端明确提出要断开连接,则保持TCP连接状态。HTTP/1.1默认是持久连接。


———— 管线化 ————
一般来说,客户端发送请求后需等待收到响应后,才能发送下一个请求。管线化技术就是使客户端不用等待响应亦可直接发送下一个请求。这样就能做到同时并行发送多个请求,而不需要一个接一个地等待响应了。


———— HTTP的缺点,及HTTPS的出现————
HTTP十分优秀,但也有不足的一面,例举如下:


(1)通信使用明文(不加密),内容可能会被窃听。
(2)不验证通信方的身份,因此有可能遭遇伪装。
(3)无法证明报文的完整性,所以有可能已遭篡改。

为了防止被窃听,我们需要使用加密技术。方案1是对通信加密,建立安全的通信线路,进行安全的通信。HTTP本身没有加密机制,可以通过和SSLTLS组合使用来完成安全通信。方案2是对协议传输的内容本身进行加密,客户端将请求报文加密后再发送,服务器收到请求后先对报文进行解密,再进行处理。


HTTP协议中的请求和响应不会对通信方进行确认。也就是说存在“服务器是否就是发送请求中URI真正指定的主机,返回的响应是否真的返回到实际提出请求的客户端”等类似问题。有可能客户端的请求到达的是伪装的服务器,也有可能从服务器返回的响应返回给了伪装的客户端。并且除此外,即使是无意义的请求也会赵丹全收,无法阻止海量请求下的Dos攻击。此时,我们使用了“证书”来解决此问题。SSL不仅提供加密处理,还有证书机制。该“证书”有可靠的第三方认证机制颁发,用以证明客户端和服务器实际存在的问题。客户端请求服务器前先确认服务器的证书,判断该服务器是否是正确的服务器。同时,客户端持有证书,用于完成其身份的确认。


HTTP无法证明通信的报文完整性,它无法保证在客户端发出请求时的报文和服务器接收到的报文是否一致,是否在中途被篡改(中间人攻击)。若真的已被篡改,另一端是感受不到的。


HTTPS的必要性:

正是因为HTTP存在以上不足,所以诞生了更完美的通信协议HTTPS。HTTPS是身披SSL外壳的HTTP。总之,HTTPS更安全。


HTTPS = HTTP + 通信加密 + 证书 + 完整性保护


更多详情:HTTPS与SSL(一)




相关阅读:
Top