# 计算机网络基础

## 什么是计算机网络？

维基百科上的定义是：

> 计算机网络（英语：computer network），通常也简称网络，是指容许节点分享资源的数字电信网络。在电脑网络，电脑设备会透过节点之间的连接（数据链路）互相交换数据。

用大白话来说，就是将两台以上的计算机连接起来，使得它们可以相互通信。

## 怎样把计算机连接起来？

### 直接连接

最简单的情况，就是用一根线把需要进行通信的两台计算机连接起来，这根线加上这两台计算机就组成了一个简单的网络。

这根连接线一般是电缆、光纤之类的媒体介质，一般我们把它叫做`链路 link`，而网络中的计算机一般叫做`节点 node`。

![](https://cdn.jsdelivr.net/gh/suukii/Articles/assets/network/point_to_point.png)

这种用一个链路直接连接两台计算机的方式叫做`点对点 point-to-point`连接，还有另一种连接方式，多台计算机可以连接到同一个链路上，叫做`多路访问 multiple-access`，比如 Wi-Fi。

![](https://cdn.jsdelivr.net/gh/suukii/Articles/assets/network/multiple_access.png)

但这种连接方式有两个限制，一是网络可覆盖的范围有限，二是可连接的节点数有限，所以一般这种连接方式都是用于`最后一里 last mile`连接终端用户和互联网的。

### 间接连接

当然，计算机之间两两通过链路来连接是可以实现相互通信的目的，但这只适用于网络中只有少数几台计算机的情况。

![](https://cdn.jsdelivr.net/gh/suukii/Articles/assets/network/point_to_point_several_computers.png)

如果要通信的计算机很多，那每台计算机上的连接线就会多到难以管理。

![](https://cdn.jsdelivr.net/gh/suukii/Articles/assets/network/point_to_point_such_a_mess.png)

> 这还是只有几台计算机的情况，连接线看起来已经很乱了，想象下如果现实中互联网上的计算机是用这种方式连接的，那情况就有点难以控制了。

但幸好，要实现两台计算机互相通信，不一定要用链路直接连接它们，我们还可以通过一个中间节点来把它们连接起来。

![](https://cdn.jsdelivr.net/gh/suukii/Articles/assets/network/using_router_1.png)

像这样，每个节点都连接了一个或者多个链路，而那些连接了两个以上链路的节点(图中的 Router)主要是负责把传进来的消息再转发出去，这些 Router 一起组成了一个`交换网络 switched network`(这是一个网络中的网络，网络是可以嵌套的)。

图中的云朵把节点划分为两种：

* 云朵中的节点：负责转发消息，一般叫做`交换机 switch`。
* 云朵外的节点：它们就是想要向外发送消息或者想要从外部获取消息的计算机设备，一般叫做`主机 host`。

还有一种连接多台计算机设备的方式，我们可以把交换网络抽象出来，用一个节点将它们两两连接，这样就形成了`互联网 internet`。而连接两个网络的节点一般叫做`路由 router`或者`网关 gateway`，它们的功能和上文提到的交换机一样，负责把从一个网络传进来的消息转发给另一个网络。

![](https://cdn.jsdelivr.net/gh/suukii/Articles/assets/network/internetwork.png)

互联网自己本身也是一个网络，所以它们也可以被抽象出来，然后通过节点连接起来，形成一个更大的网络，总而言之，这可以是一个递归的过程，所以理论上，我们构建的网络可以是无限大的。

## 计算机如何进行通信？

现在我们把所有计算机都通过某种直接或间接的方式连接起来了，但我们还没有实现`主机对主机 host-to-host`的连接。假设计算机 A 想要向计算机 B 发送一个消息，要如何在网络中找到通往计算机 B 的那条路线把消息传输过去呢？

解决的办法就是给网络中的每台主机都分配一个独一无二的`地址 address`，当源机想要向目的机发送消息时，它会同时把消息和目的机的地址发送出去，如果源机和目的机不是直接连接的话，网络中的交换机和路由就会根据指定的地址来决定如何把消息转发给出去，最后找到目的机并把消息转发给它。这个`根据指定地址决定如何转发消息`的过程就叫做`路由 routing`。

## 小结

网络可以递归地定义为由`两个或以上节点通过链路连接组成`或者由`两个或以上网络通过节点连接组成`。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://suki.gitbook.io/notes/articles/network/basis_of_computer_network.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
