前言
简单编写一下tcp例子。
正文
我们常说IOS有7层,实际上也只有4层,或者这样说简单的说是4层。
首先是数据链路层,首先这一层解决了什么问题呢?为什么要有这一层呢?
首先要抛开有操作系统的意识,因为它为我们做了太多东西了,摆在你面前的只有两个终端和一根网线。
数据链路层定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。示例:ATM,FDDI等。数据链路层必须具备一系列相应的功能,主要有:如何将数据组合成数据块,在数据链路层中称这种数据块为帧,帧是数据链路层的传送单位;如何控制帧在物理信道上的传输,包括如何处理传输差错,如何调节发送速率以使与接收方相匹配;以及在两个网络实体之间提供数据链路通路的建立、维持和释放的管理。
这里最好奇的是封装成帧:
封装成帧(framing):就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。
这样就相当于有切割了,我们一直传输的是0和1,比如我们按照顺序传输的是01101001010101010101010101010。
接收机也的确收到了这个信息了,但是没法知道具体含义啊。这就很尴尬了。
但是我这样传输,如果在前面加标记说是开始,然后加标记结束,这样不就是ok的啊。然后我们都用默认的utf8,这样不就形成了一段话啊。
简直完美极了。这个想法,我自己都能想出来。就像在古代,也有飞行的想法,在人身上装两个翅膀呗。
这就是想法是美好的,但是怎么做呢? 我应该设置什么标志让其知道是开始呢?会不会和我的发送的数据冲突呢?
(1)如何识别帧的开始与结束;(2)在夹杂着重传的数据帧中,接收方在接收到重传的数据帧时是识别成新的数据帧,还是识别成已传帧的重传帧呢?
现在有了想法,那就来解决问题。
首先解决一个这样的问题,那就是SOH和EOT的问题。
那就是设置01(二进制是00000001)和04(二进制是00000100),分别为帧开始的标志和帧结束的标志后。
那么如果我数据中也存在01和04怎么办呢? 这个时候就要转义了。如果出现了01和04那么就要转成别的了。
这个知道转义符的都怎么哈,就不用太多解释了。
解决方法:发送端的数据链路层在数据中出现控制字符”SOH”和”EOT”的前面插入一个转义字符”ESC”(其十六进制编码是1B)。而在接收端的数据链路层在将数据送往网络层之前删除这个插入的转义字符。这种方法称为字节填充(byte stuffing)或字符填充(character stuffing)。如果转义字符也出现在数据当中,那么解决方法仍然是在转义字符的前面插入一个转义字符。因此,当接收端收到连续的两个转义字符时,就删除其中前面的一个。
如下图:
然后还有一些帧的问题需要解决了,这里也不可能列举,实际上还有帧的丢失、帧的重复等帧的问题了。
现在假如帧的问题解决了,解决了点与点的问题,那么还有一个问题就是假如一台机器连接了几台机器。
那么我要向起一台机器发送消息怎么办呢? 这个时候就有一下协议产生了,比较著名的是以太网协议了。
它就是说在相连接的机器,每个都发送消息,检查mac是否相等,就收到,不是就丢弃。
这都是有历史的,总之呢,现在相邻的机器可以互相发送消息了。
但是后来电脑越来越多,然后呢,如果要向每台电脑发送信息的话,那是不是有点问题啊,这样层层发送下去,就很不方便。
也就有了网络层了,之所以叫网络层就是电脑越来越多,像网状结构一样,ip协议也就是为了解决这样的问题的。
那就是因为以太网这种协议不适合互联网了。所以说,网络层解决了目的主机和源主机的通信。
好了,现在每两台机器之间可以通信了,那么是不是就ok了呢?
为什么tcp这样的传输层协议出现呢? 目的主机和源主机能够通信了这很好。
但是就是有这样的需求,第一条消息必须比第二条信息后到。我要传输大数据啊,你这不行啊,ip协议发包是有限制的啊。
后面就有很多公司有自己的协议了。比较出名的就是tcp了,解决了传输大数据的问题,按照顺序传输,我给你组装呗。
这一层解决了,数据制定了数据传输的规则,所以叫做传输层呗。
理论上你要大数据有数据了,传输规则你也定了,理论上数据传输是没有问题的呀,数据传输得到了保障啊。
你有啥问题,你可以提的嘛。这时候随着软件的发展哈,还就真的有新的问题了。
软件行业就有问题哈,你这个数据能到是没有问题了。但是这个数据格式有问题啊。
一开始你传123给我,我传456给你,大家都玩得比较开心的。
后来软件越来越复杂了,就有了很多格式了,后来不同格式多了就有了协议了。举个例子,比如http。
因为是解决应用的问题,所以叫做应用层。
结
总之,如果向学习哪一层,就看哪一层是做什么的,解决什么问题。下一章就是具体的例子了。