HTTP协议原理(一)

    技术2022-07-11  94

    1、浏览器输入URL后HTTP请求返回的完整过程

    2、经典五层模型

    2.1、物理层

    主要作用是定义物理设备如何传输数据物理层其实就是电脑硬件相关的东西:网卡端口、网线、以及网线连接的光缆

    2.2、数据链路层

    在通信的实体间建立数据链路连接通过物理的设备建立一个类似电路的连接,两边可以传输数据,基础的传输数据0101这种

    2.3、网络层

    为数据在结点之间传输创建逻辑链路比如说,从我的电脑访问百度的服务器,如何寻找百度的服务器所在的地址,他就是一个逻辑关系,这个就是在网络层创建的

    2.4、传输层

    主要有两个协议:TCP/IP(常用)、UDP向用户提供可靠的端对端服务,从自己电脑到百度服务器之间连接之后,如何传递数据,传递的方式等等都在传输层传输层向高层屏蔽了下层数据通信的细节

    2.5、应用层

    为应用软件提供了很多服务(帮我们实现http协议,我们只要使用http相关工具,就可以传输数据,post/put)构建于TCP协议之上屏蔽网络传输的相关细节(自己内部处理好了,我们不用关注)

    3、HTTP协议的发展历史

    TCP连接和http请求不是一个概念,一个TCP连接中是可以发送多个http请求的

    3.1、http0.9

    只有一个命令GET没有header等描述数据的信息服务器发送完毕,就关闭TCP连接

    3.2、http1.0

    增加了很多命令POST、PUT、header增加了status code(描述服务端处理某一个请求之后他的一个状态) 和 header(不管是发送还是请求相关的一些数据描述、数据的操作方法)相关内容多字符集支持、多部分发送、权限、缓存等

    3.3、http1.1

    增加了持久连接(性能高)pipeline 在同一个链接中发送多个请求增加host(可以在同一个物理服务器上跑多个web服务,通过host字段判断哪个服务,提高物理服务的使用效率)和其他一些头命令

    3.3、http2

    所有数据以二进制传输同一个连接里发送多个请求不再需要按顺序来处理头信息压缩(有效减少带宽使用)以及推送(服务端可以主动发起数据传输,比如可以主动推送当前html所需的css文件,并行发送)等提高效率的功能

    4、HTTP的三次握手

    4.1、TCP连接创建时的三次握手

    三次握手避免无用连接,规避网络延迟导致一些服务器开销问题,如果没有握手成功表示该链接可以关闭了,不需要一直等待创建tcp连接的过程

    5、URI、URL和URN

    5.1、URI

    Uniform Resource Identifier 统一资源标志符用来唯一标识互联网上的信息资源包括URL和URN

    5.2、URL

    Uniform Resource Locator 统一资源定位器一个完整的url包含这些内容:http://user:pass@host.com:80/path?query=string#hash 协议用户密码认证(url中不安全,很少用)host.com用于定位这个资源所在的服务器在互联网中的位置,:80 端口,path 路由,这个路径直接对应web服务目录结构下的路径query 搜索参数hash 代表文档中的某一个片段,锚点定位 此类格式的都叫做URL,比如ftp协议

    5.3、URN

    永久统一资源定位符在资源移动之后还能被找到目前还没有非常成熟的使用方案

    6、http报文格式

    6.1、http请求方法

    用来定义对于资源的操作GET 获取POST 创建PUT 更新DELETE 删除

    http协议没有强约束,比如你也可以用post来更新,但是最好还是按规定协议,语义化,代码可读性好点

    6.2、http code

    定义服务器对请求的处理结果各个区间的code各有各的语义示例:200ok、401没有权限、500服务器错误等等好的http服务可以通过code判断结果

    7、一个简单的web服务器

    先安装node,之后新建个文件夹,新建server.js 内容如下 const http = require('http') http.createServer(function(request, response) { console.log('request come', request.url) response.end('123') }).listen(8888) console.log('server listening on 8888') 命令行运行server.js,命令:node server.js 然后就可以通过localhost:8888访问当前服务了
    Processed: 0.008, SQL: 9