参考文章:
HTTP & HTTPS网络协议重点总结(基于SSL/TLS的握手、TCP/IP协议基础、加密学)
一篇比较全的HTTP协议详解
记:千万别误会,本章是完全ctrl+c然后ctrl+v,知识理解才是最重要,不必要在意细节~~~
一、http协议
1、HTTP概念
协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从web服务器传送到客户端的浏览器。
HTTP协议,即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
在Internet中所有的传输都是通过TCP/IP进行的。HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。
HTTP默认的端口号为80,HTTPS的端口号为443。
浏览网页是HTTP的主要应用,但是这并不代表HTTP就只能应用于网页的浏览。HTTP是一种协议,只要通信的双方都遵守这个协议,HTTP就能有用武之地。比如咱们常用的QQ,迅雷这些软件,都会使用HTTP协议(还包括其他的协议)。
2、简史
它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC,RFC 1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1。
3、特点
HTTP协议永远都是客户端发起请求,服务器回送响应。这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。
HTTP协议的主要特点可概括如下:
1、支持客户/服务器模式。支持基本认证和安全认证。
2、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4、HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。HTTP 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象,采用这种方式可以节省传输时间。
5、无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
无状态协议:
协议的状态是指下一次传输可以“记住”这次传输信息的能力。
http是不会为了下一次连接而维护这次连接所传输的信息,为了保证服务器内存。
比如客户获得一张网页之后关闭浏览器,然后再一次启动浏览器,再登陆该网站,但是服务器并不知道客户关闭了一次浏览器。
由于Web服务器要面对很多浏览器的并发访问,为了提高Web服务器对并发访问的处理能力,在设计HTTP协议时规定Web服务器发送HTTP应答报文和文档时,不保存发出请求的Web浏览器进程的任何状态信息。这有可能出现一个浏览器在短短几秒之内两次访问同一对象时,服务器进程不会因为已经给它发过应答报文而不接受第二期服务请求。由于Web服务器不保存发送请求的Web浏览器进程的任何信息,因此HTTP协议属于无状态协议(Stateless Protocol)。
HTTP协议是无状态的和Connection: keep-alive的区别:
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。
HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。
从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
4、工作流程
一次HTTP操作称为一个事务,其工作过程可分为四步:
1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。
2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。
HTTP是基于传输层的TCP协议,而TCP是一个端到端的面向连接的协议。所谓的端到端可以理解为进程到进程之间的通信。所以HTTP在开始传输之前,首先需要建立TCP连接,而TCP连接的过程需要所谓的“三次握手”。下图所示TCP连接的三次握手。
在TCP三次握手之后,建立了TCP连接,此时HTTP就可以进行传输了。一个重要的概念是面向连接,既HTTP在传输完成之间并不断开TCP连接。在HTTP1.1中(通过Connection头设置)这是默认行为。
5、使用Wireshark抓TCP、http包
本章参考使用wireshark分析TCP ——以HTTP协议为例
(1)TCP三次握手
如图所示,在访问http://lib.njupt.edu.cn/地址(首先打开wireshark,点击开始,然后请求),前三个是TCP请求(三次握手),然后才是请求真正的HTTP请求。
第一次握手:客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接
第二次握手:服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1, 如下图
第三次握手:客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方
在进过三次握手后和服务器建立了TCP连接,随后浏览器发出了取文件命令GET。
TCP的四次挥手
四次挥手(Four-Way Wavehand)即终止TCP连接,如下图所示(局部截图,可自行查看)
(2)传输层数据分析
我们在这里随便指定一个进行分析(链路层图片)
对应的网络层图片
如上图链路层包含以太网首部,包含IP首部,包含TCP首部,包含HTTP数据
1.以太网首部(以太网MAC帧):点击Ethernet II,下面涉及到该模块的16进制数据会自动显示绿色背景
该模块包含:(这里注意,是以太网首部信息)
目的地址为:3c:95:09:77:f1:45,源地址为:ec:26:ca:bc:fe:32,类型为:0x0800(即IPv4),后面是数据(IP数据报)
2.IP首部(IP数据报):Internet Protocol Version 4,主要包含的源地址和目标地址
对照下图我们罗列一下我们的数据
版本:0100 … = Version: 4;首部长度:… 0101 = Header Length: 20 bytes (5);区分服务:Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT);总长度:Total Length: 656;标识:Identification: 0xfcde (64734);标志:Flags: 0x0000;片偏移:Fragment offset: 0;生存时间:Time to live: 41;协议:Protocol: TCP (6);首部检验和:Header checksum: 0x2521 [validation disabled];源地址:Source: 202.119.224.202;目的地址:Destination: 192.168.1.126。
3.TCP首部(TCP报文):
对照如下TCP报文格式:可以罗列我们的数据:
源端口:Source Port: 80;目的端口:Destination Port: 56169;序号:Sequence number: 11521 (relative sequence number);确认号:Acknowledgment number (raw): 2711128534;数据偏移:0101 … = Header Length: 20 bytes (5);保留:000000;URG:0;ACK:1;PSH:1;RST:0;SYN:0;FIN:1;窗口:Window size value: 123;检验和:Checksum: 0xbf35 [unverified];紧急指针:Urgent pointer: 0。
4.http数据:(Hypertext Transfer Protocol 超文本传输协议),如下图所示,这里面显示的是一系列的协议内容,如Content-Lenth,Content-Type等,后面我们会详细说到
6.报文信息(Hypertext Transfer Protocal 超文本传输协议)
(1)HTTP请求报文和响应报文
HTTP请求报文主要由请求行、请求头、空行、请求正文(GET方式无请求正文)4部分组成。</font
请求行:由请求方法、URL和协议版本3部分组成。
请求头:为请求报文添加一些信息,由“名/值”组成。
空行:请求头的最后会有一个空行,代表请求头部结束,接下来为请求正文。此部分不可少。
请求正文
HTTP响应报文主要由状态行、响应头、空行、响应正文4部分组成。
状态行:由状态码、状态码描述和协议版本3部分组成。
响应头:为响应报文添加一些信息,由“名/值”组成。
空行:头的最后会有一个空行,代表响应头部结束,接下来为响应正文。此部分不可少。
响应正文
(2) Http的请求方式总结
HEAD、GET、OPTIONS和TRACE是安全的方法,因为它们只从服务器获得资源而不对服务器做任何修改,但是前三个在用户端不安全,POST相对安全,但POST会影响服务器的资源。TRACE方法对于服务端盒用户端一定是安全的。
(3) 请求头信息
(4) 响应头信息
(5) 状态码信息
较常用状态码
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
(6)Http请求方式Get和Post的区别
安全幂等性质
GET一般用于获取或者查询资源信息,这就意味着它是幂等的(对同一个URL的多次请求返回同样的结果)和安全的(没有修改资源的状态)
POST一般用于更新资源信息,既不是安全,也非幂等。
参数存放位置
GET方法中,客户端把要发送的数据添加到URL后面(即把数据放到HTTP协议头中,GET是通过URL请求数据的),使用“?”连接,参数之间使用“&”连接。注意:HTTP协议中并没有对URL长度进行限制,但是浏览器和服务器会对其限制!(面试中经常会问到URL长度限制问题,一定要明白协议中并未对此规定!)
POST是将需要传递的数据放到HTTP请求报文的消息体中(同样,协议未对此部分大小进行限制),不过传送的数据量比GET更大且安全性更高(若不对数据进行加密,可使用抓包软件进行获取)。
浏览器缓存
GET请求的数据会被浏览器缓存起来,留下历史记录。
POST提交的数据不会
7.为什么HTTP是无状态的?如何保持状态?
HTTP无状态:是指协议对于事务处理没有记忆能力,不能保存每次客户端提交的信息,即当服务器返回应答后,此次事务的所有消息会被丢掉。即使客户端发来一个新的相同的请求,服务器无法知道它是否与上次请求有联系。
举个例子:一个包含多个图片的网页浏览步骤:
建立连接,客户端发送一个网页请求,服务端返回一个HTML页面(一个纯文本页面),关闭连接。
浏览器解析HTML文件,遇到图片标记得到URL,此时客户端和服务器再建立连接,客户端发送一个图片请求,服务器返回图片应答,关闭连接。(涉及到无状态定义,对于服务器而言,即使是同一个客户端请求,无记忆能力无法识别)
优缺点
优点:服务器不用为每个客户端连接分配内存来记忆大量状态,也不用在客户端失去连接时去清除内存,节省服务器端资源。
缺点: 如果后续处理需要前面的信息,客户端必须重传,可能导致每次连接传送的数据量增大。
解决办法
针对这些问题,可以采用会话跟踪技术,即把状态保存在服务器,只发送回一个标识符,浏览器在下次提交中把这个标识符发送过来,这样可以定位存储在服务器上的状态信息。技术有以下:
1.COOKIE
2.SESSION
3.URL重写
4.作为隐藏域嵌入HTML表单中
(1)cookie与session
①cookie定义
Cookie技术是客户端的解决方案,由服务器发送给客户端的特殊信息,存放在response的header中,这些信息以文本文件方式存放在客户端,由客户端每次向服务器发送请求时带上,此时是存放在request的header中。例如客户端保存用户id,每次涉及到用户都放到request的header中
如下图,Cookie的设置可分为以下几个步骤:
1.客户端向服务端Request请求。
2.服务器在response的header中设置Cookie,发送给客户端。
3.客户端会将请求request和Cookie一起打包发送给服务端。
4.服务端会根据Cookie判断将response返回给客户端。
因为HTTP协议“无状态”的特点,在请求完毕后会关闭连接,再次交换数据需要建立新的连接,无法跟踪会话。Cookie机制的引入正好弥补了HTTP协议“无状态”的缺陷。
工作原理
由于HTTP协议是“无状态”的,所以服务器无法从网络上获取用户的真实身份。
解决办法:此时客户端给服务端发一个“通行证”,它是一个唯一的标识,无论哪个用户访问服务器需要带上此标识,这样服务器即可辨识用户,这也就是Cookie的原理—–个人身份标识。
总结
在客户端向服务端请求时,若服务器要记录该用户信息,就发送一个携带cookie的response,客户端会保留此cookie,当客户端需要再次请求时,将请求URL和Cookie信息一同打包发送给服务端,此时服务器即可根据cookie辨认状态再做出响应(也可修改)。
总而言之,Cookie就是用户识别标志,保存在客户端!
②session
定义
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器行。客户端浏览器访问的时候,服务器把客户端信息以某种形式记录在服务器上。例如客户端第一次请求服务器,服务器创建sessionID,并且返回给客户端,客户端每次请求都携带该sessionID以确保唯一性
注意:当客户端浏览器再次请求服务器时是不需要携带信息的,在服务器上已有记录。
工作原理
1.在服务端运行程序时创建Session
2.在创建Session的同时,服务器会为该Session生成唯一的Session ID
3.在Session被创建后,可以调用相关方法往Session中添加内容,注意发送到客户端的只有Session ID
4.当客户端再次发送请求时,会将Session ID带上,服务器接受到请求之后就会依据ID确认用户身份,找到相应的Session。
session和cookie区别
1.存放位置不同 Cookie:保存在客户端; Session:保存在服务端;
2.存取方式不同 Cookie:只能保存ASCII码字符串; Session:可保存任何数据;
3.安全性(隐私策略)不同 Cookie:由于它存放在浏览器中,所以对客户端是可见的,客户端的程序有可能修改内容; Session:存放在服务端,不存在敏感信息泄露;
4.有效期不同 Cookie:客户端一般设置有效期较长,这样可保存较长时间; Session:设置成-1后,在用户关闭浏览器后,session就会失效;
5.对服务器造成的压力不同 Cookie:保存在客户端,不占用服务器内存; Session:由于它存放在服务端,多个用户并发访问服务器时,会产生多个session,十分消耗内存;
二、https协议
1、HTTP的缺点
(1)通信使用明文(不加密),内容可能被监听;
(2)不验证通信方的身份,有可能遭遇伪装;
(3)无法证明报文的完整性,有可能已遭篡改;
以上三个问题不仅在HTTP上出现,其它未加密的协议也存在这些问题。除此之外,还有其它的缺点。
(1)通信使用明文可能会被窃听
由于HTTP本身不具备加密功能,所以无法做到对通信整体(使用HTTP协议通信的请求和响应的内容)进行加密,即HTTP报文使用明文的方式发送。
TCP/IP是可能被窃听的网络:
按照TCP/IP 协议族的工作机制,通信内容在所有的通信线路上都有可能遭到窥视。
加密处理防止被窃听
防止窃听保护信息的几种对策中,最为普及的就是加密技术,加密对象有以下几个:
通信的加密: HTTP协议中没有加密机制,可以通过SSL(Secure Socket Layer安全套接层)或TLS(Transport Layer Security安全传输层协议)的组合使用,加密HTTP的通信内容。用SSL建立安全通信线路之后,就可以在这条线路上进行HTTP通信。与SSL组合使用的HTTP被称为HTTPS。
内容的加密:对HTTP协议传输内容本身加密。客户端需要对HTTP报文进行加密处理后再发送请求。为了做到有效的内容加密,前提是客户端和服务器同时具备加密和解密机制。(该方法不同于SSL或TLS将整个通信线路加密处理,所以内容有篡改的风险,后续讲解)
(2)不验证通信方的身份可能遭遇伪装
在HTTP协议通信时,由于不存在确认通信方的处理步骤,任何人都可以发起请求,服务器只有收到请求,不论是谁都返回响应,因此存在以下隐患:
1.无法确定请求发送至目标的Web服务器是否是真实返回响应的服务器。(可能是伪装的)
2.无法确定响应返回到客户端是否是真实接收响应的客户端。(可能是伪装的)
3.无法确定正在通信的对方是否具备访问权限。因为某些Web服务器保存重要信息,只想发给特定用户通信的权限。
4.无法判定请求出处。
即使是无意义的请求也会照单全收。无法阻止海量请求下的DoS攻击。
查明对手的证书
虽然HTTP协议无法确定通信方,但是使用SSL可以。SSL不仅提供加密处理,还使用了一种被称为证书的手段,可用于确定方。
通过使用证书,来证明通信方就是意料中的服务器,这对使用者个人来讲减少了信息泄露的危险。另外客户端持有证书即可完成个人身份验证,可用于Web认证环节。
(3)无法证明报文完整性,可能已遭篡改
由于HTTP协议无法证明通信报文的完整性,即使请求或响应内容遭到篡改,也没有办法获悉。
像这样,请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击称为中间人攻击(Man-in-the-Middle attack)
如何防止篡改
虽然有使用HTTP协议确定报文完整性的方法,事实上并不可靠,常用的是MD5(单向函数生成的散列值)和SHA-1等散列值校验方法,及用来确认文件的数字签名方法。可惜的是如果MD5本身被改写,用户没有办法意识到。
为了有效防止以上这些弊端,需要使用到HTTPS。SSL提供认证和加密处理及摘要功能。仅靠HTTP确保完整性是非常困难的,因此通过和其他协议组合来实现此目标。
2. HTTPS = HTTP + 加密 + 认证 + 完整性保护
(1)定义
HTTPS并非是应用层的一种新协议,只是HTTP通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替而已。通过在TCP和HTTP之间加入TLS来加密,由此保证数据传输的安全性。HTTPS就是身披SSL协议这串外壳的HTTP。
(2)SSL/TLS协议
SSL协议是一种安全传输协议,TLS是SSL v3.0的升级版。
(3)HTTPS层次图
查看HTTPS层次图,最底层是NetWork,依次往上是网络层、传输层、应用层。
上图类似于TCP/IP模型,只是多了一层TLS层,用来加密数据。
(4)HTTPS架构图
查看HTTPS架构图,其实HTTPS协议就是在HTTP基础上加上了加密、验证以及数据的保护。在使用HTTPS通信时,使用的是 https://
(注意:HTTPS并非是新协议,他只是HTTP通信接口中加了一个SSL协议)
在HTTPS通信时会先和SSL层建立通信,然后SSL层再和传输层中的TCP通信。所以HTTPS就是披了一层SSL外壳的HTTP协议
(5)HTTPS传输速度
SSL的慢可归于以下两点:一是通信慢,一是由于大量消耗CPU及内存等资源,导致处理速度变慢。
通信慢:同HTTP协议相比,网络负载会变慢,因为除去TCP连接、HTTP请求与响应外,还必须处理SSL、TSL通信,导致通信量的增加。
SSL必须进行加密处理:在服务器端和客户端都要通过加密、解密进行数据的安全处理,因此从结果而言,比起HTTP会更多地消耗服务器和客户端的硬件资源,导致负载增强。
综合以上因素,只有在处理敏感信息时才使用HTTPS加密通信。
(6)TLS与SSL握手过程
查看上图,TLS与SSL握手过程可以总结以下5个步骤:
(1)客户端发起请求
首先客户端会将它支持的协议版本、加密压缩算法,并生成一个随机数(握手过程的第一个随机数)一起传送给服务端。注意:此随机数与后续服务端产生的随机数会组成密钥。
(2)服务器回应
当服务端收到客户端 hello的请求后,会确定加密的协议算法,也会生成自己的一个随机数(握手过程的第二个随机数),连同证书一起发送给客户端。注意,至此客户端和服务端都拥有了两个随机数(Random1+ Random2),这两个随机数会在后续生成对称秘钥时用到。
(3)客户端验证证书
当客户端再次回应时,首先对服务端发来的证书进行验证,验证完毕后会再次产生一个随机数(握手过程的第三个随机数),此随机数是使用证书中公钥加密的,通知服务端编码已改变、握手结束。
(4)生成密钥
服务端接收到密钥之后,用私钥对这加密的数据进行解密并验证,验证完毕后向客户端发出通知确认编码改变、握手结束。
注意
由于SSL协议在握手阶段使用的是非对称加密,一般是RSA加密算法,所以需知随机数是不能随意破解的,它是安全性的保证。