> For the complete documentation index, see [llms.txt](https://lfool.gitbook.io/computer-network/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lfool.gitbook.io/computer-network/di-er-zhang-tcpip-ji-chu-zhi-shi.md).

# 第二章：TCP/IP基础知识

**OSI 参考模型 和 TCP/IP 的对应关系：**

![](https://2396550738-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M8zvqNNVZctOHx6v8No%2F-MDNib_5ow1DaeJBMfU-%2F-MDQQQjGDHEp1J9OynOn%2Fimage.png?alt=media\&token=8ccc7eeb-4945-4277-81a0-4bb7e018fe62)

## 1. TCP/IP 出现的背景及其历史

### 从军用技术的应用谈起

最开始，通信传输运用在军用。为了在遭到敌方攻击和破坏，也可以经过迂回实现通信，分布式通信的概率出现了，最后分组交换技术便应运而生。

## 2. TCP/IP 的标准化

## 3. 互联网基础知识

### 互联网定义

最开始 **互联网（Internet）** 是指将多个网络连接使其构成 一个更大的网络。

现在，**互联网（The Internet）** 变成了专有名词，是指由 ARPANET 发展而来、互连全世界的计算机网络。

### 互联网与 TCP / IP 的关系

互联网进行通信时，需要相应的网络协议。因此，**互联网的协议就是 TCP/IP，TCP/IP 就是互联网的协议**。

### 互联网的结构

小范围的网络互相连接就形成了连接全世界的**互联网**。

互联网中的每个网络都是由**骨干网（BackBone）**&#x548C;**末端网（Stub）**&#x7EC4;成的。

每个网络之间通过 **NOC（Network Operation Center 网络操作中心）**&#x76F8;连。

如果网络的运营商不同，就称为**异构网络**。

如果异构网络相连，就需要有 **IX（Internet Exchange 网络交换中心）**&#x7684;支持。

![](https://2396550738-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M8zvqNNVZctOHx6v8No%2F-MDQUXTnhNGZClLm39kH%2F-MDQfY_d5FiqYTkdQmpf%2Fimage.png?alt=media\&token=fe9586c7-25b4-490b-ad10-152ec3b6cc31)

### ISP 和区域网

ISP：Internet service provider，网络服务提供商

区域网：在特定区域内由团体或志愿者所运营的网络。

连接互联网需要向 ISP 或区域网提出申请。

## 4. TCP/IP 协议分层模型

### TCP/IP 与 OSI 参考模型

![](https://2396550738-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M8zvqNNVZctOHx6v8No%2F-MDQl-_YqMqT7eqWg1Hv%2F-MDQm0hWVYY8VGNIsfs5%2Fimage.png?alt=media\&token=21cb1d09-a969-47ef-987f-383a561099bc)

### 硬件（物理层）

TCP/IP 的最底层是负责数据传输的硬件。这种硬件就相当于以太网或电话线路等物理层的设备。

### 网络接口层（数据链路层）

网络接口层利用以太网中的数据链路层进行通信。

### 互联网层（网络层）

### 传输层

### 应用层

## 5. TCP/IP 分层模型与通信示例

### 数据包首部

![](https://2396550738-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M8zvqNNVZctOHx6v8No%2F-MDTKB6k2PgV4obTrM9H%2F-MDTOi99DDJOrYKKXTJ4%2Fimage.png?alt=media\&token=c6964b09-22dd-40e7-a16d-80eacc563396)

每个分层中，都会对所发送的数据附加一个首部，在这个首部中包含了该层的必要信息，如发送的目标地址以及协议相关的信息。

通常，为协议提供的信息为**包首部**，所要发送的内容为**数据**。

> **包、帧、数据报、段、消息**
>
> * 包：全能性术语
> * 帧：表示数据链路层中包的单位
> * 数据报：表示 IP 和 UDP 等网络层以上的分层中包的单位
> * 段：表示 TCP 数据流中的信息
> * 消息：指应用协议中数据的单位

> **包首部**
>
> 数据包包括两个部分：协议要用到的首部，上层传过来的数据
>
> 首部的结构由协议的具体规范详细定义。如：
>
> * 识别上一层协议的域应该从包的哪一位开始取多少比特
> * 如何计算校验和并插入包的哪一位
>
> 所以，在包的首部，**明确标明了协议应该如何读取数据**
>
> **最后，每个包首部至少包含两个信息：**
>
> * 发送端和接收端地址
> * 上一层协议类型

### 发送数据包

**示例：**&#x41; 向 B 发送邮件

* **应用程序处理**
  * **（应用层）**&#x542F;动应用程序新建邮件，将收件人邮箱填好，再由键盘输入邮件内容，鼠标点击 发送 按钮就可以开始TCP/IP 通信
  * **（表示层）**&#x5E94;用程序中会进行编码处理
  * **（会话层）**&#x7F16;码转化后，实际邮件也不一定会马上发出，因为有些邮件软件有一次同时发送多个邮件的功能。像这种何时建立连接、何时发送数据的管理，属于 OSI 参考模型的 会话层功能
  * 应用在发送邮件的那一刻建立 TCP 连接，从而利用这个 TCP 连接发送数据。首先将应用数据发送到下一层的 TCP，再做实际的转发处理
* **TCP 模块的处理**
  * TCP 根据应用的指示（根据会话层建立销毁连接的时机），负责建立连接、发送数据以及断开连接
  * TCP 提供将应用层发来的数据顺利发送到对端的可靠传输
* **IP 模块的处理**
  * 首先，IP 将 TCP 传来的首部和数据部分当做自己的数据部分，并添加自己的 IP 首部
  * IP 首部中包含 接收端 IP 地址、发送端 IP 地址
  * 紧随 IP 首部的还有用来判断后面数据是 TCP 还是 UDP 的信息
  * IP 包生成以后，参考路由控制表决定接受此 IP 包的路由或主机。随后，IP 包将被发送给连接这些路由器或主机网络接口的驱动程序，以实现真正的发送数据
  * 如果尚不知道接收端的 MAC 地址，可以利用 ARP 查找。只要知道了对端的 MAC 地址，就可以将 MAC 地址和 IP 地址交给以太网的驱动程序，实现数据传输
* **网络接口（以太网驱动）的处理**
  * 同理，从 IP 传过来的 IP 包，对于以太网驱动来说就是数据，给数据附加上自己的首部并进行发送处理
  * 以太网首部中包含：接收端 MAC 地址、发送端 MAC 地址、标志以太网类型的以太网数据的协议
  * 同时，在整个包的最后面，加上 FCS
  * 根据上述信息产生的以太网数据将通过物理层传输给接收端

![](https://2396550738-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M8zvqNNVZctOHx6v8No%2F-MDTbr2CYYsRsfF7N9Wj%2F-MDTbyJRNo9IADbgS2Ac%2Fimage.png?alt=media\&token=d9920a5a-588e-471f-9d05-2c23787069c4)

### 经过数据链路的包

![](https://2396550738-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M8zvqNNVZctOHx6v8No%2F-MDTbr2CYYsRsfF7N9Wj%2F-MDTeRc9CAGzjtdSYIku%2Fimage.png?alt=media\&token=63f04fca-a656-496d-8b02-354206458a80)

### 数据包接收处理

包的接收流程是发送流程的**逆序过程**

* **网络接口（以太网驱动）的处理**
  * 主机收到以太网包以后，首先从以太网的包首部找到 MAC 地址判断是否为发给自己的包，如果不是就丢弃数据。
  * 如果是发送给自己的包，就检查包首部的类型域从而确定以太网协议所传过来的**数据类型**
    * 如果数据类型为 IP 包，则传给处理 IP 的子程序
    * 如果数据类型为 ARP 协议，则传给 ARP 处理
    * 若无法识别类型，则丢弃
* **IP 模块的处理**
  * 收到 IP 包后，做类似的处理，根据包首部的 IP 地址和自己的 IP 匹配，则查找上一层的协议
    * 若上一层协议为 TCP，则传给 TCP 处理
    * 若上一层协议为 UDP，则传给 UDP 处理
  * 对于有路由器的情况下，往往目标地址不是自己，需要进行转发，则根据路由转发表进行转发包
* **TCP 模块的处理**
  * 检查校验和，判断数据是否被破坏
  * 检查是否按照序号接收数据
  * 检查端口号，确定具体应用程序
  * **（可靠传输）**&#x6570;据接收完毕后，接收端会发送一个 “确认回执” 给发送端。若这个信息没有顺利达到发送端，那么发送端会认为数据没有收到，从而一直反复发送数据
  * 数据完整的接收后，会传给由端口号识别的应用程序
* **应用程序的处理**
  * 接收端应用程序会直接接收发送端发送的数据。通过解析数据可以获知邮件的收件人的地址。如果主机 B 上没有收件人的邮件信箱，那么主机 B 就返回一个 无此收件地址 的报错信息
