网络模型解析

         今天我们来讨论一下TCP/IP协议的四层模型。

         首先,我们先看一下,TCP/IP四层模型是怎么分的:

应用

应用层

HTTP

传输层

TCP

网际层

IP

网络接口层

网线,双绞线,Wi-Fi

        TCP/IP四层协议与OSI七层协议的映射关系:

OSI七层模型

应用

TCP/IP四层模型

应用层

HTTPDHCPDNS

应用层

表示层

不用协议

应用层

会话层

不用协议

应用层

传输层

TCP

传输层

网络层

IP

网际层

数据链路层

InternetWi-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等协议都工作在应用层中。在这一层中,一应用程序,软件为载体,为用户提供服务如文件访问、传输、管理,收发邮件,虚拟终端等。
       
       
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值