可能这是每个程序员都会遇到的一个事情,在工作机上访问公司局域网或者小组共享目录中的资料,那么在windows上,当你在文件浏览器中输入一个共享目录然后敲下回车键之后具体会发生什么呢?
windows访问共享目录使用的是一个叫SMB的应用层协议,这是一个工作在TCP/IP层之上的协议。从输入局域网共享目录机器名开始,你电脑悄悄地帮你做了如下的若干事情:
- 查询WINS/DNS服务器(忽略host文件),找到机器名对应的IP地址
- 向对方电脑的IP地址发送一个合适的SMB数据包
- 传输层将这个数据包作为数据包含在在自己的TCP数据块里,加上自己的头信息,重要信息是加上SMB的协议端口
- 网络层IP协议将传输层的数据包作为数据包装在IP数据包里,加上自己的头信息,填上合适的IP地址,根据路由表选择合适的本机路由出口
- 通过ARP协议找到相应的MAC地址后(但一般这个都已经在arp-cache里面了),在链路层包中填上MAC地址
- 交给物理层真正的运输出去。
可以很清晰的从这个wireshark包里看到协议的分层结构,这里可以先忽略NetBIOS这一层,至少从这个简单的分层截图中看到这个协议是运行在TCP之上的并且每一层的关键元素都显示的很清楚。比如传输层的端口号(139),IP层的IP地址,数据链路层的MAC地址等等。点击前面的">"符号还能看到更加详尽的信息,在后面就以这个为例子来详细的介绍每一层,这样也好有个直观的印象。
那么当对端的网卡怎样在网络上收到这么一个包呢,它是如何知道网络上那么多的包,哪一个是发给自己的呢?当然是通过MAC地址,网卡驱动程序在对比了MAC地址之后,发现和自己MAC地址相匹配包会产生一个中断告诉CPU去读取这个包并向上传递。所以当对端主机检测到相应的包之后他会这样默默的做很多事情:
- 将相应的包读入,交给数据链路层
- 链路层对比MAC地址,然后将自己的数据链路头信息去掉,交给网络层
- 网络层程序读取IP地址并且对比,如果可以让其通过,去掉自己IP头信息,将数据包交给传输层
- 传输层对比端口信息,并且查看端口是否对应,若对应,去掉自己的头信息,将数据包交给应用层
- 应用层拿到数据后根据自己的需要进行处理
看到这个步骤,对于2,3可能会产生疑问,既然MAC地址是唯一的,保证了可以筛选到合适的数据包,为什么到上一层还要有一次网络层的筛选呢?难道一个MAC地址还能对应多个IP地址?在一般情况下,这是不可能的,如果真的一个MAC地址对应了多个IP地址的话,那么一般情况下你可能是遭遇了ARP欺骗了。那么IP层的过滤一般有什么用呢?答案是防火墙,防火墙一般都会工作在这一层,因为IP数据包里拥有一些,具体的技术就比较多了,可以去google一下。
对于被步骤4放弃的数据包,有一个著名的ICMP协议来报告所有差错,也许ICMP你没有听过,但是ping你一定用过,ping程序就是利用ICMP协议来诊断网络连接,这个在后面我会详细介绍的。
其实从一个电脑接上网络开始系统就默默的做比上面这个几个步骤更多的步骤,因为很多协议都没有具体介绍,所以在后面介绍到合适的时候,再回来利用这个例子来阐述一下当你刚装好系统,插上网线的那一刹那到访问一个共享目录都发生了些啥。