今天我们来讨论一下TCP/IP协议的四层模型。
首先,我们先看一下,TCP/IP四层模型是怎么分的:
层 |
应用 |
应用层 |
HTTP |
传输层 | TCP |
网际层 | IP |
网络接口层 |
网线,双绞线,Wi-Fi |
TCP/IP四层协议与OSI七层协议的映射关系:
OSI七层模型 |
应用 |
TCP/IP四层模型 |
应用层 |
HTTP,DHCP,DNS |
应用层 |
表示层 |
不用协议 | 应用层 |
会话层 |
不用协议 | 应用层 |
传输层 | TCP |
传输层 |
网络层 | IP |
网际层 |
数据链路层 |
Internet,Wi-Fi |
网络接口层 |
物理层 |
双绞线,光缆 |
网络接口层 |
当我们去邮局将一份信寄出后(假如这封信是跨省递送的),这封信可能依次被递送到寄件人的县区,市区,省级邮政部门,长途运送到收件人所在省级邮政部门,再依次送到市区,县区,直到送至收件人手上。数据在网络中的传输,正如邮局派发邮件的顺序。接下来,我们将从底层由下往上来解析网络:
1.物理层
物理层,就是物理的,可见的。用到的就是我们平常所说的光纤,双绞线,Wi-Fi(无线电波)等物理介质。众所周知,计算机里都是用0或1来表示数据的,对应到不同介质里,就是不同的表现形式。比如说光纤和WiFi中就用波峰和波谷分别表示1和0,双绞线中用高电平和低电平分别对应1和0。
2.数据链路层
那么,计算机是如何将A发送给B的信息准确送达的呢?如果是写信,那肯定是要写上收件人的具体地址及姓名,这些信息必须是收件方的唯一标识。每个计算机也有自己的唯一标识,那就是Mac地址。这个Mac地址是随计算机一起出生的,而且每台计算机都不一样。
有了MAC地址,我们就可以传输信息了,至少相邻主机间可以正常交流了。(为什么说相邻主机,请看下文分析)因为设备一旦接通,那么数据线中必定不断地有0/1的信号,所以必须用一段固定的码字来表示数据包的开始和结束。
我们可以定义这样一个协议:(所谓协议,就是计算机间的一种约定)
*数据包开头用111标识数据开始
*24bit表示发送方的Mac地址
*24bit表示接收方的Mac地址
*要发送的信息正文
*数据包结尾000表示数据结束(若数据包开头结尾不是111和000,则说明这是一个假信息)
比如说我们有一条信息要从pcA发送到pcM,用ASCII码表示为pcA:01110000 01100011 01000001,pcM:01110000 01100011 01001101,信息内容为hello:01101000 01100101 01101100 01101100 01101111,那么我们的数据包格式就为:
111
01110000 01100011 01000001
01110000 01100011 01001101
01101000 01100101 01101100 01101100 01101111
000
(本来这些信息是连在一起的,为了看起来清楚,所以用回车分割)
如果这样的话,就出现了一个问题,因为计算机是从111开始读信息,当读到000是就停下来,所以如果在数据包内部还没结束的时候出现了连在一起的三个零(即Mac地址或信息正文中出现000结束符),那就会导致计算机读取数据出错。为了解决这样的问题,我们可以在111起始符之后加上一段,表示这段数据的长度,这样即使在正文中出现000终止符,也不会提前终止了。这样,就可以将协议修改如下:
*111起始符
*16bit数据包长度
*24bit发送方Mac地址(源Mac地址)
*24bit接收方Mac地址(目的Mac地址)
*信息正文
*000终止符
数据包长度=发送方Mac地址长度+接收方Mac地址长度+信息正文长度=24+24+40=88,88用16位二进制表示为:00000000 01011000,那么数据包格式如下:
111
00000000 01011000
01110000 01100011 01000001
01110000 01100011 01001101
01101000 01100101 01101100 01101100 01101111
000
3.网络层
Mac地址就像一个人的姓名(计算机界不存在同名同姓),它只能确定某一个相邻的主机,当出现以下情况时,它便力不存心了。
A — C — D — E
\ /
\ /
B
A想要向E传送数据,过程如下:
*A把信息广播发给B和C:给我传给E
*B和C收到信息后将源Mac改成自己再发送给D:给我传给E
*D收到信息后将源Mac改成自己再发送给E
因为每台机器发送的每条消息的源Mac地址都必须是自己,这种情况下,E虽然能收到消息,如果只看Mac地址,它会误认为这条消息是D发给自己的。为了解决这个问题,就必须用到另一个地址——IP地址。所以继续修改协议,在Mac地址之后加上源IP和目的IP,假设源IP为192.168.1.2,目的IP为192.168.1.105,则修改后数据包格式如下:
111(起始符)
01110000 01100011 01000001(源Mac)
01110000 01100011 01001101(目的Mac)
11000000 10101000 00000001 00000010(源IP)
11000000 10101000 00000001 01101001(目的IP)
01101000 01100101 01101100 01101100 01101111(信息内容)
000(终止符)
这样,我们就可以实现跨节点传输数据了。
4.传输层
跨节点的数据包可以发送了,那么问题又来了,还是上面的例子,A如何确定数据包确实传到了E?网络层的IP协议不提供可靠性,那么可靠性又如何保障呢?同一台计算机上有可能运行多个程序,我们又如何知道数据包来自哪个程序?
计算机中,每个程序都有自己的ID号(实质上为端口号),称为pid,数据包加上源端口号和目的端口号,就可以确定数据包由哪个程序发给哪个程序。
如果发出一个大文件,它会被分在好几个数据包中传送,到达目的地后再进行整合,合成原来的大文件显示给接收方。但是,由于每个数据包走的路径不一样,不会以原来分割时的顺序依次到达目的地,所以必须在每个数据包中加上数据包的序号。
因为数据传送是双向的,所以在向对方发送数据时,可以加上已收到对方的数据包个数。
所以协议中还必须在IP地址后加上如下内容:
*16bit源pid(源端口号)
*16bit目的pid(目的端口号)
*16bit数据包序号
修改后数据包格式如下:
111(起始符)
01110000 01100011 01000001(源Mac)
01110000 01100011 01001101(目的Mac)
11000000 10101000 00000001 00000010(源IP)
11000000 10101000 00000001 01101001(目的IP)
00000000 01100110(源端口号)
00000000 01011101(目的端口号)
00000000 00001001(已确定收到9个数据包[可以发送第十个])
01101000 01100101 01101100 01101100 01101111(信息内容hello)
000(终止符)
这就是一个功能基本完整的基于流的双工的协议。
5.应用层
应用层是网络模型中标准最多,也最不成熟的一层。我们常用的DNS,HTTP,FTP等协议都工作在应用层中。在这一层中,一应用程序,软件为载体,为用户提供服务如文件访问、传输、管理,收发邮件,虚拟终端等。