HTTP原理

前言

HTTP(HyperText Transfer Protocol,超文本传输协议)是 TCP/IP 四层模型中的应用层的其中一种协议。

HTTP 的历史
  • HTTP 于 1990 年问世,被称为 HTTP/0.9;
  • HTTP/1.0 作为标准被公布是在 1996 年的 5 月,该标准至今仍被广泛使用在服务器端,记载于 RFC19945;
  • HTTP/1.1 是目前主流的 HTTP 协议版本,当初标准是 RFC2068 --> RFC2616;
网络基础 TCP/IP

TCP/IP是互联网相关的各类协议族的总称。通常使用的网络是在 TCP/IP 协议族的基础上面运作起来的,而 HTTP 是属于它内部的一个子集。TCP/IP 协议族按层次分层,被约定分为四层:应用层、传输层、网络层、数据链路层;TCP/IP 这样的分层是有好处的,试想如果互联网只是又一个协议组成,当该协议的某部分的设计需要变动的时候,则是牵一发而动全身,需要把整个协议变动,这样对于实际而言,是比较低效率的;而当把协议按一定的条件分层以后,下一层只需要向上一层暴露接口,而具体的实现细节则是隐藏起来,而当需要改某部分的细节实现的时候,只需要改动被隐藏的细节,而对于其他的分层是没有影响的。而且层次化以后,设计也变得相对简单起来。

应用层

该层的服务协议主要包括 FTP(File Transfer Protocol,文件传输协议)、DNS(domain Name System,域名系统),当然,HTTP 协议也是位于该层;

传输层

应用层的下一层是传输层,提供处于网络连接中的两台计算机之间的数据传输。该层代表的协议主要有两个:TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Data Protocol,用户数据报协议)

网络层

网络层用来处理网络上面流动的数据包。数据包是网络传输的最小单位,该层规定了通过怎样的路径(所谓的传输路线)到达对方的计算机,并把数据包传输送给对方。(与对方计算机之间通过多台计算机或网络设备进行传输的时候,网络层所起的作用就是在众多的传输选项中,选择一条传输线路)

链路层

用来处理连接网络的硬件部分。包括各种操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器),及光纤等物理设备可见部分。

利用 TCP/IP 协议族进行网络通信时,会通过分层顺序与对方进行通信,发送端从应用层往下走,接受端则从链路层往上走。与此同时,在发送端数据往下下发的时候,会被每一层封装对应的头部,在接受端则分拆每一层的头部。

负责传输的 IP 协议

IP(Internet Protocol,网际协议)作用是把各种数据包传输给对方。而需要确实把数据包发送给对方,则需要明确对方的 IP 地址和 MAC 地址。一般来说,IP 地址是可变的,而 MAC 地址基本不会改变。IP 间的通信依赖 MAC 地址。 在网络上,通信的双方在同一局域网(LAN)内的情况是比较少的,通常需要经过多台计算机和网络设备中转才可以连接到对方。而在经行中转的时候,会利用下一站的 MAC 地址来搜索下一个中转站的 IP,这里,会利用 ARP(Adress Resolution Protocol,地址解析协议),根据目的 IP 地址,反查出目计算机的 MAC 地址。当然,ARP 协议是解决同一个局域网的上的主机或者路由器的 IP 地址和硬件地址的映射问题,无法解析出另一个局域网的上的主机或者路由器的 MAC 地址。实际上,没有人可以全面掌握互联网中的传输情况,在到达通信目标前的中转过程中,计算机和路由器等网络只能获取很粗略的传输路线。

确保可靠性的 TCP 协议

TCP 协议位于传输层,提供可靠的字节流服务。所谓的字节流服务,是指虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流(“流”是指流入到进程或者从进程流出的字节序列)。而可靠传输则是,TCP 能够把数据准确可靠地传给对方。简而言之,TCP 协议为了把大容量的数据方便传输,就把数据分割看成无结构的字节流,并且 TCP 协议能够确认数据最终是否到达对方。

  • TCP 协议的三次握手

    • TCP 在双方进行通信前,首先需要确保已经建立链接,TCP 采用了三次握手策略。用 TCP 协议把数据包发送出去以后,TCP 不会对发送出去的情况置之不理,它一定会向对方确认是否成功到达。握手的过程中使用两个标志(flag):SYN(synchronize,同步)和 ACK(acknowledgement);

    • 发送端首先会发送一个带 SYN 标志的数据包给对方。接收端收到该标志以后,回传一个带 SYN/ACK 标志的数据包给发送方以表示确认信息,最后,发送端在回传一个带 ACK 的标志表示握手结束;

    • 如果该过程因异常中断,TCP 还会再次以相同的顺序发送相同的数据包;

  • TCP 协议的四次挥手

    • TCP 在双方通信结束以后,发送端和接收端都处于 ESTABLISHED 状态。这时 TCP 会采用四次挥手策略,在挥手的过程中用到的两个标志:FIN(finish)和 ACK;

    • 发送端首先会发送一个带 FIN 标志的数据包给对方,这是发送端会处于一个 FIN-WAIT-1 的状态。接收端收到该标志以后,回传一个 ACK 标志的数据包给对方,并且这时接收端会处于 CLOSE-WAIT 的状态,这时接收端还是可以往发送端发送数据。当发送端接收到接收端回传的 ACK 标志的数据包的时候,这时发送端会处于一个 FIN-WAIT-2 的状态。当接收端没有数据需要发送给发送端的时候,接收端会再次发送一个 FIN 标志的数据包给发送端,这时接收端就会处于 LAST-ACK 的状态。当发送端收到接收端回传的 FIN 标志以后,发送端必须对此进行确认应答,在确认报文段把带 ACK 的报文发送给接收端,然后接收端接收到该报文以后,便处于关闭的状态,而发送端则需要继续保持一个监听的状态在一段时间内;

超文本传送协议 HTTP

HTTP 使用了面向连接的 TCP 作为传输层协议,保证了数据的可靠传输。HTTP 不必考虑数据在传输的过程中被丢弃又怎样重传。但是,HTTP 协议本身是无连接的,也就是说,虽然 HTTP 使用了 TCP 连接,但是通信的双方在交换 HTTP 报文之前,是不需要先建立 HTTP 连接的。

  • HTTP 的报文结构(略)

  • HTTP 的状态码(状态码都是三位数字的,分为 5 大类,大概有 33 种。这五种类型的状态码可以归纳为以下)

    • 1XX 表示通知信息。如请求收到了或者正在处理;

    • 2XX 表示成功。如接受或知道了;

    • 3XX 表示重定向。如完成请求还需要采取进一步的行动;

    • 4XX 表示客户端的错误。例如请求的语法有误或者不能完成;

    • 5XX 表示服务器的错误。如服务器失效无法完成;

  • HTTP 的方法

    • GET 表示获取资源;

    • POST 表示传输实体主体;

    • PUT 表示传输文件;

    • HEAD 表示获得报文首部;

    • DELETE 表示删除文件;

    • OPTIONS 表示询问支持的方法;

    • TRACE 表示追踪路径;

    • CONNECT 表示要求用隧道协议连接代理;

HTTP 是不保存状态的协议

HTTP 是一种不保存状态,即无状态的协议。HTTP 协议自身不对请求和响应之间的通信状态经行保存。使用 HTTP 协议,每当有新的请求发送的时候,就会有新的响应产生。协议本身不保存之前一切的请求或者响应报文的信息。而这样子做的好处是为了更加快地处理大量的事务,确保协议的可伸缩性;HTTP/1.1 虽然是无状态协议,但为了实现期望的保持状态功能,于是引入了 Cookie 技术。

HTTP 持久化连接节省通信量

在 HTTP 协议的初始化版本中,每进行一次 HTTP 通信就要断开一次 TCP 连接。一般来说,比如一张网页往往会包含多中资源请求,例如文字、图片、音视频等...每一次请求都造成 TCP 的连接断开,这样就会增加通信量的开销;为了解决 HTTP 每一次请求都造成 TCP 的连接断开的问题,HTTP/1.1 和部分的 HTTP/1.0 想出来持久化连接(HTTP Persistent Connections),也称为 HTTP keep-alive。持久化连接的特点是,只要 HTTP 的两端没有明确提出断开连接,则保持 TCP 连接状态;

HTTP 的持久化连接的好处是,减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器的负载。也因为这样,HTTP 的请求响应时间也为之减少,这样页面的显示的速度也就相应提高;

管线化

持久化连接使得多数请求以管线化方式发送得以实现。管线化是指,一个请求发送以后,不用等该请求的响应报文,就可以直接发送下一个请求报文。这样的意义也是减少 HTTP 的请求响应时间。

使用 Cookie 的状态管理

前面提到,HTTP 协议是不保存状态的,也就是不对请求和响应之间的通信状态经行保存。但很多业务是需要 HTTP 有保存状态的,如需要登录的网站的访问等。为了解决上述的矛盾,HTTP 引入了 Cookie 技术。Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。

请求报文及响应报文的结构

压缩传输的内容编码

HTTP 协议中有一种被称为内容编码的功能。内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。

  • 常用的内容编码格式:

    • gzip(GUN zip)

    • compress(UNIX 系统的标准压缩)

    • deflate(zlib)

    • identity(不进行编码)

分割发送的分块传输编码

在传输大容量的数据时,通过把数据分割成多块能够让浏览器逐步显示页面,这种把实体分块的功能称为分块传输编码(Chunked Transfer Coding)

状态码告知从服务器端返回的请求结果
  • 2XX 响应结果表示请求被正常处理了。

    • 200 OK 表示从客户端发来的请求在服务端被正常处理了;

    • 204 No Content 该状态码表示服务器接收的请求已经被成功处理,但在返回的响应报文中不含实体的主体部分;

    • 206 Partial Content 表示客户端要求服务端返回部分的资源信息。响应报文包含 Content-Range 指定范围的实体内容;

  • 3XX 重定向

    • 301 该状态码表示请求的资源已被分配了新的 URI;

    • 302 临时性重定向;

    • 303 See Other 该状态码表示由于请求对应的资源存在着另一个 URl,应使用 GET 方法定向获取请求的资源;

  • 4XX 客户端错误

    • 400 Bad Request 该状态码表示请求报文中存在语法错误;

    • 403 ForBidden 该状态码表明对请求资源的访问被服务器拒绝了;

    • 404 Not Found 该状态码表明服务器上无法找到请求的资源;

  • 5XX 服务器错误

    • 500 Internal Server Error 该状态码表示服务器端在执行请求时发生了错误;

    • 503 Service Unavailable 该状态码表明服务器暂时处于超负荷或正在经行停机维护;

小结

这一篇笔记主要是从 HTTP 原理的宏观主体的描述,没有更深细节去研究吧。emmmm....下一篇网络原理应该是关于 TCP/IP 的。

转载于:https://juejin.im/post/5c6e7954518825622f12f6b1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值