l 前言:
大三的上学期学了计算机网络,这门课和编译原理,操作系统,计算机组成原理并称为计算机专业最重要的四门课,也是了解整个现代计算机基础的课程。
就计算机网络来说,我们学来学去也不过就是网络的体系构: OSI(Open System Interconnection)的7层协议模型,TCP/IP的4层协议模型,以及二者折中的5层协议结构,记得上第一节课的时候,老师给我们留了个作业:让我们自己查查什么是网络协议栈,当时我找了不少资料,但并没有理解何为网络协议栈,作业也就胡乱写了一通,直到学期结束,还是浑浑噩噩,但到今天,终于还是有所感悟:不客气地说,无论是7层模型还是5层模型,最主要的就是各个层的协议,这些不同层次的协议分担着不同的功能,由底至上共同确保整个网络体系结构的正常运行,这就是我理解的网络协议栈。
我个人一直认为: 理论上的学习应当适可而止,没必要一直深究,应该多动手实践,这样才能更好地理解已学过的东西,就像有的同学C语言理论可以考得很高,但一机试就跪了。同样的,对于计算机网络体系结构,我相信不少人可以把网络体系结构各个层次,各种协议都倒背如流,信手拈来,但一让他写点代码可能就会不知所措。
所以: 把学过的各个主要的网络协议都手动实现一遍,从数据链路层一直到应用层,看着数据从自己实现的协议栈中一层层包装上传,再一层层解封接收,是不是很有意思呢?毛泽东所著的《实践论》告诉我们:人们的认识运动,首先经历由实践到认识的过程,即在实践的基础上从感性认识上升到理性认识,,人类认知发展的全过程是从实践到认知,再实践,再认知,以这种形式一直循环下去,而每次一实践与认知,都会提升我们认知的高度,最后探寻出相对真理,无数的相对真理就组成了绝对真理,实践与认知的反复过程帮助人们更好地认知世界,改造世界。所以本系列文章的目的:在实践的过程中更好地认识所学的东西,从实践到认知,迈出求知的第一步!
l 一些基础知识
好吧,前面废话了那么多,还搬出马哲毛选来忽悠了,现在该上点干货了:
现在通常的网络体系结构有三种:就是前面所讲的:OSI(开放互联)7层协议模型,TCP/IP的4层协议模型,以及二者折中的5层协议结构,具体结构如下图:
图1-1
关于这三种类型的区别与联系这里就不过多赘述,一般关于计算机网络的教材都会讲。但这里着重讲一下五层协议结构(即图中的原理体系结构),因为接下来我们要实现的网络协议栈就是这种架构,实际上,现在计算机上实际应用的也是这种结构。
1. 五层协议结构的各个层次的作用:
物理层:物理层是五层体系结构中的底层。它的任务是利用传输介质为通信的网络结点之间建立、管理和释放物理连接,透明地传送比特流。“透明地传送比特流”表示上层协议只看到“0”、“1”比特流,而不用关心物理信号的传输,因而也就“看不见”物理层是如何实现比特流的传输的。物理层利用的一些物理媒体(如双绞线、同轴电缆、光缆等)并不在物理层协议之内而是在物理层协议的下面。因此也有人把这些物理媒体认为是网络体系结构的第0层。
数据链路层:数据链路层在五层体系结构中位于物理层和网络层之间,相对于高层,数据链路层所用的服务和协议都比较成熟。在发送数据时,数据链路层的任务是将在网络层交下来的IP数据报组装成帧(framing),在两个相邻结点间的链路上传送以帧(frame)为单位的数据。每一帧都是由数据和一些必要的控制信息,如同步信息、地址信息、差错控制以及流量控制信息等组成的。
网络层:网络层在五层体系结构中位于数据链路层和传输层之间,它的作用是为分组交换网上的不同主机提供通信。而传输层的作用是为运行在不同主机中的进程提供逻辑通信。注意它们之间的区别。在发送数据时,网络层会把传输层产生的报文段或用户数据报封装成分组进行传送。网络层还有一个任务就是路由的选择,使源主机传输层所传下来的分组能够交付到目的主机。
传输层:传输层在五层体系结构中位于网络层和应用层之间,其作用是为运行在不同主机中的进程提供逻辑通信。
应用层:应用层是五层体系结构中的最高层。它可以根据用户所产生的服务请求确定进程之间通信的性质是否满足用户的需要。应用层直接为用户的应用进程提供服务。
2. 各个层次之间对应的协议如下图:
图1-2
在这张图里,物理层和数据链路层被抽象成了网络接口层,其他都不变,至于这张图里的各个协议,就是我们以后实现的重点,计算机网络协议栈主要就是由这些协议构成的。
3 五层网络体系结构下计算机端的通信过程
假定两台计算机是直接相连的,发送端的应用程序进程要与接收端的应用程序进程进行数据交换,具体过程如下:
1)发送端应用程序进程将它的数据发送到应用层,应用层数据加上本层的控制报头H5,形成应用层的协议数据单元,传到传输层。
2)传输层收到这个数据单元后,加上本层的控制报头H4,再向下交给网络层。
3)网络层进行同样的处理,加上本层的控制报头H3,再传到数据链路层。
图1-34)数据链路层得到数据后,将控制信息分成两部分,分别加到本层数据单元的首部(H2)和尾部(T2),构成数据链路层的协议数据单元,再向下交给物理层。
5)数据到达物理层后,物理层将以比特流的方式将数据通过物理传输媒体传送到接收端主机。比特流是从有首部的这头开始传送的。
6)比特流到达接收端后,再从接收端的物理层开始依次上传,每层根据控制信息进行必要的操作,剥去控制信息,将剩下的数据单元上交给更高的一层。直到最后,把发送端应用程序进程发送的数据交给接收端的应用程序进程。
从这个过程可以看出数据在传送过程中有这样的特点:在发送端自顶向下层层添加控制信息,在接收端自底向上层层剥去控制信息。这样做有什么好处呢?首先,如果数据在传送过程中出现错误,可以根据这些控制信息及时发现和纠正,保证数据传送的可靠性。其次,上层的数据不含有下层的协议控制信息,这样相邻层之间可以保持相对独立性,下层具体实现方法的变化不会影响上层功能的执行。
应用程序进程间的数据交换是一个复杂的过程,但在用户看来,就好像发送端应用程序进程直接把它的数据交给了接收端应用程序进程。同理,图中任何两个对等层之间,也好像直接把数据传送给对方一样。实际上对等层之间是没有直接通信能力的,这只是一种形式上的逻辑通信,需要依靠下面各层提供支持。
前面说了很多遍我们要实现一个网络协议栈,但具体是干嘛呢?其实具体就是实现图1-2所示展示的那些协议。
数据链路层:Ethernet工业以太网协议;
网络层:ICMP/IGMP协议,IPv4协议,ARP/RARP协议;
传输层:TCP协议,UDP协议;
应用层:HTTP协议;
知道了这些协议,再看图1-3所描述的两台计算机之间通信的过程,任何协议都是具有发送和接收功能的,所以我们不仅需要实现发送功能,还需要实现配套的接收功能,不然,这样的协议无法工作,并且如果有机会更深入研究的话,我们还能在应用层基础上实现一个简单的WEB浏览器,当然这都是后话了,这些协议后面会逐一详细介绍,并手动编程实现它们。不过需要注意一点的是,我们在物理层并没有想着去做网卡和网卡驱动,这里需要借助WinPcap开发包来帮注我们从网卡获取数据和发送数据。
l 开发前的准备工作
好吧,从现在开始才是真正地进入我们的实际开发了,虽然前面啰嗦了这么久,但磨刀误砍柴工。
下面还有些事情需要交代清楚:
我们的开发环境:
我个人的电脑是Windows10加Visual Studio 2013。采用C语言编程,当然用XP加VC6.0++也是没问题的。前面说了要借助WinPcap,所以我们得先去官网下载最新的WinPcap安装,目前最新的版本号是4.1.3,然后还得下载WinPcap Developer’s Pack,目前最新版本号是4.1.2。
另外,在VS创建工程的时候,需要配置属性,具体步骤如下:
1. 在VC++目录添加包含目录和库目录,路径是下载好的WinPcap Developer’sPack,里面有两个文件夹:include和lib,添加进去就好
图1-4
2. 链接器->输入->附加依赖项里头添加Packet.lib; wpcap.lib; ws2_32.lib;
3. 链接器->常规->附加库目录里头依旧添加WpdPack的lib目录;
到此为止,我们的准备工作就算是完成了,接下来就开始准备实现我们的网络协议栈了,我们实现的顺序是由由底向上的,所以下一步就是实现Ethernet工业以太网协议了。
l 参考资料
毛泽东《实践论》:http://baike.baidu.com/link?url=1jbVrQm18zMZbE3C0QY-hCPdntWa1E7h0fHXb3LT3_FiTn6b_qkjVh1AMXX44CVOjWFc2lY5FsUKOZqEu7qTZa#7
《计算机网络》第6版--谢希仁编著
《网络原理与实践》第2版--红黑联盟
五层原理体系结构的简单分析--ChinaUnix博客