4. 理解 TCP 和 HTTP 的关系
凡是对计算机网络有初步了解的,都应该知道 tcp/ip 四层模型,知道 HTTP 位于应用层,TCP 位于传输层,并且经常看到以下这句话:
HTTP建立在 TCP 协议之上
如何理解这个之上呢,做个小实验看一下就清楚了。
我们先在本地搭建一个 TCP 服务器
// server.js
const net = require('net');
const server = net.createServer((socket) => {
socket.on('data', (data) => {
console.log(data.toString());
});
});
server.listen(4001);
然后使用浏览器访问这个服务器,控制台会打印如下输出:
可以看到,TCP 服务器接受到的是一个字符串,内容是 HTTP Request 报文。而此时浏览器会一直处于 loading 状态,因为服务器没有返回任何数据。
我们修改一下服务端代码,使其返回一个 HTTP Response
// server.js
const net = require('net');
const server = net.createServer((socket) => {
socket.on('data', (data) => {
console.log(data.toString());
const html = `
<!DOCTYPE html>
<html>
<head>
<title>hello</title>
</head>
<body>
<div style="color:skyblue;">hello world</div>
<body
</html>`;
const body = Buffer.from(html); // 这个 body 主要用来算 length
const rawResponse =
'HTTP/1.1 200 OK\r\n' +
'Content-Type: text/html\r\n' +
`Content-Length: ${html.length}\r\n` +
'\r\n\r\n' +
body;
socket.write(rawResponse);
});
});
server.listen(4001);
此时再用浏览器访问:
可以看到显示出了在服务器里的 HTML 页面。这也就是 HTTP 的本质:一个 HTTP Request 对应一个 HTTP Response;Request 和 Response 都是字符串文本。
总的来说,TCP 是控制传输的协议。而传输的具体内容是什么,需要遵循什么规则,就由 TCP 上层的协议规定了。类似的,前后端交互一般使用 HTTP 传输 JSON 数据,而 JSON 这个格式也是在 HTTP 之上所约定的一个“协议”而已。你可以使用 HTTP 传输任何格式的文本,所以你也可以用 TCP 传输任何格式的数据。
此外,你应该也知道了,HTTP 的端口实际上是 TCP 端口。