初,中级程序员不得不了解的 HTTP 知识!

基本知识点

  1. HTTP的诞生
  2. HTTP通信的过程
  3. HTTP的特点
  4. HTTP的内容
  5. HTTP的持久连接和管线化(管道化)
  6. cookie的由来
  7. webscoket,AJAX和HTTP的关系
  8. HTTP和HTTPS的关系

    HTTP的诞生

    在计算机刚开始流行的时候,一般都是一人一机,每个机器并没有通信。WWW(也就是现在的web)为了让全世界研究者只是共享,就提出了三项技术,分别是http,html,url。其中http就是控制客户端和服务端之间通信的协议(协议就像是我们平时交流的语言,只有语言相通,才可以交流)

HTTP通信的过程

HTTP和TCP/IP协议的关系

HTTP协议的通信过程简单来说就是请求和响应的过程,客户端发送请求,服务端接收请求并作出响应。复杂点儿说,就是基于TCP/IP协议进行通信,这里需要分清楚TCP/IP协议与TCP协议以及IP协议之间的区别,乍一看,我们会误认为 TCP/IP 协议 = TCP协议 + IP协议
这样理解有些片面,其实TCP/IP是一个协议族,是互联网相关的各类协议族的总称,它包含了我们常见的协议:HTTP协议,TCP协议,IP协议等。那么HTTP协议和TCP协议以及IP协议有什么关系呢,看下面就知道了:
应用层:HTTP,HTML,URI,FTP,MIME,TLS/SSL,DNS等
传输层:TCP,UDP等
网络层:IP,ARP等
物理层:由底层网络定义的协议

我们只需要知道HTTP,TCP,IP分别位于应用层,传输层和网络层,并且信息在传输过程中是这样的,发送端在要发送的数据每层添加首部,如下

  1. 应用层(HTTP)添加头部
  2. 传输层(TCP)添加首部
  3. 网络层(IP)数据包
  4. 物理层(以太网首部)
    接收端接收到数据后就像剥洋葱一样再逐层的剥开,获取最终数据。
    TCP三次握手与四次挥手

    TCP的三次握手指的是客户端和服务器的连接的过程,TCP的四次握手是与服务器的断开的过程。一次完整的请求由三次握手和四次握手组成。
    HTTP的特点:
    简单快速
    灵活
    无连接
    无状态

前面两点很好理解,解释一下后面两点。无连接指的是每次连接只处理一个请求,服务器在处理完请求并收到应答后会断开连接;无状态是指服务器对传递的内容没有记忆

HTTP的内容(重点)

报文

HTTP报文分为请求报文和响应报文
请求报文包括:请求行,请求头,空行,请求体
响应报文包括:状态行,响应行,空行,响应体

方法

一般在请求报文中都会将请求方法放在请求行的第一个,比较常见的方法有以下几种:

  1. GET:获取资源
  2. POST:传输实体内容
  3. PUT:传输文件
  4. DELETE:删除文件
  5. HEAD:获取报文首部
    状态码

    http状态码是在响应报文中出现的,表示此次响应的状态,大致可划分为
    1XX:请求接收成功,需要继续处理
    2XX:请求接收成功,并且服务端已经进行处理
    200:请求已经成功,会返回响应的数据
    3XX:重定向,即URL发生了改变
    301:永久重定向,即URL已经发生了改变
    302:临时重定向,即URL只是暂时发生改变
    304:请求的网页没有发生改变,可以直接从缓存服务器中取资源
    4XX:请求发生了错误
    401:请求需要进行验证
    403:页面访问被禁止
    404:请求的资源不存在
    5XX:服务端发生了错误

HTTP的持久连接和管线化

持久连接

前面我们在说HTTP特点的时候说过, HTTP是一种无连接,无状态的协议。而TCP是有状态的长连接,为什么HTTP是基于TCP,但HTTP却是无连接?

 因为HTTP每次请求完成后就会关闭TCP协议,但是我们可以通过编程自己控制TCP的关闭时间。由于每次请求都要连接TCP协议,效率很低,所以从HTTP/1.1过后,就开启了一个keep-Alive来保持连接,但是这个连接也是有时间限制的,不同的服务器有不同的处理,自己也可以设置。

管线化

以前请求和响应模式基本是这样的:

请求1 -> 响应1 -> 请求2 -> 响应2 。。。

有了管线化过后请求和响应模式就变成了这样:

请求1 -> 请求2 -> 响应1 -> 响应2 。。。

也就是说,现在可以先一次进行很多次请求,而不是像以前那样,只有上一次的响应成功后才可以下一次请求,这样大大的提高了效率。

cookie的由来

之前我们说过,HTTP是无状态的,这样每次跳转到新页面时,都需要重新登录一次,麻烦又浪费时间。所以就诞生了cookie,cookie是进行状态管理的,里面会存放之前登录的信息。实现原理是客户端第一次发送请求后,服务端响应时会在响应头中添加一个set-cookie信息,要求客户端保存cookie信息,客户端在下次请求时,会将这个cookie信息自动发送给服务端,服务端接收后就会根据cookie信息进行匹配。

webscoket,AJAX和HTTP的关系

随着WEB信息量越来越大,HTTP的性能优化也变得越来越重要了,其中AJAX就是为了解决HTTP每次发送请求都会更新整个页面的问题,有的时候只是改变了一点点,甚至是无关紧要的东西时都会发生整个页面的更新,这样会造成很大的浪费。所以出现了AJAX,AJAX是一个异步刷新技术,其核心在于XMLHttpRequest。

我们会发现无论怎么改,服务器都是处于被动状态,只能接受客户端的请求,这样客户端只有通过经常发送请求来确认是否有数据更新,但是大多数时候都是没有数据更新的,这样会造成很大的浪费,所以就产生了webSocket协议,这个协议就是为了改变服务器的被动状态,使用这个协议后,服务端可以主动给客户端发送信息,这样就意味着客户端只需要一次请求,就可以保证数据的实时更新,而不是像之前那样定时发送AJAX请求的来实现定时更新

HTTP与HTTPS之间的关系

其实HTTPS不是一个新的协议,只是在HTTP和TCP之间添加了一层SSL协议,上面诞生的新技术是为了提高HTTP通信的性能,而HTTPS是为了提高通信过程中的安全性:
HTTP + 加密 + 认证 + 完整性保护 = HTTPS(引自《图解HTTP》)

文章转载自 cpp软件架构狮 2018-12-13 19:54:20
感谢这么好的干货,文章讲的不错,就是太粗糙,但是关于http如果想要详细的话可以说是一个单独的科学了,这里感谢各位前辈的开源,分享精神,水滴拜谢!

本作品采用《CC 协议》,转载必须注明作者和本文链接
YLR
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

似乎没有提到最新的 HTTP 2。

5年前 评论
YLR

@Wi1dcard 只是略知一二,不对之处望批评指正,有最新的技术还望不吝赐教!

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!