HTTP协议原理(一)

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访问当前服务了
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值