互联网协议入门
DeppWXQ 人气:1
作者:[DeppWang](https:/https://img.qb5200.com/download-x/depp.wang)
互联网上的数据能从一台设备发送到另一台设备,整个过程由[互联网协议](https://zh.wikipedia.org/wiki/TCP/IP协议族)( Internet Protocol Suite)实现的。
对于互联网协议,一直一知半解。知道会分为几层,但为什么分层,分层有什么好处,都不甚理解。通过[阮一峰](www.ruanyifeng.com)的这两篇文章,大概有了一个初步认识,下面是我对互联网协议的理解。
- [互联网协议入门(一)_阮一峰_](http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html)
- [互联网协议入门(二)_阮一峰_](http://www.ruanyifeng.com/blog/2012/06/internet_protocol_suite_part_ii.html)
## 一、五层模型
我也认为将互联网协议分为五层,可以更好的去理解它,从上往下分别是:应用层、传输层、网络层、(数据)链路层(链接层)和物理层(实体层)。如果死记硬背,往往过几天就忘了,所以需要了解其原理,当我们理解了全文,让我们去说文章的名字,那还不是轻而易举吗!
![图片来自阮一峰博客](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214828685-911694039.png)
大多数文章或书籍都是从上往下来讲解互联网协议,但是个人感觉总是没有深入其理,阮一峰**自下而上**的讲解每一层的功能,让人记忆深刻。我也依葫芦画瓢,先自下而上分析一下每一层的功能,再结合 [Wireshark](https://www.wireshark.org/) 抓包工具,来稍稍看看互联网协议的真面目。
### 1.1 层与协议
为什么叫某某层?为什么要分层?层是什么?
我觉得层这个叫法很形象,一层一层,好像平行,各自独立。维基百科的解释是:「**整个通信网络的任务,可以划分成不同的功能区块,即所谓的层级([layer](https://zh.wikipedia.org/w/index.php?title=Layer&action=edit&redlink=1))**」,我们可以理解为,每一层是实现了一个功能,有不同的分工。就跟写代码一样,如果把所有功能放一起,改一行代码就可能影响全部,所以根据不同功能拆成不同的方法。我觉得叫什么不重要,可以叫应用块、应用组,等等。**主要知道,每一层是为了完成一个功能就行。**
我们知道,每一层都有自己对应的协议(Protocol),比如,网络层有 IP 协议。那何为协议?跟这个层又有什么关联?维基百科上有这么一句话:「网络层功能由 IP 协议规定和实现,故又称 IP 层」。我们可以看出,每一层的功能其实是协议来规定和实现的。所以,协议可以理解为,**有大家都遵守的规则(规定),并负责去实现这个规则。**
## 二、物理层(Physcial Layer)
我们电脑现在不用插网线就能上网(连 WIFI),但是路由器插网线了,在家里,路由器一般又需要通过一根网线连接入户光纤盒(又称为光猫),光纤盒又需要通过一根光纤连接到其他设备。电脑连接 WiFi,电脑的数据发送到路由器,是通过无线电波。所以传输数据需要物理载体,类似网线、光纤、无线电波。**我们将传输数据的物理载体称为物理层(Physcial Layer)**。为什么我们访问美国的网站就慢一些,因为美国网站的服务器在美国,数据通过海底光缆传输,耗时会久一些。这也是为什么很多公司要在不同城市部署服务器的原因之一吧。
数据在物理载体中传输,传输的是什么呢?**是 0 和 1 组成的电信号**,为什么是 0 和 1 组成的电信号呢?这个吧,姑且通过类比的方式来解释,因为计算机只能识别 0 1 二进制,所以要传输 0 和 1 组成的电信号吧。
## 三、链路层(Link Layer)
物理层只是一个传输载体,没有「自主意识」, 我们需要借助物理层上的[链路层](https://zh.wikipedia.org/wiki/数据链路层)(Link Layer),**链路层的功能:将数据从一处发送到另一处**,链路层在发送方和接收方都有,在发送方:链路层将数据转换为电信号,并将其发送出去;在接收方:链路层收到电信号,并将电信号转换为数据。链路层和物理层之间的关系可以这样表示:
![](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214829090-1430205152.jpg)
在[局域网](https://zh.wikipedia.org/wiki/局域网)内,将数据从一处发送到另一处需要使用[以太网](https://zh.wikipedia.org/wiki/以太网)(Ethernet)。**局域网的通俗理解,连接同一个 [WiFi](https://zh.wikipedia.org/wiki/Wi-Fi) (路由器 Router)的设备在同一个局域网内。**
### 3.1 以太网
以太网是一种局域网技术,它可以实现局域网内的设备通信,我们现在电脑一般连 WiFi,WiFi 可以认为是「无线以太网」。
我们可以理解为,**在局域网内,链路层的功能其实是由以太网实现的**(局域网外的链路层比较复杂,本文不讨论)。 局域网内的链路层和以太网的关系可以这样表示(物理层作为以太网的传输载体):
![](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214829375-1480032275.jpg)
**以太网需要规定电信号的格式,以便双方解读**。以太网规定一组电信号为一个数据包,叫帧(Frame),帧包含两部分,标头(Head)和数据(Data),标头包含发送方地址、接收方地址等信息,数据则是数据包的具体内容。我们一般将帧称为以太网数据包,或者[以太帧](https://zh.wikipedia.org/wiki/以太网帧格式),以太帧格式类似下面这样:
![以太帧,图片来自阮一峰博客](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214829629-1979511199.png)
每台网络设备都有自己的网卡,**以太网是将数据从一块[网卡](https://zh.wikipedia.org/wiki/网卡)发送到另一块网卡**,每块网卡需要有自己的「SFZ号」,叫 [MAC 地址](https://zh.wikipedia.org/wiki/MAC地址)(iPhone 手机的 MAC 地址叫无线局域网地址),由 12 个十六进制数表示:
> MAC地址:(**M**edia **A**ccess **C**ontrol Address),直译为媒体存取控制位址,也称为局域网地址(LAN Address),**以太网地址**(Ethernet Address)或**物理地址**(Physical Address),它是一个用来确认网络设备位置的地址。
所以以太网发送前需要知道接收方网卡的 MAC 地址,即标头的接收方地址,但正常情况下,不知道接收方 MAC 地址,需要使用 [ARP 协议](https://zh.wikipedia.org/wiki/地址解析协议)得到(这个本文后面解释)
假设已经知道了 MAC 地址,那么在局域网内,以太网可以根据 MAC 地址,将数据发送给对方。但如果对方没有在一个局域网内,如何发送给对方呢?此时,就需要[网络层](https://zh.wikipedia.org/wiki/网络层)(Network Layer)出马了!
---
以太网在 Windows 中的体现:
![](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214829934-8129566.jpg)
在 macOS 的体现: [PPPoE](https://zh.wikipedia.org/wiki/PPPoE)(英语:**P**oint-to-**P**oint **P**rotocol **o**ver **E**thernet),以太网上的点对点协议。
![](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214830682-1383140791.jpg)
## 四、网络层(Network Layer)
首先,我们要区分接收方是否在一个局域网,使用 MAC 地址不能区分,需要设备有另外一个地址,能代表它所处的具体是哪个网络(局域网),我们称这个地址为「**网络地址**」。
**网络层的作用,就是根据网络地址找到目的主机处于哪一个局域网**。实现这一功能的协议称为网络协议,即 [IP 协议](https://zh.wikipedia.org/wiki/网际协议) 。网络地址用于 IP 协议,所以网络地址也可以叫它 IP 地址。**注意**:我们叫 IP 协议,是一种习惯,其实 IP(**I**nternet **P**rotocol) 本身就有协议的意思。
如果设备连 WiFi,路由器会为设备分配一个 IP 地址。
### 4.1 IP 协议
> **IP** 协议:英语全称为:**I**nternet **P**rotocol,即**网络协议**,也称**网际协议**。
现在大部分使用的还是 IP 协议第四版,简称 IPv4,IP 地址为 32 位(4*8,二进制)。
![图片来自阮一峰博客](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214830990-1191090675.png)
有了 IP 地址,网络层可以通过 IP 地址来区分是否处于一个局域网。如何根据 IP 地址判断设备是否处于同一个局域网?答案是利用[子网掩码](https://zh.wikipedia.org/wiki/子网#网络掩码)。IP 地址分为两部分,网络部分和主机部分,如果子网掩码为 `255.255.255.0`(二进制表示:`11111111.11111111.11111111.00000000`),表示前 24 位代表网络部分,如果两个 IP 地址前 24 位相同,则代表是在同一个局域网中。
### 4.2 IP 数据包
数据经过网络层,IP 协议为数据加上包含发送方 IP 地址和接收方 IP 地址的标头,包装为 IP 数据包:
![图片来自阮一峰博客](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214831186-1023728486.png)
IP 数据包到达链路层时,直接作为作为以太帧的数据部分,嵌入以太帧。此时的以太帧的格式如下:
![图片来自阮一峰博客](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214831331-14202241.png)
如果通过子网掩码判断接收方在一个局域网,就通过以太网发送,此时需要得到其 MAC 地址,前面说,需要 ARP 协议得到其 MAC 地址,何为 ARP 协议?
### 4.3 ARP 协议
ARP 协议,英语全称为:**A**ddress **R**esolution **P**rotocol,即地址解析协议,是一种通过 IP 地址得到 MAC 地址的协议。默认情况,发送方知道接收方的 IP 地址(通过 [DNS](https://zh.wikipedia.org/wiki/域名系统) 得到,这个又后面解释),所以发送方使用「广播」(broadcasting)的方式给当前局域网所有主机发送一个以太帧,包含对方的 IP 地址,对方 MAC 地址设为 `ff:ff:ff:ff:ff:ff`,接收方根据接收者 IP 地址判断自己是否为接收者,是,就发送一个数据包告诉对方自己的 MAC 地址,不是,就丢弃这个包。
通过这种方式,发送方就可以通过接收方的 IP 地址得到 MAC 地址。
如果通过子网掩码判断接收方不在一个局域网,通过 APR 协议就得不到对方的 MAC 地址,那就要使用[路由](https://zh.wikipedia.org/wiki/路由)(Route)的方式发送了。
### 4.4 路由
路由,简单来说,就是得到路由器的 MAC 地址,数据先发送到[路由器](https://zh.wikipedia.org/wiki/路由器)(Router),由路由器来发送下一个路由器,通过一系列路由中转,最后发给目标主机。
其实就像发送快递一样,在快递上写上收件人的地址,由快递点发送给下一个中转站,再中转,最后收件人收到快递。
![](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214831869-1091316330.png)
一个简单的路由器,需要实现 IP 协议和链路层协议。
如果把上面的过程说的仔细一点,以太网是将以太帧发送给路由器链路层,路由器链路层将数据包发送给路由器网络层,路由器有一个路由表,网络层在路由表找到跟当前路由器相连的、离目的主机最近的路由器,路由器通过 ARP 协议,得到下一个路由器的 MAC 地址,让路由器链路层根据 MAC 地址,发送给下一个路由器。通过一系列中转,来到目的主机所在的路由器。使用同样的方式,通过以太网将以太帧发送给目的主机。整个过程大概是这样:
![](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214832421-1655798048.png)
我们常说,网络层负责寻址和路由,寻址就是寻找最近的 IP 地址,路由就是找到最近的路由 MAC 地址(我这么理解,不一定正确)。我们可以理解为:整个通信过程中的网络层负责寻址和路由,发送方的网络层其实负责它自己的寻址和路由。
## 五、传输层(Transport Layer)
网络层和链路层实现了互联网任意两台主机之间的网络通信,此时还有两个问题,**1、设备不止一个程序,具体发送给哪一个程序?2、没有保证数据包能发送成功。**
这时候就需要[传输层](https://zh.wikipedia.org/wiki/传输层)(Transport Layer),**传输层的功能是保证数据能可靠传输到对方主机的应用程序上。**
应用是进程,**每个进程使用网卡时,需要有一个编号,这个编号就是端口**。系统默认占用 0 到 1023 的端口,系统会为软件随机分配 1024 到 65535 之间的端口。 常见术语套接字(Socket)就是 IP 地址 + 端口的组合称谓。
传输层要为发送的数据包中增加发送方和接收方的端口号。
传输层功能实现一般有两种协议,1 是 [TCP 协议](https://zh.wikipedia.org/wiki/传输控制协议),2 是 [UDP 协议](https://zh.wikipedia.org/wiki/用户数据报协议)。
### 5.1 TCP 协议
> **TCP** 协议,英语全称为:**T**ransmission **C**ontrol **P**rotocol,即,**传输控制协议**
TCP 协议使用用三次握手来保证线路的可靠,失败后,有失败重传机制,它是一个很复杂的协议,传输层的称谓,也是来源于 TCP 这个 **传输控制协议**。
TCP 协议发送的数据包叫 TCP 数据包,它的标头包含发送方端口和接收方端口,
![图片来自阮一峰博客](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214832604-1262352156.png)
它发送数据包给网络层,网络层将 TCP 数据包作为 IP 数据包的数据部分,再发给链路层。此时以太帧格式如下:
![图片来自阮一峰博客](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214832760-724275638.png)
因为以太帧有长度限制,TCP 协议没有规定数据的长度,所以当 TCP 数据包过长时,以太帧装不下,此时 TCP 数据包需要切分为多个 TCP 数据包。我们常常看到有的书籍说:传输层负责「请求报文」的分割。这就是传输层为什么要分割「请求报文」的缘故。
传输层保证数据的「可靠传输」,这句话常常被我们误解为,是由传输层传输数据,现在我们知道,传输数据的其实是链路层,传输层其实只是失败重传(当然不止这一个功能,这里这么说是为了方便理解)。所以这句话的重点在于**可靠**,不在传输。
### 5.2 UDP 协议
> **UDP 协议**,英语全称为: **U**ser **D**atagram **P**rotocol,即**用户数据包协议**
传输层有一种简单的协议,叫 UDP 协议,UDP 协议只是为数据简单的加上包含发送方端口和接收方端口的标头,就将 UDP 数据包扔给网络层,它不保证是否能成功的发送给接收方,它是一种不可靠的传输协议。因为简单,减少了时间开销,常用于对时间有较高要求的应用程序。
## 六、应用层(Application Layer)
链路层、网络层、传输层实现了数据包能从主机应用发送到目的主机应用。正常情况下,网络上主要传输的数据是应用产生的。传输的数据各种各样,有网络请求,有电子邮件等等。数据需要由[应用层](https://zh.wikipedia.org/wiki/应用层)(Application Layer)封装,即规定数据的格式。
规定「网络请求数据」格式的是 [HTTP 协议](https://zh.wikipedia.org/wiki/超文本传输协议)。可以说,HTTP 协议是应用层的一种实现。
### 6.1 HTTP 协议
> **HTTP 协议**:英文全称为:H**yper**T**ext **T**ransfer **P**rotocol,即超文本转移(传输)协议
当我们打开百度首页时,输入的就是一个网址 `www.baidu.com`,这是一个 GET 请求,HTTP 协议将请求封装为应用层数据包。这样,百度的服务器应用层就可以根据 HTTP 协议来解析数据包。
HTTP 请求的数据包一般称为请求报文,分为报文首部和报文主题,报文首部即为请求头,请求头格式如下:
![](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214832995-1906529284.jpg)
包含的应用层数据包的以太帧格式如下:
![图片来自阮一峰博客](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214833157-647488711.png)
### 6.2 DNS
> **DNS**:英语全称为: **D**omain **N**ame **S**ystem,即**域名系统**
类似 `www.baidu.com` 这样的网址域名,是为了用户方便记忆,网络通信时,需要将域名转换为 IP 地址,这是由 [DNS](https://zh.wikipedia.org/wiki/域名系统) 负责的,它也属于应用层。
## 七、WireShark 抓包分析
当 Mac 连 WIFI 后,可以在「设置->网络」中看见下面这些内容:
![TCP/IP](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214833698-1942929917.jpg)
![MAC 地址](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214833982-767638251.jpg)
![DNS 地址](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214834199-934769607.jpg)
此时电脑,有自己的 IP 地址、MAC 地址、还知道路由器的 IP 地址、DNS 服务器地址(由路由器负责域名解析,所以 DNS 地址其实就是 IP 地址)和当前的子网掩码。还可以看出,路由器动态分配 IP 地址是由 [DHCP](https://zh.wikipedia.org/wiki/动态主机设置协议) 实现的。
通过打开百度首页,结合抓包工具 Wireshark 来看看网络通信过程中的数据包的内容。
关于如何使用 Wireshark,请看 [使用 wireshark 学习网络协议](https://juejin.im/post/5c87059ae51d452f3f64b110)。通过 `ping www.baidu.com` 得到百度的 IP 地址为 `61.135.169.121`,在 Wireshark 中配置过滤条件后,通过使用命令 `curl www.baidu.com` 来模拟打开百度首页:
![](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214836386-362365619.jpg)
此时在 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 个字节。
![](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214837504-1197393727.jpg)
这与我们前面说的相符合,目的主机不在同一个局域网,通过以太网发送以太帧给路由器,再由路由器负责路由发送。
前三个数据包为 TCP 的 3 次握手,接着发送了 HTTP 数据包,HTTP 数据包包含了请求的内容:
![](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214838262-144315251.jpg)整个过程:先使用 TCP 协议完成了 3 次握手,然后使用 HTTP 协议发送了 GET 请求,接收到了百度的 HTTP 响应,最后使用 TCP 协议完成了 4 次挥手。
![](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214838775-1240222390.jpg)
## 八、总结
互联网协议整个网络通信过程可以用下面这张图描述:
![图片来自 Wiki](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214839313-942015146.png)
对于发送方的数据处理,**这个过程像是一个俄罗斯套娃的过程**:
![图片来自 Wiki](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214839930-702484959.png)
如果用发快递来类比一下:
```
应用层:将物体打包为快递
|
传输层:为快递填上收件人门牌号;如果快递丢失重新发送
|
网络层:为快递填上收件人小区地址;并根据收件人小区地址,找到下一个快递中转站的地址,最终找到整个线路
|
链路层:为快递填上下一个中转地地址;并负责将快递发往到下一个中转站
|
物理层:运快递的车
```
在互联网协议中,因为 TCP/IP 协议最重要,所以互联网协议也可以叫做 「**TCP/IP 协议族**」。
此文只是个人对互联网协议的浅显理解,毕竟没有深入研究,可能有诸多不当处,欢迎留言指出。
最后我想说一句,阮一峰牛逼。有的知识点是知道怎么回事,就是不能正确的表达出来,遣词排句真的很需要功力,真的需要常年累月的积累。
## 九、延伸阅读
- [互联网协议入门(一)_阮一峰_](http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html)
- [互联网协议入门(二)_阮一峰_](http://www.ruanyifeng.com/blog/2012/06/internet_protocol_suite_part_ii.html)
- [使用wireshark学习网络协议](https://juejin.im/post/5c87059ae51d452f3f64b110)
![个人公众号](https://img2020.cnblogs.com/other/1191638/202003/1191638-20200320214840913-1274635722.png)
加载全部内容