部分凭记忆,可能总结的不好。望读者见谅。

HTTP协议

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。HTTP是当今世界上应用最为广泛的应用层协议之一。

简单来说就是客户端发送request给服务端,服务端收到后向客户端返回相应的response。

HTTP请求

一个完整HTTP请求包括了

请求行 :请求方式 网站资源 HTTP版本信息

请求头(消息报头):由客户端自定义

请求正文:大多见于POST请求

根据HTTP标准,在目前的最新HTTP协议中定义了8种请求方式

请求方式描述
GET请求指定的页面信息,并返回实体主体。
POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT从客户端向服务器传送的数据取代指定的文档的内容.
DELETE请求服务器删除指定的页面。
HEAD类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
OPTIONS允许客户端查看服务器的性能、获取服务器支持的HTTP请求方法。
TRACE回显服务器收到的请求,主要用于测试或诊断。
CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

HTTP相应

一个完整的相应包括了

响应行:HTTP版本信息 状态码 message

响应头:服务器向客户端发送

响应正文:各种数据

常见的HTTP状态码类型

分类分类描述
1xx信息,服务器收到请求,需要请求者继续执行操作
2xx成功,操作被成功接收并处理
3xx重定向,需要进一步的操作以完成请求
4xx客户端错误,请求包含语法错误或无法完成请求
5xx服务器错误,服务器在处理请求的过程中发生了错误

常见的HTTP状态码

状态码message中文描述
100Continue继续。客户端应继续其请求
101Switching Protocols切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
200OK请求成功。一般用于GET与POST请求
201Created已创建。成功请求并创建了新的资源
202Accepted已接受。已经接受请求,但未处理完成
203Non-Authoritative Information非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204No Content无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205Reset Content重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206Partial Content部分内容。服务器成功处理了部分GET请求
300Multiple Choices多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301Moved Permanently永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302Found临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303See Other查看其它地址。与301类似。使用GET和POST请求查看
304Not Modified未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305Use Proxy使用代理。所请求的资源必须通过代理访问
306Unused已经被废弃的HTTP状态码
307Temporary Redirect临时重定向。与302类似。使用GET请求重定向
400Bad Request客户端请求的语法错误,服务器无法理解
401Unauthorized请求要求用户的身份认证
402Payment Required保留,将来使用
403Forbidden服务器理解请求客户端的请求,但是拒绝执行此请求
404Not Found服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置”您所请求的资源无法找到”的个性页面
405Method Not Allowed客户端请求中的方法被禁止
406Not Acceptable服务器无法根据客户端请求的内容特性完成请求
407Proxy Authentication Required请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408Request Time-out服务器等待客户端发送的请求时间过长,超时
409Conflict服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
411Length Required服务器无法处理客户端发送的不带Content-Length的请求信息
413Request Entity Too Large由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414Request-URI Too Large请求的URI过长(URI通常为网址),服务器无法处理
415Unsupported Media Type服务器无法处理请求附带的媒体格式
429Too Many Requests发送请求太多,服务器拒绝服务
500Internal Server Error服务器内部错误,无法完成请求
501Not Implemented服务器不支持请求的功能,无法完成请求
502Bad Gateway充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
503Service Unavailable由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504Gateway Time-out充当网关或代理的服务器,未及时从远端服务器获取请求
505HTTP Version not supported服务器不支持请求的HTTP协议的版本,无法完成处理

HTTP与持续性链接

HTTP是建立在TCP协议之上的应用层协议,众所周知TCP协议为了实现可靠数据传输在建立连接的过程会进行三次握手。也就是说,客户端需要与服务器建立连接必须首先先服务器发送一个特殊的报文段(SYN),该报文段是不能携带应用层数据的,然后客户端需要等待服务器发回确认报文(SYNAK)。待接收到服务器发会的SYNACK报文之后,客户端还需要发送ACK报文给服务器(这个ACK报文中可以携带应用层的数据)。在客户端服务器进行了三次报文的传输之后,连接才算建立,之后应用层的数据会在这个连接上传输。

在HTTP 协议的初始版本中,每进行一个 HTTP 通信(即一个请求响应对)都要断开一次 TCP 连接,这种方式称为非持续连接。比如使用浏览器浏览一个包含多张图片的 HTML 页面时,在发送请求访问HTML页面资源的同时,也会请求该HTML页面里包含的其他资源。因此,非持续连接每次的请求都会造成无畏的TCP连接建立和断开,增加通信量的开销。为了解决上述 TCP 连接的问题,HTTP/1.1 和部分 HTTP/1.0 想出了持久连接的方法。其特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。旨在建立一次 TCP 连接后进行多次请求和响应的交互,这种方式称为持久连接在HTTP/1.1 中,所有的连接默认都是持久连接。

HTTP:我是不完美的

当然对于HTTP协议来说,已经足够优秀,但也同样有缺点。

众所周知,HTTP协议使用明文传输数据,按照TCP/IP协议族的工作方式,HTTP的通信内容在所有的线路都可以被窃听与劫持。并且,HTTP协议不会验证通信方身份,服务器只要接收到请求,不管对方是谁都会返回一个响应,这就可能会遭遇来自伪装成通信方的恶意攻击。这种机制还有个缺点,无意义的请求也会进行相应的通信,遇到DDoS攻击的话,最好马上拔掉网线(嗯,我认真的)。

由于无论什么请求都会返回相应的相应包,也会造成无法验证HTTP请求报文的完整性,例如修改XFF头。这在CTF中很常见。

虽然有使用HTTP协议确定报文完整性的方法,但事实上并不便捷、可靠。其中常用的是MD5,SHA-1等散列值校验的方法。但是这种方法都需要操作客户端的用户本人亲自检查验证下载的文件是否就是原来服务器上的文件,浏览器无法自动帮用户检查。另外,这种方法也依然无法百分之百的保证确认结果正确,应为MD5值本身被改写的话,用户是没有办法意识到的。

HTTPS:我来改变这个不完美的世界

HTTP与HTTPS的区别总结起来就一句话,HTTPS更加安全。

HTTP加上加密处理和认证以及完整性保护后就是HTTPS。HTTPS并非是应用层的一种新协议,只是HTTP通信接口部分用SSL和TLS协议替代而已。通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。简言之,所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP。在采用SSL之后,HTTP就拥有了安全传输的能力。

ca证书:我是SSL的武器

当客户端想与服务端通过HTTPS建立链接时。大致会发生以下的过程

客户端会发送一个包含加密协议及版本,SSL/TLS等内容,请求HTTPS链接。

服务端会返回一个证书,也就是公钥

客户端收到公钥,判断其是否合法,合法的证书就会生成一个随机数,通过公钥加密随机数并发给服务端

服务端利用自己的私钥解密随机数,并通过传入随机数的对称加密对数进行加密,并传输对称加密后的内容,也就是回话密钥

客户端收到后根据本地的随机数解密。

服务器利用会话密钥加密与客户端之间的通信。

HTTP需要帮手

同源策略是浏览器最基本,也是最核心的安全功能。

一个域=域名+协议+端口

所以它要求访问页面时满足域名相同协议相同端口相同

吃块小饼干

cookie:这是网站为了辨识用户身份而储存在客户端的数据。

有了cookie,才让我们刷新网页的时候不必重新登录页面

session:session是储存特定用户回话所需的属性以及配置信息,保存在服务端,通常是临时文件。

参考:https://andrewpqc.github.io/2018/07/15/http1/


花びらは笑った.