一文详解 TCP/IP 协议

荷西:你是不是一定要嫁个有钱人。
三毛:如果我不爱他,他是百万富翁我也不嫁,如果我爱他,他是千万富翁我也嫁。
荷西:。。。说来说去你还是要嫁有钱人。
三毛:也有例外的时候。
荷西:如果跟我呢?
三毛:那只要吃得饱的钱也算了。
荷西思索了一下:你吃得多吗?
三毛十分小心的回答:不多,不多,以后还可以少吃点。
---- 三毛《撒哈拉的故事》

文章内容主要摘抄自《STM32 物联网实战教程》,个人有些许改动。

一、TCP/IP 模型 概述

计算机网络在物联网应用中起到举足轻重的作用,它是硬件设备连接网络的基石。

目前提到计算机网络协议指的就是著名的 TCP/IP 协议,只要是连接到网络的设备其内部都是使用的 TCP/IP 协议。TCP/IP 协议是众多协议的集合,根据 TCP/IP 的分层不同,对应的协议族也不同,下图是列举了 TCP/IP 包含的各个层的通信协议:
在这里插入图片描述
在平时的物联网项目的开发时,并不会涉及到的所有协议,常用的就是传输层的 TCP 协议和 UDP 协议,需要了解的是应用层的 HTTP、DHCP、DNS、FTP 、SMTP 和 和 NTP 协议, 以及一些网络基础知识,如 IP 的概念和分类,域名的划分和解析等 。

由于 TCP/IP 网络协议非常复杂,本文只讲解开发时用到的一些基础知识和基本的通信协议,在学习了这些基本的通信协议之后再去深入学习计算机网络将会非常容易。

TCP/IP 由于十分复杂,因此采用了分层设计的思想,共分为 4 层,从上往下依次是调用的关系,如下图:
在这里插入图片描述
TCP/IP 协议位于应用层、传输层和网络层。
网络接口层只是实现 TCP/IP 协议的物理设备和驱动(网卡),其实就是物理层和数据链路层。

网络层用于甄别数据传输介质中的某一数据包的是否属于本机,如果是则解析数据包并去掉数据的 IP 首部,接着将数据发给传输层处理,

传输层在经解析去掉 TCP 首部,并将数据发送给对应的端口。也就是说数据的发送是从应用层开始封包,一层一层的套包装,接收数据则是拆包装的过程。如下图所示:
在这里插入图片描述
整个发送过程,其实就是发送端不断给数据加上帧头,而接受端是不断去掉帧头,最终得到原始的数据的过程。

OSI 的标准是七层模型,而 TCP/IP 协议只分为四层,以下是对比图:
在这里插入图片描述
如果想了解 OSI 模型,可以点击下载 《科来 TCP/IP网络协议图 2020》

二、TCP/IP 封包和共享传输介质

TCP/IP 采用共享传输介质的方式来进行多机的数据传输,比如同处于家庭无线局域网内的所有设备,或者使用同一根网线的多台计算机,如果不采取任何机制直接使用这种方式进行多台计算机的网络通信就会导致一个很严重的问题:一台计算机想要发送一个大文件,则会长时间占用硬件传输介质,迫使其他计算机处于等待状态,使得网络速度下降,传输实时性降低,为此 TCP/IP 针对共享传输介质采用了封包的概念,即:将用户 的信息切割成多份并投放入传输介质中,但是这种封包进行传输不能保证各个数据包是按顺序传输的,因此TCP/IP 为每个包都加入了顺序编号,接收端会将这些数据包按照编号重新整理组合成原始数据。

在使用这种封包的传输机制之后,使得每台计算机的等待时间大大降低,在计算机想要发送数据之前,它会先在传输线上试探一下是否有数据包正在发送,如果有数据发送它会自己掷骰子来生成一个随机延时,等到延时结束接着试探,以此类推,所以我们会有这种经历,当一条网线上的接入设备较多后,网络会卡顿,其原因就是你的计算机检测到此时网线上有数据传输,自己在那里不停的掷骰子,导致传输延时。

如下图举例,ABC 三个用户正在使用通讯软件传输消息,但这些消息在传输介质中却是以不可预知的顺序传输的。
在这里插入图片描述

三、IP 地址(定位到联网设备)及端口号(定位到设备中的具体应用)

双方计算机进行通信的前提是知道目标计算机的网络位置,即我们所说的 IP地址 ,这是因为 IP 地址具有全网唯一性,大家最熟悉的 IP 地址大概就是 192.168.1.1 了。

现在普遍使用的是 IPv4 协议,用 32 位二进制表示 IP 地址,但为了方便人类识别、记忆将其以 8 位为单位进行分割,共分成 4 份,每份之间用句点隔开,并使用十进制表示,即:点分十进制表示法,其取值范围为 0-255。这样看来 IP 地址有 2^32 (4294967296)个,看似很难用完,

但由于最初 IP 地址划分保留了一些 IP 地址导致这些地址不可用,另外随着更多用户接入互联网,最终在 2011 年 2 月 3 日 IP 地址被耗尽。

现在供人类选择的就只有 IPv6 协议了,IPv6 使用 128 位表示 IP 长度,理论上可以产生 2^128 个 IP 地址,IPv6 使用 8 组 4 个十六进制数表示地址,如:1027:0cd6:7aa3:16f3:3329:4c6e:a360:4637

IP 地址根据应用场景通过改变网络号和主机号的范围进行了分类,这些分类包有:A 类,B 类,C 类,D 类,E 类,我们常用的是前三者,下图是分类方法(以 B 类 IP 为例):
在这里插入图片描述
网络号可以表示网络的数量,主机号则是每个网络下的主机数量,

  • A 类地址,其 IP 取值范围是:0.0.0.0 - 127.255.255.255,网络号为地址第一段号码,后面的三段为主机号。
  • B 类地址取值范围是:128.0.0.0 - 191.255.255.255,前两段为网络号,后两段为主机号,如上图所示。
  • C 类地址取值范围是:192.0.0.0 - 223.255.255.255,前三段为网络号,最后一段为主机号。

根据这种分类可以看出由 A 到 C 网络数量逐渐变多,主机数量逐渐变少,对应的应用场景为大型网络、中型网络,小型网络。

一台计算上会同时运行多个不同的网络应用,比如 SMTPFTPHTTP 等,他们都处于一个 IP 地址下,因此就需要一种标识来告诉传输层接收到的数据要送到应用层的哪个具体应用中,这个标识就是端口号,端口号是一种虚拟的逻辑上的端口划分,这样做的好处是可以使各个应用合理的使用网络资源。

端口号有 16 位,即可以表示 65536 个端口,这些端口其中一部分是被固定分配给指定的应用,比如 HTTP 占用 80 端口,SMTP 占用 25 端口。

我们在做测试时可以在 Windows 命令行中输入 netstat -ano 命令来查看此时被占用的端口,避免发生端口冲突。
在这里插入图片描述

四、ARP 协议(IP 到 MAC地址的转换)

在前面已经知道了 IP 是识别一台计算机的唯一标识,但最终操作数据的还是网卡,所以要知道网卡的物理地址,即 MAC 地址,因此就需要一种能够将 IP 这一逻辑标识和 MAC 地址物理标识进行转换的协议,这种协议就是 APR 协议。大家了解其功能即可,无需深入。

五、DHCP (IP 户口登记):动态分配 IP 地址

之前说过 IPv4 提供的 IP 资源有限,不可能为每一个人提供一个固定的 IP,因此就会导致很多人因为没有 IP 地址而不能上网,想要解决这个问题最直接的办法就是使用更大 IP 容量的 IPv6 协议,但是想彻底从 IPv4 过渡到 IPv6 困难重重。

因此人们想到了另外一个缓解办法:动态分配 IP。即为了每一个设备分配一个临时的 IP,当一个设备关机后这个空闲
的 IP 地址就会分配给其他主机使用,一个主机开机就会请求路由器为其随机分配一个可用 IP,这样就使得原本短缺的 IP 资源动态的流动起来,使其使用效率大大提高。

我们称这种方式为 DHCP(Dynamic Host Configuration Protocol)。

在一个主机刚开机时,由于没有 IP 地址,它会通过 DHCP 协议外广播,请求该网络内的 DHCP 主机(路由器)为其分配一个 IP,当 DHCP 主机收到这个请求后会在可用的 IP 中选择一个并广播出去,有 IP 地址的计算机会忽略这种广播,只有没有 IP 地址的主机才会将该广播接收,并将新 IP 地址为自己所用。在 Windows 操作系统中,TCP/IPv4 属性中的自动获得IP 地址选项就用于选用或者关闭 DHCP 功能:
在这里插入图片描述
如果不开启 DHCP,则需要使用者自行指定 IP 地址,但前提是不能和该网络中的其他主机 IP 发生冲突,如果该网络下主机数量很多,将会使加剧这种冲突,所以一般采用 DHCP 来动态为我们主机分配 IP,避免不必要的麻烦。

六、NAT (IP 易容术)

NAT(Network Address Translation,网络地址转换),是另一种缓解 IP 资源短缺的方法。

我们一定有过这种经历:无论在哪里连接 WIFI,大多数情况下上网设备分配的 IP 地址都是 192.168.x.x,该类地址称之为 私有地址

在每个网络分类中都指定了某一 IP 地址范围为私有地址,如
A 类 IP 的私有 IP 地址范围是:10.0.0.0~10.255.255.255
B 类 IP 的私有 IP 地址是:172.16.0.0~172.31.255.255
C 类 IP 私有 IP 地址是:192.168.0.0~192.168.255.255

这类私有地址是不会被外网承认的,因此就无法上网,通常将这类私有地址作为家庭或者公司的局域网来使用,然后通过路由器进行上网,而实现这一功能的就是由路由器中的 NAT 协议来实现的,NAT 会将局域网内的主机 IP 和端口号替换成路由器的公网 IP 和端口号,然后再将数据发送给目标主机或服务器,因此在效果上来看就好像是拥有公网 IP 的路由器发出的数据一样,从而实现了内网向外网的穿透,这么做的好处是可以使 IP 地址(私有地址)得到最大程度的复用,有效缓解 IP 资源的枯竭。

另外 NAT 的一个好处是,它可以隐藏局域网内的联网设备,因为对于外网设备来说他们看到的只是路由器的公网 IP,其内部局域网内的主机他们是察觉不到的,因此可以提高网络的安全性。

大家不要将 NAT 和 DHCP 这两个概念混淆在一起,就以家庭网络为例,NAT 功能和 DHCP 功能都由路由器提供,路由器通过 DHCP 可以为每一个刚接入到该网络的设备按照某种策略随机分配一个局域网 IP,如:192.168.1.23,此时该设备想要向外网发送数据,路由器就需要通过 NAT 将数据包中的局域网 IP 和端口号转换成公网的 IP 和端口号实现外网访问。

如果想将路由器的某一个端口接收到的数据映射到指定的该局域网内的主机上,我们可以设置路由器的端口映射来满足要求,但是现在很多运营商为用户分配的动态 IP 也都是局域网,也就是说在我们路由器的上一层还有一台路由器,除非我们可以更改上一层路由器的端口映射,否则映射就会失败。另外外网 IP 是动态的,因此每次开机的 IP 地址都可能不同,如果将我们的计算机作为服务器(比如个人论坛或者网页)的话,那么在用户每次访问时就需要不停的更改 IP,显然不切实际。因此可以选择一些能够提供内网穿透的服务商来为我们提供内网穿透服务,比如作者常用的就是花生壳,大家可以免费注册和使用,对于开发调试来说已经足够了,而且会为用户分配一个域名(后面讲解),之后设置内网和外网的映射 IP 和端口号即可:
在这里插入图片描述
例如我希望用自己的电脑作为物联网的服务器,来接收各个设备发送过来的数据,则根据上图配置,我们的物联网设备连接的服务器地址和端口号是 18h212253o.iok.la:22958,而作为服务器的(本台电脑)地址和端口号要设置 192.168.31.238:5468,当设备向外网 IP 发送数据时就会将这些数据映射到服务器主机上了。
花生壳具体的操作流程如下:

  1. 注册花生壳
  2. 下载花生壳客户端
  3. 点击客户端“内网穿透”,跳转到映射设置网页
  4. 根据实际需求指定要映射的 IP 和端口号

七、DNS 和域名(IP 绰号)

虽然使用四段点分十进制来表达 IP 地址相对于二进制表示来说更加直观一些,但是依然不能表达特殊的人类可以理解的含义,因此就产生了域名(也叫网址),域名可以理解为一个 IP 地址的绰号,这个绰号更符合人类的记忆方式,这一点类似于电话本中的联系人,联系人的手机号码对应的就是 IP 地址,联系人的备注对应的就是域名,例如 www.fengmeitech.club(域名)就比 101.200.130.235(IP)更好记。

我们可以在 Windows 命令行中输入 nslookup “域名”,如 nslookup www.baidu.com 来解析域名对应 IP 地址。下图是测试结果:
在这里插入图片描述

当一台计算机要访问指定域名的主机或者服务器,如访问 www.fengmeitech.club 时,就需要解析该域名对应的 IP 地址,因为最终的访问对象就是 IP 地址,这时就要用到 DNS(Domain Name System,域名解析系统),当需要进行域名解析时,计算机会向 DNS 服务器发送请求解析指令,该指令是通过 UDP 协议实现,这样的速度更快,DNS 服务器上存储的是 IP 和域名的对应关系表,如果查到域名后将返回域名对应 IP 地址给我们的计算机,此时计算机开始访问目标主机或者服务器。

更详细的流程是:当计算机要访问一个域名,此时它先从本地缓存查找是否存在这个域名,如果有,就把本地保存的域名对应 IP 提取出来然后直接访问,如果没有则会向你的网络提供商(ISP,如:网通,电信等)的 DNS 服务器发出查找指令,如果 ISP 的 DNS 服务器也没有这个域名,则 ISP DNS 服务器会向其他 DNS 服务器(根服务器,顶级服务器等)发送
解析指令,当这些 DNS 服务器解析之后找到了这个域名对应的 IP,就会将这个 IP 传给 ISP 的 DNS 服务器,ISP 的 DNS 服务器再将找到了这个 IP 返回给你的电脑,同时 ISP 的 DNS 服务器会将这个域名 IP 对应关系缓存起来,不用下次再进行查找,到此整个的域名解析就完成了。

乐鑫 ESP8266 官方 AT 指令为我们提供了域名解析指令(AT+CIPDOMAIN=”域名”),效果如下:
在这里插入图片描述
接下来讲解一下域名的分类,域名分类可以很好的将域名进行管理,通过查看域名可以快速获悉域名性质,所属上级域名等信息。域名分类采用了树状图的形式进行分类,下面就以作者母校——沈阳化工大学官网(http://www.syuct.edu.cn/)为例进行讲解。

在最顶层的根域名服务器(无名称,可以用.表示,我们平时会忽略这个.)下面的是顶级域名,接着是二级域名,三级域名……主机名,顶级域名按照性质分为两种,一个是国家顶级域名(如:中国(.cn),美国(.us),英国(.uk)等等),另一个是国际顶级域名(如:营利组织性质的.com,非盈利组织的.org),二级域名由国家划分,按照性质分为两种,一种是按照地理位置划分的各省域名,如 ln.(辽宁)bj.(北京)以及按照职能性质分的 gov.(政府),edu.(教育)等。下图是以沈阳化工大学官网为例绘制的树状图:
在这里插入图片描述
可以看到域名从左到右依次为三级域名-二级域名-顶级域名。

八、TCP 和 UDP

前面做了这么多的铺垫主要是为了讲解 TCP 和 UDP 并对 TCP/IP 协议有一个清晰的认识。在物联网应用中,绝大部分的硬件设备和服务器的通信方式都是基于 TCP 或者 UDP 的(少数使用 HTTP),一般情况下,TCP 应用的比 UDP 要多一些。下面来讲解一下 TCP 和 UDP 的原理、特点以及区别,我们目的并不是学会这两个协议是如何实现的,而是要知道他们的大致机理并学会应用。

8.1、TCP 协议

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、安全可靠的、基于字节流的传输层通信协议,在进行 TCP 传输时,要有一方作为服务器端(Server),一方作为客户端(Client),服务端用于监听来自其他客户端发来数据,一个服务端可以同时监听多个客户端,因此物联网应用中,硬件设备作客户端,服务器作为服务端。一个 TCP 的客户端要和服务器端进行通信,客户端就必须先指定服务器端的 IP 地址和端口号,然后通过 3 次握手建立连接,如下图:
在这里插入图片描述
当握手成功后,客户端和服务器端就正式建立了连接,此时就可以互相传输数据了,通常我们还会人为的对这些数据进行标识和加密,目的是保证数据传输安全,通过这些标识可以让服务器来区分该数据消息来自于哪个用户的哪台设备,加密则是防止物联网设备被恶意攻击,对于能够产生物理影响的物联网设备来说,安全是最重要的,否则设备被攻击后,攻击者会恶意控制家中设备,比如打开煤气一段时间后点燃,其后果不堪设想。

前面介绍了 TCP 的两个阶段:握手建立连接 - 数据收发,最后一个是断开连接,通常由客户端发起,断开连接要经过 4 次确认,如下图所示:
在这里插入图片描述
从上面来看,TCP 类似于平时拨打电话,如果想要正常通信,就必须先向指定的目标拨号,拨通并建立连接后开始通话,通话结束后由一方断开连接。

到这里就已经介绍完了 TCP 的三个通信过程,另外我们可能都听说过 TCP 长连接和 TCP 短连接,TCP 长连接是指客户端和服务端长时间保持连接,这种情况在客户端连接数量很多时会增加服务器的负担,但是可以保证数据能够实时的传输。另外一种称为 TCP 短连接,即通信完之后立即断开,比如常见的 HTTP 协议,因为当客户端请求完数据之后,就不在需要继续保持 TCP 连接了,因此可以断开,降低服务器的工作负担。

在物联网应用中通常使用的都是 TCP 长连接,对于大多数物联网应用来说对传感器数据采集的实时性要求不高,因此间隔都比较长,比如快则几十秒,慢则几小时,同时这样也可以减轻服务器的处理负担,但是为了保证双方连接有效,通常物联网设备会每隔几秒或者更长的时间发送一个简短的数据包给服务器,证明自己还在,我们称这种数据包为心跳包,如果服务器长时间没有收到某一个设备发来的心跳包,则认为其断开连接,就会将和它的TCP 连接断开,并释放资源,同时在用户界面显示该设备异常。

8.2、UDP 协议

UDP(User Datagram Protocol,用户数据报协议)是一种简单的面向数据报的传输层协议,它与 TCP 的传输不同,双方不存在所谓的客户端和服务端,只要一方知道另一方的 IP 地址和端口号,就可以直接建立连接并发送数据,并且也没有 TCP 一系列的传输安全措施,比如丢包重传和拥塞控制等,因此相对于 TCP 来说,UDP 的传输是不安全的,可能会出现丢包的现象,但正因为没有了握手,数据传输安全等处理,使得 UDP 的传输速度更快,UDP 通常应用在允许丢包但要保证通信速度的场合,比如流媒体。而像文件传输就需要使用 TCP,因为文件传输的前提是保证数据的完整。但是 TCP 和 UDP 通信速度的区别我们其实是察觉不到的,只不过都是相对而言,同样,UDP 丢包率也没有想象中的那么严重,像大家平时用的 QQ 都是通过 UDP 来进行传输的,所以完全可以放心的将 UDP 应用到物联网项目中,只不过使用 UDP 传输缺少一种连接上的控制。

到这里 TCP/IP 的基础知识就讲完了,关于这部分只要求大家了解它的用途就可以了,如果想要继续深入学习 TCP/IP 的原理,推荐大家阅读《图解 TCP/IP》

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值