Http和Https详解

本文深入解析HTTP协议的工作原理,包括URL结构、请求与响应消息格式、状态码含义及常见错误处理。涵盖GET与POST请求的区别,以及HTTP如何在客户端与服务器间传输数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HTTP和HTTPS简介

HTTP 是一种基于 TCP/IP 协议的应用层协议,用于在 Web 浏览器和 Web 服务器之间传输超文本。

HTTPS 则是在 HTTP 的基础上加入了 SSL/TLS(安全套接字层 / 传输层安全)协议,旨在为数据传输提供安全保障。

一、HTTP

1.请求消息Request

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

Get请求例子,使用Charles抓取的request:

GET /562f25980001b1b106000338.jpg HTTP/1.1
Host    img.mukewang.com
User-Agent    Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept    image/webp,image/*,*/*;q=0.8
Referer    http://www.imooc.com/
Accept-Encoding    gzip, deflate, sdch
Accept-Language    zh-CN,zh;q=0.8

第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本.
GET说明请求类型为GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。
第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息
从第二行起为请求头部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等
第三部分:空行,请求头部后面的空行是必须的
即使第四部分的请求数据为空,也必须有空行。
第四部分:请求数据也叫主体,可以添加任意的其他数据。
这个例子的请求数据为空。
POST请求例子,使用Charles抓取的request:

POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley

第一部分:请求行,第一行明了是post请求,以及http1.1版本。
第二部分:请求头部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:请求数据,第八行。

2.响应消息Response

一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
例子

HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8

<html>
      <head></head>
      <body>
            <!--body goes here-->
      </body>
</html>

第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
第二部分:消息报头,用来说明客户端要使用的一些附加信息
第二行和第三行为消息报头,
Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
第三部分:空行,消息报头后面的空行是必须的
第四部分:响应正文,服务器返回给客户端的文本信息。
空行后面的html部分为响应正文。

3.状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
常见状态码:
200 OK //客户端请求成功
301、302//重定向
304 Not Modified//服务器告诉客户端请求内容不变(缓存),可以继续使用,不用再下载一遍。
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
更多状态码http://www.runoob.com/http/http-status-codes.html

4.工作过程

当我们在web浏览器的地址栏中输入: www.baidu.com,然后回车,到底发生了什么
过程概览:

  1. 对www.baidu.com这个网址进行DNS域名解析,得到对应的IP地址
  2. 根据这个IP,找到对应的服务器,发起TCP的三次握手
  3. 建立TCP连接后发起HTTP请求
  4. 服务器响应HTTP请求,浏览器得到html代码
  5. 释放 TCP连接;
  6. 浏览器解析html代码,并请求html代码中的资源(如js、css图片等)(先得到html代码,才能去找这些资源)
  7. 浏览器对页面进行渲染呈现给用户

5.HTTP各版本对比

HTTP 1.0

  • 短连接:每次发送请求都要重新建立tcp请求,即三次握手,非常浪费性能;
  • 不允许断点续传,而且不能只传输对象的一部分,要求传输整个对象。
  • 无host头域,也就是http请求头里的host;

HTTP 1.1

  • 长连接,流水线,使用connection:keep-alive使用长连接;但是长连接也会给服务器造成压力
  • 增加Host字段,支持断点传输等;
  • 请求管道化;

HTTP 2.0

  • 二进制分帧:取代文本格式,提高解析效率。
  • 多路复用(或连接共享):使用多个stream,每个stream又分帧传输,使得一个tcp连接能够处理多个http请求;
  • 头部压缩,双方各自维护一个header的索引表,使得不需要直接发送值,通过发送key缩减头部大小;
  • 服务器推送(Sever push)。

HTTP 3.0

  • 基于google的QUIC协议,而quic协议是使用udp实现的;
  • 减少了tcp三次握手时间,以及tls握手时间;
  • 解决了http 2.0中前一个stream丢包导致后一个stream被阻塞的问题;
  • 优化了重传策略,重传包和原包的编号不同,降低后续重传计算的消耗;
  • 连接迁移,不再用tcp四元组确定一个连接,而是用一个64位随机数来确定这个连接;
  • 更合适的流量控制。

二、HTTPS

HTTP 的连接建立过程相对简单,基于 TCP 协议的三次握手,客户端与服务器之间直接建立连接,随后即可进行数据传输。具体流程为:客户端发送 SYN(同步序列编号)包到服务器,服务器收到后返回 SYN + ACK(确认编号)包,客户端再发送 ACK 包,三次握手完成,连接建立成功。

HTTPS 的连接建立过程更为复杂,在完成 TCP 三次握手后,还需进行 SSL/TLS 握手。SSL/TLS 握手主要包含以下步骤:

  1. 客户端发起请求:客户端向服务器发送 ClientHello 消息,包含客户端支持的 SSL/TLS 版本、加密算法列表等信息。
  2. 服务器响应:服务器返回 ServerHello 消息,确认使用的 SSL/TLS 版本和选择的加密算法,并发送服务器的数字证书。
  3. 客户端验证证书:客户端验证服务器证书的有效性,若验证通过,则生成一个随机数(Pre - Master Secret),使用服务器证书中的公钥加密后发送给服务器。
  4. 密钥交换与协商:服务器使用自己的私钥解密收到的加密随机数,获取 Pre - Master Secret,双方通过 Pre - Master Secret 和其他信息计算出对称加密密钥(Master Secret),用于后续的数据加密传输。
  5. 完成握手:客户端和服务器分别发送 ChangeCipherSpec 消息,通知对方后续通信将使用加密方式,随后发送 Finished 消息,包含对之前握手消息的摘要,用于验证握手过程是否正确。

随后客户端和服务端开始数据传输,HTTPS 在数据传输前,客户端会将请求数据使用协商好的对称加密密钥进行加密,然后发送给服务器;服务器收到加密数据后,使用相同的对称加密密钥进行解密,处理请求后,再将响应数据加密返回给客户端,客户端接收到响应后解密并展示内容。通过这种加密传输机制,确保了数据在传输过程中的完整性和机密性。

在 HTTP 协议中,客户端发送请求后,服务器直接以明文形式返回响应数据,整个过程没有额外的加密或验证操作。这种简单的数据传输方式虽然效率较高,但缺乏安全性保障。

原文链接:https://blog.csdn.net/m0_67544876/article/details/147727492

三、HTTP和HTTPS对比

  1. 速度上HTTP更快:由于 HTTP 没有复杂的加密和验证过程,而HTTPS 由于需要进行 SSL/TLS 握手、数据加密和解密等操作,增加了连接建立的时间和数据处理的开销,导致整体响应速度相对较慢。
  2. 安全性上HTTPS更好:HTTPS使用SSL/TLS协议加密传输数据,保证数据不会被篡改,并且通过CA证书验证服务器真实性。
  3. HTTP使用80端口,HTTPS使用443端口。
  4. 服务器成本上,HTTPS需要额外申请CA证书。

URL

HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息
URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个URL为例,介绍下普通URL的各部分组成:
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
从上面的URL可以看出,一个完整的URL包括以下几部分:

  1. 协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符
  2. 域名部分:该URL的域名部分为“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用
  3. 端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口
  4. 虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”
  5. 文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名
  6. 锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分
  7. 参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值