前端应该了解的计算机网络-HTTP篇

175 阅读17分钟

HTTP

HTTP协议(超文本传输协议)是一种网络通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。默认端口:80。它是一种以明文的方式发送我们的内容,没有任何的加密。

HTTP基于TCP/IP通信协议进行传送输数据(HTML文件、图片文件、查询结果等),是一个属于应用层的面向对象的协议

主要特点

  • HTTP支持B/S以及C/S模式。

  • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径即可。请求方法包括GET、POST、PUT、HEAD等。

  • 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

  • 无连接:限制每次连接只处理一个请求。服务器处理完客户的请求并收到客户的应答后,立即断开。可以节省传输时间。

  • 无状态:无状态是指协议对于事务处理没有记忆能力。意味着如果后续吹了需要前面的信息,它必须重传,这样可能导致每次连接传送的数据量增大。但如果服务器不需要先前信息时它的应答就比较快。

graph LR;
HTTP-->请求报文-->请求行 & 请求头 & 请求正文
HTTP-->响应报文-->响应行 & 响应头 & 响应体

请求报文

image.png

请求行

请求行由:请求头、请求URL、http协议及版本组成

请求方法
  • GET

    发送一个请求来获取服务器上的某一些资源。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。

  • POST

    向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。

  • HEAD

    与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。

  • PUT

    向指定资源位置上传其最新内容。

  • DELETE

    请求服务器删除Request-URI所标识的资源。

  • TRACE

    回显服务器收到的请求,主要用于测试或诊断。

  • OPTIONS

    这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。

  • CONNECT

    HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

方法名称是区分大小写的。HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。当然,所有的方法支持的实现都应当匹配下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。

请求URL

HTTP使用**URl(统一资源标识符)**来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够信息。URL字段也称为请求地址

http://www.lcx.com:8081/news/index.html?boardID=5&ID=24618&page=1#name为例:

  • 协议部分:http:,以//为分隔符。
  • 域名部分:www.lcx.com,域名和端口之间使用作为分隔符。
  • 端口部分:跟在域名后面的是端口8081,域名和端口之间使用作为分隔符。
  • 虚拟目录部分:从域名后的第一个/开始到最后一个/为止。/news/
  • 文件名部分:从域名后的最后一个/开始到为止。index.html
  • 参数部分:从开始到#为止之间的部分为参数部分。boardID=5&ID=24618&page=1
  • 锚部分:从#开始到最后。name

请求头

请求头部由多个键值对组成,服务端据此获取客户端的信息。

典型的请求头有:

  • User-Agent:产生请求的浏览器类型。

  • Cookie:缓存信息

  • Accept:客户端可识别的内容类型列表。

  • Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

  • Content-Type:请求体的MIME类型,常见的有application/json、image/jpeg、application/octet-stream等

    MIME类型:描述消息内容类型的因特网标准

image.png

请求体

请求体向服务器提交的请求数据,GET请求的参数一般是放在请求行后的键值对,POST请求的参数类型多样(表单、json、xml、图片等)

响应报文

image.png

响应行

响应行由:http协议及版本、状态码及描述组成

响应头

也是由多个键值对组成。响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。

常见的响应头有:

  • Content-Length:表示内容长度

  • Content- Type:表示后面的文档属于什么MIME类型

  • Server:服务器通过这个头告诉浏览器服务器的类型

响应体

就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是图片就是图片等

工作原理

以在浏览器地址键入URL为例,工作流程:

  1. 浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址

  2. 解析出IP地址后,根据该IP地址和默认端口号,与服务器建立TCP连接

  3. 浏览器发出HTTP请求给服务器

  4. 服务器对浏览器请求做出响应,并把对应的html文本发送给浏览器

  5. 释放TCP连接

  6. 浏览器将该html文本显示出来

但是我们可能会需要在这个网站输入密码,登录账号之类的操作,那我们账号就会发送到服务器上面,但是要是有人在中途截取我们的信息,那我们一些比较重要的信息可能就暴露了;

所以为了解决HTTP不加密的问题,之后就增加了一个SSL协议,这个协议简单来说就是提供数据安全和完整性的协议,也就是负责网络连接的加密;也就是HTTPS

HTTPS

安全超文本传输协议。了解到HTTP传递信息是以明文的形式发送内容,这并不安全。而HTTPS出现正是为了解决HTTP不安全的特性。

为了保证这些隐私数据能加密传输,让HTTP运行安全的SSL/TLS协议上,即 HTTPS = HTTP + SSL/TLS,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密

HTTPS协议的主要特点:

  • 内容加密:采用混合加密技术,中间者无法直接查看明文内容
  • 验证身份:通过证书认证客户端访问的是自己的服务器
  • 保护数据完整性:防止传输的内容被中间人冒充或者篡改
  • SSL证书需要购买申请,功能越强大的证书费用越高
  • SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗
  • HTTPS连接缓存不如HTTP高效,流量成本高
  • HTTPS协议握手阶段比较费时,对网站的响应速度有影响,影响用户体验。

这个协议简单来说就是提供数据安全和完整性的协议,也就是负责网络连接的加密。HTTPS 的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。 

SSL

SSL 协议位于TCP/IP 协议与各种应用层协议之间,浏览器和服务器在使用 SSL 建立连接时需要选择一组恰当的加密算法来实现安全通信,为数据通讯提供安全支持。

HTTP在通信过程中,存在以下问题:

  • 通信使用明文(不加密),内容可能被窃听
  • 不验证通信方的身份,因此有可能遭遇伪装

SSL的主要依赖于三种手段解决问题:

  • 对称加密:采用协商的密钥对数据加密
  • 非对称加密:实现身份认证和密钥协商
  • 摘要算法:验证信息的完整性
  • 数字签名:身份验证

HTTPSHTTP虽然只差一个SSL,但是通信安全得到了大大的保障,解决方式如下:

  • 机密性:混合算法
  • 完整性:摘要算法
  • 身份认证:数字签名
  • 不可否定:数字签名

同时引入第三方证书机构,确保公开秘钥的安全性

工作原理

同样以在浏览器地址输入URL为例,工作流程:

  • 首先客户端通过URL访问服务器建立SSL连接
  • 服务端收到客户端请求后,会将网站支持的证书信息(证书中包含公钥)传送一份给客户端
  • 客户端的服务器开始协商SSL连接的安全等级,也就是信息加密的等级
  • 客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站
  • 服务器利用自己的私钥解密出会话密钥
  • 服务器利用会话密钥加密与客户端之间的通信

image.png

通俗的说

我们电脑会先和服务器建立一个安全的连接通道,

然后服务器会先发送一份网站的证书信息到我们电脑;就相当于是告诉我们电脑,你访问的服务器没有问题,确认了信息之后;

我们的服务器会生成一个加锁的箱子,但是这把锁有两把不一样的钥匙一把是给我们电脑的一把是服务器自己的,

然后服务器会把上锁的箱子和钥匙发给我们电脑,

我们把信息放在箱子以后,用钥匙锁上然后发给服务器,服务器再用自己的钥匙打开箱子,来保证信息的安全;

在这个过程中即使消息被拦截,没有服务器的钥匙是很难打开的。

HTTP对比HTTPS

HTTPHTTPS
传输方式明文传输,网站或相关服务与用户之间的数据交互无加密,容易被监听,篡改。是不安全的在HTTP加入了SSL层,用于数据传输加密,相对更安全
身份认证无任何身份认证,用户无法通过http辨认出网站的真实身份。经过CA多重认证,包含域名管理权限认证等。
需要成本无任何使用成本,所有网站默认是http模式。需要申请SSL证书SSL 证书需要钱,功能越强大的证书费用越高
连接端口80端口。443端口。

知识支撑

网络协议

网络协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则。HTTP协议是一种网络协议。

不同版本的HTTP

HTTP1.0:

  • 浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接

HTTP1.1:

  • 引入了持久连接,即TCP连接默认不关闭,可以被多个请求复用
  • 在同一个TCP连接里面,客户端可以同时发送多个请求
  • 虽然允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的,服务器只有处理完一个请求,才会接着处理下一个请求。如果前面的处理特别慢,后面就会有许多请求排队等着
  • 新增了一些请求方法
  • 新增了一些请求头和响应头

HTTP2.0:

  • 采用二进制格式而非文本格式
  • 完全多路复用,而非有序并阻塞的、只需一个连接即可实现并行
  • 使用报头压缩,降低开销
  • 服务器推送

SSH

SSH 为 Secure Shell的缩写,即“安全外壳”,是基于公钥的安全应用协议。由三个子协议组成:

  • SSH传输层协议
  • SSH用户认证协议
  • 以及SSH连接协议

通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。

git关联远程仓库最常用的便是SSH和HTTP(S)协议。

git可以使用四种主要的协议来传输资料:

  • 本地协议(Local)
  • HTTP 协议
  • SSH协议
  • git 协议

HTTPS和SSH

HTTPS利于匿名访问,适合开源项目,可以方便被别人克隆和读取(但没有push权限);

SSH不利于匿名访问,比较适合内部项目,只要配置了SSH公钥极可自由实现clone和push操作。

sshhttps
端口一般使用22端口一般使用443端口
使用通过先在本地生成SSH密钥对再把公钥上传到服务器;通过用户名/密码授权,可用性比较高
速度速度相较慢点速度相较快点
clone项目需要配置ssh key,即要将生成的SSH密钥对的公钥上传至服务器没有要求,可以直接克隆下来
push项目不需要验证用户名和密码,之前配置过ssh key,(如果你没设置密码)直接push即可需要验证用户名和密码

常见的HTTP状态码

表示客户端HTTP请求的返回结果、标识服务器处理是否正常、表明请求出现的错误等。

1XX代表请求已被接受,需要继续处理
100(客户端继续发送请求,这是临时响应)这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应
101服务器根据客户端的请求切换协议,主要用于websocket或http2升级
2XX成功(这系列表明请求被正常处理了)
200(成功)请求已成功,请求所希望的响应头或数据体将随此响应返回
201(已创建)请求成功并且服务器创建了新的资源
202(已创建)服务器已经接收请求,但尚未处理
203(非授权信息)服务器已成功处理请求,但返回的信息可能来自另一来源
204(无内容)服务器成功处理请求,但没有返回任何内容
205(重置内容)服务器成功处理请求,但没有返回任何内容
206(部分内容)服务器成功处理了部分请求
3XX表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向
300(多种选择)针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择
301(永久移动)请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置
302(临时移动)服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
303(查看其他位置)请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码
305(使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理
307(临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
4XX代表了客户端看起来可能发生了错误,妨碍了服务器的处理
400(错误请求)服务器不理解请求的语法
401(未授权)请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403(禁止) 服务器拒绝请求
404(未找到)服务器找不到请求的网页
405(方法禁用)禁用请求中指定的方法
406(不接受)无法使用请求的内容特性响应请求的网页
407(需要代理授权)此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理
408(请求超时)服务器等候请求时发生超时
5XX表示服务器无法完成明显有效的请求。这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生
500(服务器内部错误)服务器遇到错误,无法完成请求
501(尚未实施)服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码
502(错误网关)服务器作为网关或代理,从上游服务器收到无效响应
503(服务不可用)服务器目前无法使用(由于超载或停机维护)
504(网关超时)服务器作为网关或代理,但是没有及时从上游服务器收到请求
505(HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本

下面给出一些状态码的适用场景:

  • 100:客户端在发送POST数据给服务器前,征询服务器情况,看服务器是否处理POST的数据,如果不处理,客户端则不上传POST数据,如果处理,则POST上传数据。常用于POST大数据传输
  • 206:一般用来做断点续传,或者是视频文件等大文件的加载
  • 301:永久重定向会缓存。新域名替换旧域名,旧的域名不再使用时,用户访问旧域名时用301就重定向到新的域名
  • 302:临时重定向不会缓存,常用 于未登陆的用户访问用户中心重定向到登录页面
  • 304:协商缓存,告诉客户端有缓存,直接使用缓存中的数据,返回页面的只有头部信息,是没有内容部分
  • 400:参数有误,请求无法被服务器识别
  • 403:告诉客户端进制访问该站点或者资源,如在外网环境下,然后访问只有内网IP才能访问的时候则返回
  • 404:服务器找不到资源时,或者服务器拒绝请求又不想说明理由时
  • 503:服务器停机维护时,主动用503响应请求或 nginx 设置限速,超过限速,会返回503
  • 504:网关超时