彻底理解http协议

2022-09-14 15:55:24 浏览数 (1)

什么是协议

既然谈http协议,首先我们得知道什么是协议?现实中有协议吗?

引用百度百科的一句话

协议书是社会生活中,协作的双方或数方,为保障各自的合法权益,经双方或数方共同协商达成一致意见后,签订的书面材料。

比如现实中有合同、离婚协议,合作协议等,这些协议无非就是为了约束双方或多方,从而保障双方或多方的权益。

什么是HTTP协议?

既然现实中的协议是为了约束双方、保障双方权益,那么http协议是否也是如此呢? 其实都差不多

以下是基维百科给出的解释

HTTP是一个客户端(用户)和服务端(网站)之间请求和应答的标准,通常使用TCP协议。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。

我们从上面的解释可以截取出"应答标准“这个关键词,即怎么问,怎么答的问题 我们可以说 http协议的诞生解决了客户端和服务器的通信问题,因为他是客户端和服务端之间请求和应答的标准

那么http协议是如何解决客户端与服务端的通信问题呢?他的运行原理到底是什么?

客户端与服务端通信

首先HTTP是一个基于TCP/IP通信协议来传递数据的协议。 这里讲TCP/IP内容就太多了,有关TCP/IP可浏览我的另一篇文章,这里我们简单理解为HTTP是基于TCP/IP通信协议来传递数据的。

下图为客户端与服务器建立一次连接的过程

图片来源 【https://zhuanlan.zhihu.com/p/72616216】

首先客户端与服务器之间最初是没有任何状态的,那客户端怎么可能随随便便就给服务端发送数据呢,”我都不认识你“。 他们之间建立连接首先得经过TCP/IP的三次握手

如下图 【图片来源 :https://blog.csdn.net/y_blueblack/article/details/80158702】

经过三次握手后客户端与服务器就可以正常传输数据

这个时候

1.客户端向服务器发送请求

2.服务器沿着连接发送响应给客户端

3.客户端收到服务器响应如果是网页,则解析html代码,形成我们看到的网页。

4.客户端与服务器完成一次请求响应后马上又会断开连接

所以我们说http协议是无状态的,因为客户端与服务端每建立一次完整的连接后都会断开,也就是服务端是记不住客户端的,当然为了解决这个问题引申出了cookie与session,后面又出现了websocket长连接。

上面我们只是理解了客户端与服务端建立连接的过程,但是客户端与服务端到底怎么建立的连接? 也就是http的运行原理到底是什么?http协议到底做了哪些规范、哪些约束?

HTTP运行原理

我们先运行一个demo来探讨它的运行原理

在index.php

代码语言:javascript复制
<?php
echo " hello word";

在浏览器输入 地址请求index.php

可以看到请求成功,客户端解析出字符串 hello word

我们打开调试工具 network

可以看到状态码200请求成功 点开这个请求,我们可以看到如下

我们主要观察 request headersresponse headers这两个分别代表请求头响应头 请求头 Request Headers 即客户端请求服务器包含的请求头信息 响应头 Response Headers即服务器响应给服务端的响应头信息

这里我们只看到了请求头与响应头,其实http协议是由很多部分组成

HTTP报文组成

请求报文构成 请求行:包括请求方法、URL、协议/版本 请求头(Request Header) 请求正文

我们以telnet为例 打开cmd telnet 本机ip 80 输入

代码语言:javascript复制
GET /0606/01.php HTTP/1.1
Host:localhost
空行

如上图,我们手写了请求信息

第一部分为请求行

请求行又包括 请求方法、请求资源、协议

第二部分为请求头

请求头的格式为请求头名称:请求头信息Host:localhost

请求行结束后需在最后加空行以标识请求头信息结束

第三部分为请求体

常见的请求头

Accept:浏览器可接受的MIME类型;

Accept-Charset:浏览器可接受的字符集;

Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间;

Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到;

Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中;

Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小;

Content-Length:表示请求消息正文的长度;

Cookie:这是最重要的请求头信息之一;

From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它;

Host:初始URL中的主机和端口;

If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答;

Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝;

Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。

User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用;

UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。

响应报文构成 状态行 响应头 响应正文 通过telnet产生的响应头如下

响应头格式如下

上面我们是以get方法请求服务器的,当然请求方法不止一种

常见请求方法

GET:请求指定的页面信息,并返回实体主体。

POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

HEAD:类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头,这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。

PUT:从客户端向服务器传送的数据取代指定的文档的内容。

DELETE:删除指定的资源。

CONNECT:方法建立一个到由目标资源标识的服务器的隧道。

OPTIONS:用于描述目标资源的通信选项,返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性。

TRACE:沿着到目标资源的路径执行一个消息环回测试。主要用于测试或诊断

PATCH:用于对资源应用部分修改。

post和get的区别:

都包含请求头请求行,post多了请求body。 get多用来查询,请求参数放在url中,不会对服务器上的内容产生作用。post用来提交,如把账号密码放入body中。 GET是直接添加到URL后面的,直接就可以在URL中看到内容,而POST是放在报文内部的,用户无法直接看到。 GET提交的数据长度是有限制的,因为URL长度有限制,具体的长度限制视浏览器而定。而POST没有。

在上面的demo中服务端返回的响应头包含了状态码 200,说明请求成功,当然状态码也有很多 响应状态码类型 1XX- 信息型,服务器收到请求,需要请求者继续操作。 2XX- 成功型,请求成功收到,理解并处理。 3XX - 重定向,需要进一步的操作以完成请求。 4XX - 客户端错误,请求包含语法错误或无法完成请求。 5XX - 服务器错误,服务器在处理请求的过程中发生了错误。

常见状态码 1x 100 (Continue/继续) 如果服务器收到头信息中带有100-continue的请求,这是指客户端询问是否可以在后续的请求中发送附件。在这种情况下,服务器用100(SC_CONTINUE)允许客户端继续或用417 (Expectation Failed)告诉客户端不同意接受附件。这个状态码是 HTTP 1.1中新加入的。

101 (Switching Protocols/转换协议) 101 (SC_SWITCHING_PROTOCOLS)状态码是指服务器将按照其上的头信息变为一个不同的协议。这是 HTTP 1.1中新加入的。 2x 200(成功) 服务器已成功处理了请求 201 (已创建) 请求成功并且服务器创建了新的资源 202 (已接受) 服务器已接受请求,但尚未处理 203 (非授权信息) 服务器已成功处理请求,但返回的信息可能来自另一个来源 204 (无内容) 服务器成功处理了请求,但没有返回任何内容 205 (重置内容) 服务器处理成功,用户终端应重置文档视图 206 (部分内容) 服务器成功处理了部分GET请求

3x 300(多种选择) 针对请求,服务器可执行多种操作 301 (永久移动) 请求的页面已永久跳转到新的url 302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求仍继续使用原有位置来进行以后的请求 303 (查看其他位置) 请求者应当对不同的位置使用单独的GET请求来检索响应时,服务器返回此代码 304 (未修改) 自从上次请求后,请求的网页未修改过 305 (使用代理) 请求者只能使用代理访问请求的网页 307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求

4x 400 (错误请求) 服务器不理解请求的语法 401 (未授权) 请求要求用户的身份演验证 403 (禁止) 服务器拒绝请求 404 (未找到) 服务器找不到请求的页面 405 (方法禁用) 禁用请求中指定的方法,方法未允许 406 (不接受) 无法使用请求的内容特性响应请求的页面 407 (需要代理授权) 请求需要代理的身份认证 408 (请求超时) 服务器等候请求时发生超时 409 (冲突) 服务器在完成请求时发生冲突 410 (已删除) 客户端请求的资源已经不存在 411(需要有效长度) 服务器不接受不含有效长度表头字段的请求 412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件 413 (请求实体过大) 由于请求实体过大,服务器无法处理,因此拒绝请求 414 (请求url过长) 请求的url过长,服务器无法处理 415 (不支持格式) 服务器无法处理请求中附带媒体格式 416 (范围无效) 客户端请求的范围无效 417 (未满足期望) 服务器无法满足请求表头字段要求 5x 500 (服务器错误) 服务器内部错误,无法完成请求 501 (尚未实施) 服务器不具备完成请求的功能 502 (错误网关) 服务器作为网关或代理出现错误 503 (服务不可用) 服务器目前无法使用 504 (网关超时) 网关或代理服务器,未及时获取请求 505 (不支持版本) 服务器不支持请求中使用的HTTP协议版本

以上列出常见状态码,内容来自 【https://www.cnblogs.com/binguo666/p/10940198.html】

扩展 HTTPS

HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。

以下内容来自知乎 https://zhuanlan.zhihu.com/p/72616216

实际使用中,绝大说的网站现在都采用的是https协议,这也是未来互联网发展的趋势。下面是通过wireshark抓取的一个博客网站的登录请求过程。

可以看到访问的账号密码都是明文传输, 这样客户端发出的请求很容易被不法分子截取利用,因此,HTTP协议不适合传输一些敏感信息,比如:各种账号、密码等信息,使用http协议传输隐私信息非常不安全。

一般http中存在如下问题:

1.请求信息明文传输,容易被窃听截取。

2.数据的完整性未校验,容易被篡改

3.没有验证对方身份,存在冒充危险

什么是HTTPS?

为了解决上述HTTP存在的问题,就用到了HTTPS。 HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer):一般理解为HTTP SSL/TLS,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。

那么SSL又是什么? SSL(Secure Socket Layer,安全套接字层):1994年为 Netscape 所研发,SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。

TLS(Transport Layer Security,传输层安全):其前身是 SSL,它最初的几个版本(SSL 1.0、SSL 2.0、SSL 3.0)由网景公司开发,1999年从 3.1 开始被 IETF 标准化并改名,发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2 三个版本。SSL3.0和TLS1.0由于存在安全漏洞,已经很少被使用到。TLS 1.3 改动会比较大,目前还在草案阶段,目前使用最广泛的是TLS 1.1、TLS 1.2。

SSL发展史(互联网加密通信) 1994年NetSpace公司设计SSL协议(Secure Sockets Layout)1.0版本,但未发布。 1995年NetSpace发布SSL/2.0版本,很快发现有严重漏洞 1996年发布SSL/3.0版本,得到大规模应用 1999年,发布了SSL升级版TLS/1.0版本,目前应用最广泛的版本 2006年和2008年,发布了TLS/1.1版本和TLS/1.2版本

浏览器在使用HTTPS传输数据的流程是什么?

首先客户端通过URL访问服务器建立SSL连接。 服务端收到客户端请求后,会将网站支持的证书信息(证书中包含公钥)传送一份给客户端。 客户端的服务器开始协商SSL连接的安全等级,也就是信息加密的等级。 客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。 服务器利用自己的私钥解密出会话密钥。 服务器利用会话密钥加密与客户端之间的通信。 HTTPS的缺点 HTTPS协议多次握手,导致页面的加载时间延长近50%; HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗; 申请SSL证书需要钱,功能越强大的证书费用越高。 SSL涉及到的安全算法会消耗 CPU 资源,对服务器资源消耗较大。

总结HTTPS和HTTP的区别 HTTPS是HTTP协议的安全版本,HTTP协议的数据传输是明文的,是不安全的,HTTPS使用了SSL/TLS协议进行了加密处理。 http和https使用连接方式不同,默认端口也不一样,http是80,https是443。

0 人点赞