互联网协议入门

2019/04/10 10:10
阅读数 17

作者:DeppWang

互联网上的数据能从一台设备发送到另一台设备,整个过程由互联网协议( Internet Protocol Suite)实现的。

对于互联网协议,一直一知半解。知道会分为几层,但为什么分层,分层有什么好处,都不甚理解。通过阮一峰的这两篇文章,大概有了一个初步认识,下面是我对互联网协议的理解。

<!--more-->

<!--一直以来的疑惑:-->

<!--为什么说 Dubbo 基于 TCP 协议,Spring Cloud 基于 HTTP 协议?难道 Spring Cloud 就没有使用应用层吗?HTTP 协议没有用到 TCP 协议吗(没有经过传输层吗)?怎么好像两者是并列的关系。为什么基于 TCP 协议的 Dubbo 就更快一些呢?-->

<!--一个打开网页的请求如何从客户端发送到服务端,并接受到请求的,其请求包是格式是怎样的。-->

<!--对于手机来说,这几层体现在哪里?或者说是哪个软件实现这几层的?-->

一、五层模型

我也认为将互联网协议分为五层,可以更好的去理解它,从上往下分别是:应用层、传输层、网络层、(数据)链路层(链接层)和物理层(实体层)。如果死记硬背,往往过几天就忘了,所以需要了解其原理,当我们理解了全文,让我们去说文章的名字,那还不是轻而易举吗!

图片来自阮一峰博客

大多数文章或书籍都是从上往下来讲解互联网协议,但是个人感觉总是没有深入其理,阮一峰自下而上的讲解每一层的功能,让人记忆深刻。我也依葫芦画瓢,先自下而上分析一下每一层的功能,再结合 Wireshark 抓包工具,来稍稍看看互联网协议的真面目。

1.1 层与协议

为什么叫某某层?为什么要分层?层是什么?

我觉得层这个叫法很形象,一层一层,好像平行,各自独立。维基百科的解释是:「整个通信网络的任务,可以划分成不同的功能区块,即所谓的层级(layer」,我们可以理解为,每一层是实现了一个功能,有不同的分工。就跟写代码一样,如果把所有功能放一起,改一行代码就可能影响全部,所以根据不同功能拆成不同的方法。我觉得叫什么不重要,可以叫应用块、应用组,等等。主要知道,每一层是为了完成一个功能就行。

我们知道,每一层都有自己对应的协议(Protocol),比如,网络层有 IP 协议。那何为协议?跟这个层又有什么关联?维基百科上有这么一句话:「网络层功能由 IP 协议规定和实现,故又称 IP 层」。我们可以看出,每一层的功能其实是协议来规定和实现的。所以,协议可以理解为,有大家都遵守的规则(规定),并负责去实现这个规则。

二、物理层(Physcial Layer)

我们电脑现在不用插网线就能上网(连 WIFI),但是路由器插网线了,在家里,路由器一般又需要通过一根网线连接入户光纤盒(又称为光猫),光纤盒又需要通过一根光纤连接到其他设备。电脑连接 WiFi,电脑的数据发送到路由器,是通过无线电波。所以传输数据需要物理载体,类似网线、光纤、无线电波。我们将传输数据的物理载体称为物理层(Physcial Layer)。为什么我们访问美国的网站就慢一些,因为美国网站的服务器在美国,数据通过海底光缆传输,耗时会久一些。这也是为什么很多公司要在不同城市部署服务器的原因之一吧。

数据在物理载体中传输,传输的是什么呢?是 0 和 1 组成的电信号,为什么是 0 和 1 组成的电信号呢?这个吧,姑且通过类比的方式来解释,因为计算机只能识别 0 1 二进制,所以要传输 0 和 1 组成的电信号吧。

<!--问好脸:网速的快慢由每 1 秒能传输电信号的多少决定?-->

三、链路层(Link Layer)

物理层只是一个传输载体,没有「自主意识」, 我们需要借助物理层上的链路层(Link Layer),链路层的功能:将数据从一处发送到另一处,链路层在发送方和接收方都有,在发送方:链路层将数据转换为电信号,并将其发送出去;在接收方:链路层收到电信号,并将电信号转换为数据。链路层和物理层之间的关系可以这样表示:

局域网内,将数据从一处发送到另一处需要使用以太网(Ethernet)。局域网的通俗理解,连接同一个 WiFi (路由器 Router)的设备在同一个局域网内。

3.1 以太网

以太网是一种局域网技术,它可以实现局域网内的设备通信,我们现在电脑一般连 WiFi,WiFi 可以认为是「无线以太网」。

我们可以理解为,在局域网内,链路层的功能其实是由以太网实现的(局域网外的链路层比较复杂,本文不讨论)。 局域网内的链路层和以太网的关系可以这样表示(物理层作为以太网的传输载体):

以太网需要规定电信号的格式,以便双方解读。以太网规定一组电信号为一个数据包,叫帧(Frame),帧包含两部分,标头(Head)和数据(Data),标头包含发送方地址、接收方地址等信息,数据则是数据包的具体内容。我们一般将帧称为以太网数据包,或者以太帧,以太帧格式类似下面这样:

以太帧,图片来自阮一峰博客

每台网络设备都有自己的网卡,以太网是将数据从一块网卡发送到另一块网卡,每块网卡需要有自己的「身份证号」,叫 MAC 地址(iPhone 手机的 MAC 地址叫无线局域网地址),由 12 个十六进制数表示:

<img src="https://deppwang.oss-cn-beijing.aliyuncs.com/blog/2020-03-20-121841.jpg" style="zoom:50%;" />

MAC地址:(Media Access Control Address),直译为媒体存取控制位址,也称为局域网地址(LAN Address),以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网络设备位置的地址。

所以以太网发送前需要知道接收方网卡的 MAC 地址,即标头的接收方地址,但正常情况下,不知道接收方 MAC 地址,需要使用 ARP 协议得到(这个本文后面解释)

假设已经知道了 MAC 地址,那么在局域网内,以太网可以根据 MAC 地址,将数据发送给对方。但如果对方没有在一个局域网内,如何发送给对方呢?此时,就需要网络层(Network Layer)出马了!


以太网在 Windows 中的体现:

在 macOS 的体现: PPPoE(英语:Point-to-Point Protocol over Ethernet),以太网上的点对点协议。

四、网络层(Network Layer)

首先,我们要区分接收方是否在一个局域网,使用 MAC 地址不能区分,需要设备有另外一个地址,能代表它所处的具体是哪个网络(局域网),我们称这个地址为「网络地址」。

网络层的作用,就是根据网络地址找到目的主机处于哪一个局域网。实现这一功能的协议称为网络协议,即 IP 协议 。网络地址用于 IP 协议,所以网络地址也可以叫它 IP 地址。注意:我们叫 IP 协议,是一种习惯,其实 IP(Internet Protocol) 本身就有协议的意思。

<!--如果设备连 WiFi,WiFi 是局域网,路由器会为设备分配一个局域网 IP 地址,它只能在局域网内部使用,所以也叫内部(本地) IP。局域网有一个对外访问互联网的 IP,称为外部 IP,**一个局域网内的所有设备共用一个外部 IP 地址**。在百度输入IP,显示的 IP 就是外部 IP,在「设置->网络」中看到的 IP 是内部 IP。我们称局域网为内网,内是相对的概念,代表没有外部 IP 就不能访问。-->

如果设备连 WiFi,路由器会为设备分配一个 IP 地址。

4.1 IP 协议

IP 协议:英语全称为:Internet Protocol,即网络协议,也称网际协议

现在大部分使用的还是 IP 协议第四版,简称 IPv4,IP 地址为 32 位(4*8,二进制)。

图片来自阮一峰博客

有了 IP 地址,网络层可以通过 IP 地址来区分是否处于一个局域网。如何根据 IP 地址判断设备是否处于同一个局域网?答案是利用子网掩码。IP 地址分为两部分,网络部分和主机部分,如果子网掩码为 255.255.255.0(二进制表示:11111111.11111111.11111111.00000000),表示前 24 位代表网络部分,如果两个 IP 地址前 24 位相同,则代表是在同一个局域网中。

4.2 IP 数据包

数据经过网络层,IP 协议为数据加上包含发送方 IP 地址和接收方 IP 地址的标头,包装为 IP 数据包:

图片来自阮一峰博客

IP 数据包到达链路层时,直接作为作为以太帧的数据部分,嵌入以太帧。此时的以太帧的格式如下:

图片来自阮一峰博客

如果通过子网掩码判断接收方在一个局域网,就通过以太网发送,此时需要得到其 MAC 地址,前面说,需要 ARP 协议得到其 MAC 地址,何为 ARP 协议?

4.3 ARP 协议

ARP 协议,英语全称为:Address Resolution Protocol,即地址解析协议,是一种通过 IP 地址得到 MAC 地址的协议。默认情况,发送方知道接收方的 IP 地址(通过 DNS 得到,这个又后面解释),所以发送方使用「广播」(broadcasting)的方式给当前局域网所有主机发送一个以太帧,包含对方的 IP 地址,对方 MAC 地址设为 ff:ff:ff:ff:ff:ff,接收方根据接收者 IP 地址判断自己是否为接收者,是,就发送一个数据包告诉对方自己的 MAC 地址,不是,就丢弃这个包。

通过这种方式,发送方就可以通过接收方的 IP 地址得到 MAC 地址。

如果通过子网掩码判断接收方不在一个局域网,通过 APR 协议就得不到对方的 MAC 地址,那就要使用路由(Route)的方式发送了。

4.4 路由

路由,简单来说,就是得到路由器的 MAC 地址,数据先发送到路由器(Router),由路由器来发送下一个路由器,通过一系列路由中转,最后发给目标主机。

<!--路由器往外发送时,使用的是外部 IP(互联网 IP)。使用外部 IP 才能和互联网通信,外部 IP 是名片-->

其实就像发送快递一样,在快递上写上收件人的地址,由快递点发送给下一个中转站,再中转,最后收件人收到快递。

一个简单的路由器,需要实现 IP 协议和链路层协议。

如果把上面的过程说的仔细一点,以太网是将以太帧发送给路由器链路层,路由器链路层将数据包发送给路由器网络层,路由器有一个路由表,网络层在路由表找到跟当前路由器相连的、离目的主机最近的路由器,路由器通过 ARP 协议,得到下一个路由器的 MAC 地址,让路由器链路层根据 MAC 地址,发送给下一个路由器。通过一系列中转,来到目的主机所在的路由器。使用同样的方式,通过以太网将以太帧发送给目的主机。整个过程大概是这样:

我们常说,网络层负责寻址和路由,寻址就是寻找最近的 IP 地址,路由就是找到最近的路由 MAC 地址(我这么理解,不一定正确)。我们可以理解为:整个通信过程中的网络层负责寻址和路由,发送方的网络层其实负责它自己的寻址和路由。

<!--前面说,局域网内的链路层是由以太网实现的。那么局域网外的后链路层呢?是通过骨干网等实现。-->

五、传输层(Transport Layer)

网络层和链路层实现了互联网任意两台主机之间的网络通信,此时还有两个问题,1、设备不止一个程序,具体发送给哪一个程序?2、没有保证数据包能发送成功。

这时候就需要传输层(Transport Layer),传输层的功能是保证数据能可靠传输到对方主机的应用程序上。

应用是进程,每个进程使用网卡时,需要有一个编号,这个编号就是端口。系统默认占用 0 到 1023 的端口,系统会为软件随机分配 1024 到 65535 之间的端口。 常见术语套接字(Socket)就是 IP 地址 + 端口的组合称谓。

传输层要为发送的数据包中增加发送方和接收方的端口号。

传输层功能实现一般有两种协议,1 是 TCP 协议,2 是 UDP 协议

5.1 TCP 协议

TCP 协议,英语全称为:Transmission Control Protocol,即,传输控制协议

TCP 协议使用用三次握手来保证线路的可靠,失败后,有失败重传机制,它是一个很复杂的协议,传输层的称谓,也是来源于 TCP 这个 传输控制协议

TCP 协议发送的数据包叫 TCP 数据包,它的标头包含发送方端口和接收方端口,

图片来自阮一峰博客

它发送数据包给网络层,网络层将 TCP 数据包作为 IP 数据包的数据部分,再发给链路层。此时以太帧格式如下:

图片来自阮一峰博客

因为以太帧有长度限制,TCP 协议没有规定数据的长度,所以当 TCP 数据包过长时,以太帧装不下,此时 TCP 数据包需要切分为多个 TCP 数据包。我们常常看到有的书籍说:传输层负责「请求报文」的分割。这就是传输层为什么要分割「请求报文」的缘故。

传输层保证数据的「可靠传输」,这句话常常被我们误解为,是由传输层传输数据,现在我们知道,传输数据的其实是链路层,传输层其实只是失败重传(当然不止这一个功能,这里这么说是为了方便理解)。所以这句话的重点在于可靠,不在传输。

5.2 UDP 协议

UDP 协议,英语全称为: User Datagram Protocol,即用户数据包协议

传输层有一种简单的协议,叫 UDP 协议,UDP 协议只是为数据简单的加上包含发送方端口和接收方端口的标头,就将 UDP 数据包扔给网络层,它不保证是否能成功的发送给接收方,它是一种不可靠的传输协议。因为简单,减少了时间开销,常用于对时间有较高要求的应用程序。

六、应用层(Application Layer)

链路层、网络层、传输层实现了数据包能从主机应用发送到目的主机应用。正常情况下,网络上主要传输的数据是应用产生的。传输的数据各种各样,有网络请求,有电子邮件等等。数据需要由应用层(Application Layer)封装,即规定数据的格式。

规定「网络请求数据」格式的是 HTTP 协议。可以说,HTTP 协议是应用层的一种实现。

6.1 HTTP 协议

HTTP 协议:英文全称为:HyperT**ext Transfer Protocol,即超文本转移(传输)协议

当我们打开百度首页时,输入的就是一个网址 www.baidu.com,这是一个 GET 请求,HTTP 协议将请求封装为应用层数据包。这样,百度的服务器应用层就可以根据 HTTP 协议来解析数据包。

HTTP 请求的数据包一般称为请求报文,分为报文首部和报文主题,报文首部即为请求头,请求头格式如下:

包含的应用层数据包的以太帧格式如下:

图片来自阮一峰博客

6.2 DNS

DNS:英语全称为: Domain Name System,即域名系统

类似 www.baidu.com 这样的网址域名,是为了用户方便记忆,网络通信时,需要将域名转换为 IP 地址,这是由 DNS 负责的,它也属于应用层。

七、WireShark 抓包分析

当 Mac 连 WIFI 后,可以在「设置->网络」中看见下面这些内容:

TCP/IP

MAC 地址

DNS 地址

此时电脑,有自己的 IP 地址、MAC 地址、还知道路由器的 IP 地址、DNS 服务器地址(由路由器负责域名解析,所以 DNS 地址其实就是 IP 地址)和当前的子网掩码。还可以看出,路由器动态分配 IP 地址是由 DHCP 实现的。

通过打开百度首页,结合抓包工具 Wireshark 来看看网络通信过程中的数据包的内容。

关于如何使用 Wireshark,请看 使用 wireshark 学习网络协议。通过 ping www.baidu.com 得到百度的 IP 地址为 61.135.169.121,在 Wireshark 中配置过滤条件后,通过使用命令 curl www.baidu.com 来模拟打开百度首页:

此时在 Wireshark 中可以看出,TCP 协议发送了以太帧,以太帧的格式是:Ethernet II 标头 + IP 4 标头 + TCP 标头 + TCP 数据,TCP 标头显示源端口为 53732,目的地端口为 80;IP 标头显示源 IP 地址为 192.168.31.206,目的地 IP 地址为 61.135.169.121;以太网标头显示源 MAC 地址为 f0:18:98:46:bf:65,目的地 MAC 地址为 28:6c:07:9d:e2:8e(小米路由器地址)。帧的长度为 78 字节,TCP 数据包的长度为 44 个字节。

这与我们前面说的相符合,目的主机不在同一个局域网,通过以太网发送以太帧给路由器,再由路由器负责路由发送。

前三个数据包为 TCP 的 3 次握手,接着发送了 HTTP 数据包,HTTP 数据包包含了请求的内容:

整个过程:先使用 TCP 协议完成了 3 次握手,然后使用 HTTP 协议发送了 GET 请求,接收到了百度的 HTTP 响应,最后使用 TCP 协议完成了 4 次挥手。

八、总结

互联网协议整个网络通信过程可以用下面这张图描述:

图片来自 Wiki

对于发送方的数据处理,这个过程像是一个俄罗斯套娃的过程

图片来自 Wiki

如果用发快递来类比一下:

 应用层:将物体打包为快递  
       |
 传输层:为快递填上收件人门牌号;如果快递丢失重新发送
       |
 网络层:为快递填上收件人小区地址;并根据收件人小区地址,找到下一个快递中转站的地址,最终找到整个线路
       |
 链路层:为快递填上下一个中转地地址;并负责将快递发往到下一个中转站
       |
 物理层:运快递的车

在互联网协议中,因为 TCP/IP 协议最重要,所以互联网协议也可以叫做 「TCP/IP 协议族」。

此文只是个人对互联网协议的浅显理解,毕竟没有深入研究,可能有诸多不当处,欢迎留言指出。

最后我想说一句,阮一峰牛逼。有的知识点是知道怎么回事,就是不能正确的表达出来,遣词排句真的很需要功力,真的需要常年累月的积累。

<!--解疑现在来说说,为什么说 SpringCloud 基于 HTTP 协议,Dubbo 基于 TCP 协议。我是这么理解的,因为 SpringClout 框架直接接受 HTTP 请求,而 Dubbo 让数据没有使用 HTTP 协议包装数据包。直接将数据包装为 TCP 数据包。-->

九、延伸阅读

个人公众号

原文出处:https://www.cnblogs.com/deppwang/p/12535144.html

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部