socks 专栏 —— 4. 理解 TCP 和 HTTP 的关系

·  阅读 50

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);
复制代码

然后使用浏览器访问这个服务器,控制台会打印如下输出:

4-1

可以看到,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 端口。

分类:
前端
标签:
收藏成功!
已添加到「」, 点击更改