概述

TCP 和 IP 是互联网中众多通信协议中最著名的了。
在本章中,我们会展开介绍 TCP/IP 相关的协议内容。
image.png

TCP/IP 协议历史

在 20 世纪 60 年代,美国国防部希望研究一种技术能够在通信传输的过程中,即使部分通信链路遭到地方的破坏,信息依然可以经过其他线路实现最终的消息传递。
image.png
为了实现这种容灾型的网络通信,分组交换技术应运而生。上述方案除了可以让通信链路高可用外,还能够使多个用户同一时间共享同一条通信线路进行通信,从而提供通信线路的使用效率。
最早验证分组交换技术的实践就是 ARPANET,它是全球互联网的鼻祖,不仅验证了分组交换技术的可行性,还取得了巨大的成功。而 TCP/IP 也正式在 ARPANET 中提出的协议,在 1982 年正式提出并在 1983 年成为了 ARPANET 网络唯一指定的协议。
同时,在 1980 年左右, BSD UNIX 操作系统在一定程度上得到推广,而 BSD UNIX 原生实现了 TCP/IP 协议,这也进一步推动了 TCP/IP 协议的发展。到了 20 世纪 80 年代后期,那些各自为政的网络设备供应商也都还是顺应潮流开发了符合 TCP/IP 的设备来满足用户的兼容性使用需求。

TCP/IP 标准化

我们在前文中提到过 ISO 提出的 OSI 标准协议,但事实上,OSI 协议其实并没有真正得到普及,而目前广泛使用的实际上是 TCP/IP 协议。
从字面上理解,很多人会认为 TCP/IP 协议实际上就是指 TCP 协议和 IP 协议两个协议。而事实上,我们通常所说的 TCP/IP 协议实际上是泛指利用 IP 进行通信的协议的统称,因此,TCP/IP 协议也会称为网际协议族。
image.png
TCP/IP 协议与其他的标准化协议相比,有两个显著的特点:开放性实用性
开放性是指 TCP/IP 协议是由 IETF 组织讨论制定的,而 IETF 本身就是一个允许任何人加入讨论的组织,人们通常通过电子邮件的方式进行日常讨论并允许任何人随时订阅。
实用性是指在 TCP/IP 协议标准化制定的时候,规范的制定本身并不是最重要的,反之首要任务是实现真正能够通信的技术。具体来说,当一个协议的大致规范确定下来后,人们就会在多个设备中实现该协议并进行通信,一旦发现问题再继续进行讨论和修正。而它正式通过不断的修正和优化,最终才能正式的发布最终的协议规范。因此,TCP/IP 协议具备很强的实用性。
IETF 组织制定的 TCP/IP 协议会被记录为 RFC(Request For Comment)文档并在网上公开。RFC 文档通过编号来管理每个协议的内容,例如 IP 协议的规范文档为 RPC297;TCP 协议的规范文档为 RFC793。RFC 文档一旦确定,就不能再随意的修改。想要扩展已有的协议规范,那么就需要有一个全新编号的 RFC 文档对其进行记录,类似的,如果想要修改某个协议的规范,需要重新发行一个新的 RFC 文档并废弃已有的 RFC 文档。
后来,人们发现每次查询 RFC 文档的编号太麻烦,为了,人们提出了采用 STD(Standard)方式管理文档编号,STD 用来记载哪个编号对应哪个协议,即使同一个协议的规范发生的更新,STD 的编号也不会发生变化。
此外,为了向互联网用户提供更多的信息,与 STD 类似,FYI 也开始标注编号组织,为了方便人们检索,也在其编号中涵盖了所涉及的 RFC 编号。
那么,对于一个协议想要正式加入 TCP/IP 协议要经过哪些阶段呢?

  • 互联网草案阶段
  • 记入 RFC 进入提议标准阶段
  • 草案标准阶段
  • 真正标准阶段

我们来展开看一下,首先,想要在 TCP/IP 协议中增加一个协议,首先需要哪些对协议提出意见的人撰写相关文档并发布在互联网上,这一阶段也称之为互联网草案阶段。在这个阶段,大家可以通过邮件进行讨论、在设备上实现、模拟和应用试验等。
互联网草案阶段的有效期是六个月,也就是说需要在六个月内将讨论的结果反应到草案中,否则该互联网草案将会被废弃。同时,如果得到了 IESG 的批准,那么就会被编入 RFC 文档,此时称为提议标准。
提议标准中所提出的协议接下来将会被众多的设备应用,如果得到 IESG 的认可,那就会成为草案标准。
想要从草案标准变为真正的标准,就需要更多的设备上实现并应用这个特定的协议。如果所有的协议制定人都觉得它非常使用且没什么问题,并且得到 IESG 的最终批准,这个草案协议才会成为标准协议。
image.png
从上述的介绍中可以看出,对于 TCP/IP 协议而言,一个标准协议其实往往已经是得到广泛验证并且充分的应用的协议了。

RFC 协议的下载地址:

“互联网” 的基本概念

我们经常听到人们提及互联网,那么互联网到底是什么呢?事实上,互联网是指由 ARPANET 发展而来、互联全世界的计算机网络。现在,互联网已经是一个专有名词了,英文单词为 The Internet。
那么,互联网和 TCP/IP 协议又有什么关系呢?简单来说,TCP/IP 就是为了互联网而开发定制的协议族,互联网协议就是 TCP/IP 协议。
在互联网中,每个网络都是由骨干网和末端网组成的。每个网络之间通过 NOC(Network Operation Center)相连。如果网络的运营商不同,那么它的网络连接方式和使用方法也会有所差异。连接这种异构网络需要 IX(Internet Exchange)的支持。总而言之,互联网就是众多异构的网络通过 IX 互联的一个巨型的网络。
image.png

TCP/IP 协议的分层模型

image.png
在前文中,我们已经了解了 OSI 七层参考模型的分类。下面,我们再来将 TCP/IP 协议的分层模型与 OSI 参考模型进行对照来进行理解。可以看出,TCP/IP 与 OSI 的分层模型上稍有区别,OSI 参考模型注重描述的是通信协议中必要的功能,而 TCP/IP 的分层模型则更强调计算机上实现协议应该在哪种程序中开发。

硬件(物理层)

在 TCP/IP 分层模型中,最底层是负责数据传输的硬件,这种硬件就类似于以太网或者电话线路等物理层设备。而 TCP/IP 本身对硬件并没有详细的约定,TCP/IP 更多的则是在网络互联的设备之间能够通信的前提下设置的协议。

网络接口层(数据链路层)

网络接口层利用以太网中的数据链路层进行通信,简单的可以理解为它是 NIC 的驱动程序,它是架在操作系统和硬件之间起到桥梁作用的软件。

互联网层(网络层)

互联网层使用 IP 协议,属于 OSI 模型中的第三层。IP 协议基于 IP 地址转发数据包。
image.png
在 TCP/IP 的互联网层和传输层的功能通常是由操作系统内置提供。连接互联网的所有主机和路由器都必须具备 IP 路由的功能。
在互联网层中,常见的具体协议包括:

  • IP:用于跨网络传输数据包,传输过程中使用 IP 地址来作为地址标识。此外,IP 协议版本是不具备重发机制的,属于非可靠性传输协议。
  • ICMP:IP 数据包在发送途中一旦发生异常无法到达目标地址时,需要给发送端一个发送异常的通知,ICMP 专门用于这一场景。同时,它也可以用于诊断网络健康状况。
  • ARP:用于从分组数据包的 IP 地址中解析出 MAC 地址的协议。

    传输层

    传输层最核心的功能就是能够让应用程序之间实现通信。对于一台计算机而言,同一时间会运行着多个程序,因此需要能够分清哪些程序与哪些程序之间在进行通信,而其中识别的方式就是通过端口号。
    TCP/IP 的传输层包括两个代表性的协议,分别是 TCP 协议和 UDP 协议,我们来依次了解一下。

  • TCP:TCP 协议是一种面向有连接的传输层协议,它可以保证通信传输过程中的可靠性并且能够正确处理丢包、乱序等问题。然而,它的缺点是需要在每次数据传输前后建立和断开连接,导致流量的浪费性能较低。

  • UDP:UDP 协议是一种面向无连接的传输层协议,UDP 传输过程中不会关注目标地址是否真的收到了数据包,需要在应用层面进行兼容。UDP 协议常用于广播、视频通信等场景。

    应用层(会话层以上)

    TCP/IP 的分层中,将 OSI 参考模型中的会话层、表示层和应用层的功能都集中到了应用程序中实现。这些功能在具体的实现过程中,可能由单一程序实现、也可能由多个程序来组合实现。
    TCP/IP 应用的架构很多时候属于客户端/服务端模型。在这种模型中,服务端的程序会提前在主机上部署准备随时接收客户端的请求。
    应用层的协议非常多,我们来了解其中一些典型的协议:

  • WWW:WWW 协议是推动互联网发展的原动力,基于 WWW 协议,用户可以在浏览器在便捷的访问各种网页等。浏览器与服务端之间的通信协议是 HTTP 超文本传输协议,传输数据的主要格式为 HTML。其中,HTTP 属于应用层协议、HTML 属于表示层协议。

  • Email:Email 就是我们常说的电子邮件,其依赖的协议为 SMTP 协议。早期的电子邮件只能发送文本格式,现在的电子邮件格式经过 MIME 协议扩展后已经可以发送声音、图像等内容。
  • FTP:FTP 是一种文件传输协议,可以将保存在其他计算机上的文档下载到本地磁盘中,或者将本地磁盘文件上传到其他计算机上。在使用 FTP 进行文件传输时,会建立两个 TCP 连接,分别用于用于控制和数据传输。
  • Telnet 与 SSH:Telnet 和 SSH 都是用于远程登录的网络协议,即可以远程登录其他服务器并操作其他服务器上的程序运行。
  • SNMP:SNMP 协议常用于网络的管理。其中,使用 SNMP 协议管理的主机、网络设备称为 SNMP Agent,管理 SNMP 探测任务的服务叫做管理器。而 SNMP 正是管理器和 Agent 直接通信的协议。