小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
TCP 和 UDP 属于传输层协议,要构建高效的网络应用,需要从传输层入手。但是对于普通的应用场景,可以直接使用已有的应用层协议比如 HTTP、SMTP。node 提供的基本的 http 和 https 模板,用于对于 HTTP 和 HTTPS 的封装,例子也十分的简单。
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
HTTP 协议是什么
下面先介绍一下 HTTP 协议~
HTTP 是超文本传输协议,英文是 HyperText Transfer Protocol。HTTP 是应用层协议,构建在 TCP 协议之上。HTTP 链接的两端是浏览器和服务器,也就是著名的 B/S 模式。如今的 web 就是 HTTP 的应用。
HTTP 的发展是 W3C 和 IETF 组织合作的结果,他们最终发布了一系列的 RFC 标准
HTTP 协议的报文
我们启动上面服务端的代码,获取下 HTTP 的报文,通过 -v 的选项,可以显示这次通信中所有的报文信息
curl -v http://127.0.0.1:1337/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 1337 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:1337
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/plain
< Date: Sat, 09 Oct 2021 05:04:20 GMT
< Connection: keep-alive
< Transfer-Encoding: chunked
<
Hello World
* Connection #0 to host 127.0.0.1 left intact
* Closing connection 0
整体报文分为几部分内容,一是 TCP 三次握手的过程
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 1337 (#0)
二是客户端向服务端发送请求报文
> GET / HTTP/1.1
> Host: 127.0.0.1:1337
> User-Agent: curl/7.64.1
> Accept: */*
>
三是服务端处理完成后,向客户端返回响应头和响应体
< HTTP/1.1 200 OK
< Content-Type: text/plain
< Date: Sat, 09 Oct 2021 05:04:20 GMT
< Connection: keep-alive
< Transfer-Encoding: chunked
<
Hello World
最后是结束会话的信息
* Connection #0 to host 127.0.0.1 left intact
* Closing connection 0
从上面的报文可以看出,HTTP 是请求响应式的,通过一问一答的方式实现服务
我们常用的浏览器,实际上是一个 HTTP 的代理工具,用户的行为通过它转化为 HTTP 请求报文发送给服务端,服务端处理请求后,将响应报文发送给浏览器,浏览器解析后将内容呈现在页面上。
以浏览器打开一个图片地址为例:
- 浏览器构造 HTTP 请求报文发送给图片服务端
- 服务端判断报文中要请求的地址,将磁盘中的图片文件,以报文的形式发送给浏览器
- 浏览器接收到图片,通过渲染引擎展示给用户
在这个过程中 HTTP 服务只做了两个事情,处理 HTTP 请求和发送 HTTP 响应
HTTP 报文包括两部分,报文头和报文体,上面例子中带有>和<的属于报文头,因为 GET 请求请求头中没有报文体,响应报文中 Hello World 是报文体。
以上是 HTTP 协议介绍,欢迎评论和点赞~