backend-end-101

后端101

1 聊一下什么是后端


后端的主要作用就是处理响应前端发来的请求
一个例子:
前端: 查看一下当前用户列表,并告诉我男女比
后端: 从数据库中查找用户列表,并计算男女比,将结果返回

问题:

  • 前端如何发送请求到后端
  • 后端如何解析请求

1.1 谈一下网络请求

网络请求本质上就是发送方准备好了一堆01这样的二进制数据,然后通过你家的网线传输了出去,在中间各种路由器/交换机/服务器转发后到达了接收方的手中。

例子

这个发送方可以是你的浏览器,当你在Chrome的地址栏敲下 http://www.baidu.com并按下回车的时候,你的浏览器首先发送了一个请求到DNS服务器查询了这个域名对应的ip(DNS的原理大家动手查查)。
然后它尝试与这个ip指向的服务器建立一个TCP连接(TCP的3次握手,4次挥手大家再动手查查),建立了TCP连接之后呢,你的浏览器发送了一个http请求。

百度的服务器接受到这个http请求之后,将需要显示给你的HTML文本放在了一个http响应中,返回给你。浏览器接收到这个响应之后,拿出了HTML文本后,根据需要可能还会请求CSS/JS/图片等等资源,请求形式和之前浏览器请求http://www.baidu.com类似,这次可能请求的是http://www.baidu.com/css/index.css。最后浏览器解析出了一个你看到的百度网页的样子。

  • 什么是TCP连接/什么是http请求?我们接下来看看OSI 7层协议

tcp握手讲解

1.2 OSI 7层协议

  • 啥是协议?
    协议是经过合作各方同意的一个统一标准
    同理网络协议就是一个经过商讨后得出的规定网络之间如何进行通信的标准

  • 什么是OSI 7层协议
    OSI 7层协议是一个比较抽象的模型,(因为实际上数据包就是一堆二进制代码,没有层这个概念),但它的核心思想很具体。就是规定网络传输过程中数据包的二进制数据的格式/内容以及传输方式

    而之所以分成7层是因为需要将每一个通信模块分离,每一个通信模块之间只提供接口,而不关心内部的实现,以这种方式进行设计,只要接口没变,内部的实现方式可以随意改变,使得每一个通信模块可以独立设计,也可以很方便的利用其他模块提供的接口进行新的模块设计。

除了物理层外从上往下每一层都会在原有的数据包上加上特定的帧头(就是包含特定信息的二进制数据)

比如网络层帧头,其中包含了目的地网络地址,用于指示沿途的路由器,这一串二进制流的目的地是哪里,路由器查询自己的网络地址表,决定再发给更靠近目的地的下一跳路由器。

之前提到的HTTP协议/DNS协议就是一个位于应用层的协议,而TCP协议则是位于传输层的一个协议。HTTP协议主要是确定了发送的数据包的内容应该是什么样的格式,而TCP协议主要是帮助你进行一个可靠的传输。

可想而知由应用程序发出的一个网络请求沿着应用层向下每层都添加了特定的帧头,最后形成一个完整的请求包。

http请求就是使用http协议的一个网络请求。

  • 什么叫使用http协议呢?接下来关注一下传输层及其以上的部分

2 关注一下传输层及其以上的部分

2.1 我们为啥需要在TCP协议之上建立HTTP等协议?

其实吧, 抛开HTTP协议, TCP连接也可以很好的工作, 我们也可以愉快的传输数据。
但是我们传输的数据没有一个统一的标准,即大家应该如何来解析你发来的数据呢?
你发送了一堆二进制,它确实是数据,但接受方假如不知道如何解析你发来的数据,他就无法知道是按照UTF-8编码模式来解析你的请求,还是当作一堆数字,还是说你想传递的是一张图片呢?
我们不得而知, 这堆数据不能叫信息,而是垃圾。
通信中的双方似乎讲的不是一种语言。

2.2 HTTP协议来了

所以吧 我们就想在TCP协议之上写一个应用层协议来告诉通信中的双方应该如何解析发送来的数据,也就有了HTTP这一些的协议

2.3 补充一下

你不仅可以建立在TCP协议之上 你还可以建立在UDP等其他协议上
(传输层协议不只有TCP,还有比如UDP,DNS协议就是建立在UDP协议之上的)

2.4 那我们自定义协议写一个简单的客户端与服务端吧

好吧,既然如此那就让我们来看一个建立在TCP协议之上的一个自定义协议的服务端和客户端, 我叫它NP协议吧(naive protocol)

2.5 我们要先知道下socket

在TCP连接中有两个端点,都用主机的IP地址加上主机上的端口号作为端点的表示,而我们通常将这种端点就叫做套接字(socket)。它是TCP连接中的抽象,是操作系统提供的操作协议栈的一种接口。

其实socket也提供了建立在UDP协议上的接口(但这都是后话了)
我们利用socket可以在TCP协议上直接发送数据,或者说定义一个新的协议。

2.6 一个自定义协议的例子

例子使用c语言
包含一个客户端与服务端,两者基于socket自定义协议通信
代码见内训资料贴压缩包

3 HTTP

  • 那把刚才的自定义协议换成HTTP协议就是我们经常在用的HTTP server的协议基础啦~
    你们常用的ftp server就是把自定义协议 换成ftp协议啦
    还有其他的一些协议大家自己了解下吧
    (DNS/SSH/HTTPS/…)

  • HTTP协议长什么样呢?
    简单来说HTTP协议
    HTTP 协议入门

3.1 一个简单的HTTP服务

假设大家装好了python3
那么尝试在一个目录下运行

1
python -m http.server -p 8000

然后打开8000端口

3.2 用Node.js的http模块写一个简单的服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const http = require('http')
const port = 3000

const requestHandler = (request, response) => {
console.log(request.url)
if(request.url === "/hello"){
response.end('in /hello')
}else if(request.url === "/user"){
response.end('in /user')
}else{
response.end('Hello Node.js Server!')
}
}

const server = http.createServer(requestHandler)

server.listen(port, (err) => {
if (err) {
return console.log('something bad happened', err)
}
console.log(`server is listening on ${port}`)
})