TCP/IP详解卷一 第一章
30 Mar 2013 by LelouchHe
分层协议
有一张图很好的表达分层协议的地位和作用
从下自上分别为:
- 链路层: 这层出现的主要目的在于集中处理各自物理链路层面上的通讯问题,图上我们可以看到,现实中存在多种网络连接的物理实现(像图中的以太网和令牌环,后文介绍的slip和ppp等),每个层次要处理的物理通讯都非常不同,但又非常细节,需要一些抽象通用的功能实现,这些都是在链路层进行处理,他们屏蔽了各自的物理实现.唯一要注意的是,链路层只处理一种物理连接实现,以太网的只负责以太网的通讯功能,令牌环的也只负责令牌环的通讯,不能跨域来进行通讯
- 网络层: 链路层无法跨域,所以就引入了其上的网络层(其中著名的ip协议),网络层的一个作用就是屏蔽掉不同网络物理实现的不同,通过一个抽象的ip地址来代表通信线路(就是网络)上的一点,而不关心实际物理地址,或者实际通讯细节如何.这层的存在是非常必要的,相当于对通讯封装了统一接口,我们之上的工作只需要在这个抽象之上来做即可.从目前来看,这个抽象很成功
- 传输层: 网络层对网络通讯的点做了抽象,屏蔽掉了点与点之间的连接细节,但是此时的通讯仍然处在临近点之间(链路层处理统一物理网络中A到B的通讯,网络层处理逻辑网络中A到B的通讯),这样就引入了传输层(tcp/udp)来抽象真正通讯双方的连接,此时的通讯双方,不再局限于临近,而是真真正正的在网络上的任意两点.可以想到,传输层定义的,肯定是如果从临近的两点信息中,找到S到D的一条网络通路,并通过抽象的网络层,将真正的通讯内容,传递过去(可以看到,没有网络层,这是多么的难做成).之所以有两种通用协议实现,主要还是在于不同的使用情境.tcp保证质量,但通讯繁杂;udp保证速度,但质量堪忧,而且如果自行实现来保证udp的可靠,无异于自行实现tcp栈.所以在平时使用中,尽量使用tcp
- 应用层: 解决了统一逻辑网络任意两点间的通讯问题之后,剩下的问题基本就是应用问题了.设计怎样的协议,如何通讯,如何响应,虽然在这一层同样有一些模式可循,但都是应用程序自己的事情了,打包好数据,剩下了事情就被传输层屏蔽了
其实看来,就解决的通讯问题而言,链路层是”物理网络相邻两点”, 网络层是”逻辑网络相邻两点”,传输层是”逻辑网络任意两点”,应用层则是”通讯内容和通讯方式”
tcp/ip协议族
逻辑上的分层协议,在实现上同样有类似的结构,将各个分层一一匹配,有下图:
自下而上对应的协议有:
- ARP/RARP: 这两个协议负责将抽象的ip地址和具体的物理地址的映射.这个很好理解,因为抽象的网络节点,必须在真正物理传输的时候映射到具体的物理节点才可以进行,这个是保证抽象ip协议可以正常使用的关键,仍然处理的是底层物理细节,不同的物理网络,实现肯定不一样,映射的物理地址方式也有区别
- IP/ICMP/IGMP: IP主协议用于抽象相邻物理节点的通讯,ICMP则是IP的附属协议,用于在抽象网络中进行控制(C = Control),IGMP则是分组管理协议
- TCP/UDP: 传输层的标准协议
- 应用层协议: 各种网络应用实现自定义的协议
ip地址分类
ip地址的分类方式有很多种,比较古老而经典的分类是网络/主机分类法,见图:
这种方式将ip地址分成两级,一级是网络地址(即图上的网络号),用以标明一个主机群所在的网络编号,二级是主机地址,即真正通信用主机地址.这样进行分层的一个目的是简化ip分配工作,上层顶级分配服务商只需要负责合理划分网络地址,主机地址可交由下级分配来处理,网络地址的不同,就明确保证了ip地址的不同,这样有助于各种分工和合理化利用
另一种分类方式是网络/主机的增强版,在主机地址内部,再进行划分(驱动力和上面的一样),在主机地址内部,再次区分成子网地址和主机地址,这样进一步细化,更加灵活的匹配的ip的使用场景(也增加了我们的学习负担..唉..)
封装
协议的作用主要体现在协议对于应用数据的包裹与整合,下图展示了协议和应用数据的结构关系:
可以看到,自上而下,每经过一层,上层数据就会被当作一个整体,添加一些下层协议的部件(比如协议头,比如校验尾之类的),下层协议不会处理上层协议封装好的任何数据(否则就不叫封装了)
而自下而上的时候,每经过一层,本层协议就会对本层协议添加的部件进行处理(包括最重要的校验,删除额外的协议头等),然后把上层协议需要的数据向上传递,整个过程对上层协议完全透明
这其实就是分层的最大优势,我们可以无限数量的添加层数,而不影响任何一层的逻辑(当然,也不能无限,而是要视处理问题的情况而定),这种透明性是非常重要的.
反观我们的服务协议,就有些严重的问题了.拿us为例,为了判断一个结果是否需要入cache,竟然需要深入到返回结果内部来探究,这样不仅增加了服务间的耦合,同样也增加的问题处理的复杂度(比如io线程就需要很仔细的解析结果,然后很多业务逻辑就存在于纯io中了)
这样不是好的协议方式,在以后重构我们服务的时候,需要仔细的考虑和设计了
总结
tcp/ip协议是网络连接事实上的标准,同样也是分层协议的经典代表,不论是从协议的设计,还是协议的实现,都有非常多的地方值得借鉴.这个协议与OSI7层协议之间的竞争结果,也凸显了一个道理,即互联网或者IT行业,能工作,已经工作的东西,远远比理想的东西要好.先要跑起来,然后再想着怎么改进,这是快速开发快速迭代快速上线的互联网的特征,在迭代中前进,而不是在完美中退出.