http详解

http协议

1.介绍

  • http是 Hyper Text Transfer Protocol (超文本传输协议) 的缩写。它的发展是万维网(World Wide Web Consortium) 和 Internet 工作小组 IETF (Internet Engineering Task Force) 合作的结果,他们发布了一系列RFC(基本互联网通信协议文件),RFC1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616,定义了今天普遍使用的一个版本 HTTP 1.1
  • HTTP协议用于从WWW服务器传输超文本到本地浏览器的传送协议。它提高了浏览器更加高效,减少了网络传输。不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的那一部分,以及那一部分的内容优先显示
  • HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。TCP/IP协议栈中的位置
  • HTTP协议通常承载于TCP/IP协议之上,有时也承载于TLS或SSL协议层之上,这时,就成了HTTPS。如下图

img

  • 通常默认HTTP的端口号为80,HTTPS的端口号为443

3. HTTP的请求响应模型

  • HTTP协议永远都是客户端发起请求,服务器回复响应。这样限制了使用HTTP协议,无法实现在客户端没有发送请求时,服务器将消息推送给客户端。HTTP是无状态的,在同一个客户端的这次请求和上次请求无对应关系。

4. 工作流程

  • 一次HTTP操作一次事务,其工作流程如下:
    • 首先客户机与服务器建立连接,这个连接是通过超链接单击即可开始HTTP的工作
    • 建立连接后,客户机发送一个请求包给服务器,请求方式的格式统一为:统一资源标识符(URi)、协议版本号,后面跟着MIME信息包括请求修饰符、客户机信息和可能的一些内容。
    • 服务器接受到请求后,给予相应的信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后面是MIME信息包括服务器信息、实体信息以及可能的内容
    • 客户端接收服务器返回的信息同时通过浏览器显示在用户的显示屏上面,然后断开与客户端的连接
    • 以上过程如果出现错误,产生的错误信息将返回给客户端

5. 头域

  • 每一个头域由 域名、冒号(:)以及域值三部分组成。域名无关大小写,域值前可以添加任何数量的空格符,头域是可以被扩展为多行的,在每一行的开始处,使用至少一个空格或制表符。

img

  • host 头域
    * host头域指定请求资源的Intenet主机和和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1中请求包必须包含头域,否则系统会以400状态码返回。
  • Referer头域
    * Referer头域允许客户端指定请求uri的源资源地址,可以允许服务器生成回退链表,可以用于登录、优化缓存cache等。同时允许废除的或错误的连接因为维护的目的被追踪。
    * 如果请求的uri没有自己的uri地址,那么Referer是不能被发送的。
    * 对于拼接的uri,指定的uri是拼接那部分地址
  • User-Agent头域
    * User-Agent这部分头域的内容包含发出请求的用户信息。例如:User-Agent:MicroMessenger Client \r\n
  • Cache-Control头域
    * 这部分头域指定请求和响应应遵循的缓存机制。请求消息和响应消息设置的Cache-Control并不会更改另一个消息处理过程中的缓存处理过程。
    * 请求时的缓存指令包括 no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached。响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age
  • Date头域
    * Date头域包含消息发送的时间,这个描述格式一般由rfc822定义。例如:Date:Mon,31 Dec 2001 04:25:57GMT 。这个时间一般表示世界标准时间。

6. HTTP 的一些基本定义

  • Connection(连接) :
    * 它是一个传输层的实际环流,建立在俩个相互通讯的app之间。
    * 在HTTP/1.1中,requset于response头中都有可能出现一个Connection头,这个头中主要包含的是当Client与Server通信时如果处理长连接问题
    * 在HTTP/1.1中,服务器与客户端双方都是默认支持对方长连接。如果不希望使用长连接则只需要在Header中指明connection的值为close,在表明了这个头值后那么当前正在使用的TCP链接在当天请求处理完毕后就会被断开。以后客户端再想进行新的请求就必须创建新的TCP链接。
  • Message(消息):
    * HTTP进行通讯的基本单位,包括了一个结构化的八元组序列并通过链接传输
  • Request(请求):
    * 一个客户端到服务器的请求信息包括应用于资源的方法、资源的标识符和协议的版本号
  • Response(响应):
    * 一个从服务器返回的信息,包括HTTP协议的版本号、请求的状态以及文档的MIME类型。
  • Resource(资源):
    * 由URI标识的网络数据对象或服务
  • Entity(实体):
    * 数据资源或来自服务资源的回应的一种特殊表示方法,它可能被包裹在一个请求或响应信息中。一个实体包括实体头信息和实体的本身内容
  • UserAgent(用户代理):
    * 初始化一个请求的客户机。是浏览器、编辑器或其他工具的集合。
  • Proxy(代理):
    * 一个中间程序,它既可以充当服务器也可以充当客户机,为其他客户机建立请求。请求是通过可能的翻译在内部或经过传递到其他的服务器中。一个代理在发送请求信息之前,必须解释并且如果可能驱重写它。
    * 代理经常作为通过防火墙的客户机的门户,代理还可以作为一个帮助应用来通过协议处理没有被用户代理完成的请求
  • Gateway(网关):
    * 是一个作为其他服务器的中间媒介服务器。与代理不同的就是,它同客户机打交道时,他就被当作源服务器。客户机并没有意识到它在同网关打交道。
    * 网关经常作为通过防火墙的服务器端的门户,同时网关还可以作为一个协议翻译器以便存取那些存储在非HTTP系统中资源。
  • Tunnel(通道):
  • 它是作为俩个连接中继的中介程序。一旦激活,通道便被认为不属于HTTP通讯,尽管通道可能是被一个HTTP请求初始化的。当被中继的连接俩端关闭时,通道便消失。当一个门户(Portal)必须存在或中介(Intermediary) 不能解释中继的通讯时通道被经常使用。
  • Cache(缓存):
    • 响应信息的局部存储

https协议

1. 介绍

  • https协议是以保密为目的研发的,它是http协议的安全版,借助SSL协议的加密过程。全称为:Hypertext Transfer Protocol over Secure Socket Layer
  • https是一个URI schme(格式),它与http存在不同的默认端口及加密身份验证层(在HTTP与TCP之间)。
  • SSL极难被窃听,能对中间人攻击提供一定的合理保护。HTTPS是传输层SSL+应用层HTTP协议的结合。
  • HTTPS默认TCP端口443(HTTP默认TCP端口80),但也可以指定其他TCP端口。协议的正常运作服务器需要有PKI证书,而客户端方无要求。它的加密强度依赖软件的正确实现,以及服务器客户端双方加密算法的支持
  • 即使HTTPS 被正确实现,仍有以下人为因素:
    1. 冒充网站
    2. 钓鱼攻击: 通过制造与原网站相似的假冒网站,诱导客户访问
    3. 中间人攻击: 在通讯线路中篡改证书,从而充当网站客户双方的中间人,只有检查证书才可能发现中间人的存在。

2 . HTTPS不同于HTTP的地方

  • https协议需要有ca证书。
  • http是明文传输的,而https是通过SSL加密进行传输的。
  • 俩者的默认端口也不同,http默认80,https默认443。
  • https复杂程度更高,https完成一次握手就需要有6/7组往返。

https能够解决http中的问题:

  • 信任主机问题:一个server都有一个ca证书以证明服务器用途类型,客户通过信任该证书从而信任该主机,这样的效率较低,但是效率较高。
  • 通讯过程中数据的泄密和被恶意篡改

3 HTTPS协议结构

  • 请求报文格式:请求行 - 通用信息头 - 请求头 -实体头 - 请求体。请求行以方法字段开始,后面分别是URL字段和HTTP协议版本字段,并且以CRLF结尾,以SP为分隔符。除了最后的CRLF序列中的CF和LF是必需的外,其他都可以省去。通用信息头,例如请求头和实体头方面的具体内容可以参照对应的文件
  • 响应报文格式:状态行 - 通用信息头 - 响应头 - 实体头 -响应体 。 状态码一般由三位数组成,表示请求是否被理解或者满足。原因分析是对原文状态码的一个简短的描述,支持自动操作,供用户使用和查看,客户端无需使用来检查或显示语法。

SSL

  • SSL(Secure Socket Layer)。是一种确保数据在网络上传输不会被截取以及窃听的数据加密技术
  • 主要分为俩层 ,SSL记录协议以及SSL握手协议。SSL记录协议建立在可靠的传输协议上(例如TCP),为高层协议提供数据封装、压缩、加密等基本功能。SSL握手协议建立在SSL记录协议之上,用于在实际的数据传输开始之前。简单包括通讯双方的身份认证、协商加密以及交换加密密钥。

SSL提供的服务

  • 认证用户和服务器,保证数据发送给正确的客户端和服务端。
  • 加密数据,防止被窃取或篡改。
  • 维持数据的完整性,保证数据在传输过程中不被篡改。

SSL工作流程

  • 服务器认证阶段:
    1. 客户端向服务端发送开始信息,开启一个新的会话连接
    2. 服务端依照客户端信息判断是否需要生成新的主密钥,如果需要生成服务端响应信息中会包含主密钥信息
    3. 客户端根据接收到的服务器响应信息,产生一个主密钥,并使用服务器公开密钥后加密发给服务器
    4. 服务器恢复主密钥,并返回给客户一个用主密钥认证的信息,来让客户端认证服务器.完成服务器认证过程
  • 客户端认证阶段: 认证后的服务器发送一个提问给客户端,客户端返回数字签名后的提问和公开密钥,从而向服务器提供认证

SSL协议的握手过程:

  1. 客户端浏览器向服务器发送客户端SSL协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端通讯所需要的各种信息
  2. 服务器向客户端发送SSL协议的版本号,加密算法种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书
  3. 客户端利用服务端发送的信息来检验服务器的合法性,主要包括:
    • 证书是否过期
    • CA是否可靠
    • 发行者证书的公钥能否正确解开服务器证书的数字起那么
    • 服务器证书上的域名是否与服务器的实际域名相匹配

如果合法验证性未通过,通讯断开

  1. 客户端随机产生一个用于后面通讯的对称密码,然后使用服务器的公钥对其加密,然后将加密后的预主密码传给服务器

  2. 如果服务器要求客户端的认证,客户端可以建立一个随机数然后对其进行数据签名,将这个含有签名的随机数和客户自己认证的证书以及加密过的预主密码一起传送给服务器

  3. 服务器检验客户端的身份认证,主要包括:

    • 客户端证书使用日期是否过期

    • 客户端提供的CA是否可靠

    • 发行CA的公钥能否正确解开客户证书的发行CA的数字签名

    • 检查客户端的证书是否在证书废止列表(CRL)中

    • 检验没有通过,通讯立刻中断;如果验证通过,服务器将使用自己的私钥解开加密的预主密码,然后执行一系列步骤来产生主通讯密码(客户端也会通过同样的方法产生相同的主通讯密码)

  4. 服务器和客户端的主密码是一个对称密钥,用于SSL协议的安全数据通讯的加解密通讯.同时在SSL通讯过程中完成数据通讯的完整性,防止数据通讯中的任何变化.

  5. 客户端向服务端发出信息,指明后面的数据通讯使用7中的主密码为对称密钥,同时通知服务器客户端的握手过程结束

  6. 服务器向客户端发出信息,指明后面的数据通讯使用7中的主密码为对称密钥,同时通知客户端服务端的握手过程结束

  7. SSL的握手部分结束,SSL安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验

HTTP常见状态码

  • 状态码第一位指定了响应类别
类型 触发动作 说明
1XX informational 信息成功状态码,表示接受的请求正在处理
2XX Success 成功状态码,表示请求正常处理完毕
3XX Redirection 重定向状态码,表示需要客户端进行附加操作
4XX Client Error 客户端错误状态码,表示服务器无法处理请求
5XX Server Error 服务器错误状态码,表示服务器处理请求错误

2XX Success


请求在服务端被正常处理

200 OK

请求被成功处理,服务器根据不同的请求方法返回资源

  • GET : 请求的对应资源会作为响应返回
  • HEAD: 请求的对应资源的响应头会作为响应返回,不包括响应体
  • POST:返回处理对应请求的结果
204 No Content

请求已经处理完毕,但是服务端没有返回响应体

  • 例如,当客户端是浏览器时,发出的请求为204响应,那么浏览器显示的页面不会更新
206 Partial Content

客户端进行了范围请求,服务器成功执行了这部分的GET请求

  • 客户端发起的请求中包含range字段. 服务端响应报文中,必须包含由Content-Range指定范围的实体内容

3XX Redirection


浏览器需要执行某些特殊的处理以完成请求

301 Movied Permanently

请求的资源被分配给了新的URi,并使用现在资源指定的uri,根据请求的方法有不同的处理方式

  • HEAD:必须在响应头部Location字段中指明新的永久性uri
  • GET: 除了有Location字段以外,还需要在响应体中附上永久性uri的超链接文本
  • POST:客户端在发送POST请求,受到301响应后,不应该自动跳转uri,而让用户确认跳转
302 Found

临时重定向 请求的资源已被分配了新的uri,希望用户使用新的uri访问

  • 与301状态码相似,但302状态码表示资源是临时性质的uri移动
303 See Other

请求资源存在另一个uri,应当使用GET方法定向获取请求的资源

  • 与302不同在于,302状态码不更改请求的方法,重定向后的请求方法与重定向前保持一致;303如果使用的是POST请求的话,重定向的请求应该是GET请求
  • HTTP/1.1版以前的浏览器不能正确理解303状态码,现存而将302响应视为303响应,并使用GET方式访问Location中规定的uri,而无视原先请求的方法
304 Not Modified

客户端发送附带请求条件,服务端允许请求访问资源,但未满足条件的情况

  • 304 状态码返回时,不包含任何响应的主题部分.附带条件的请求指的是采用GET方法的请求头中包含:If-Match ,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since中的任一首部
307 Temporary Redirect

临时重定向,状态码不指定客户端要用什么样请求方法请求重定向地址

4XX Client Error


客户端发送错误的原因所在

400 Bad Request

表示请求报文中存在语法错误,服务器无法理解该请求;客户端需要修改请求的内容后再次发送请求

401 Unauthorized

发送的请求需要有通过HTTP认证(Basic认证,Digest认证)的认证信息;返回含有401的响应,必须在头部包含WWW-Authenticate以指明服务器需要哪种方式的认证

当客户端再次请求该资源时,需要在请求头中的Authorization包含认证信息

403 Forbidden

表明对请求资源的访问被服务器拒绝了;服务器没有必要给出拒绝的详细理由

未获得文件系统的访问权限,访问权限出现某些问题,从未授权的发送源IP地址试图访问等情况都可能发生403

404 Not Found

该状态码表明服务器上无法找到指定的资源.通常被用于服务器不行透露拒绝请求的原因,或者没有其他的响应可以提供

5XX Server Error


服务器本身发生错误,或者没有足够的能力来处理请求

500 Internal Server Error

服务器端在执行请求时发生了错误.也有可能是Web应用存在的BUG或某些临时的故障

503 Service Unavailable

服务器处于超负载或正在停机维护,现在不能处理请求.如果需要事先得知解除以上需要的时间,最好写入Retry-After首部字段在返回给看客户端

posted @   Ajackson  阅读(155)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示