这段时间遇到了一些网络上面的问题,但是本身我对计算机网络了解的不是很系统,定位问题的时候也无从下手, 这次打算系统的整理一下自己对计算机网络的认知,之前看计算机网络相关的文章偏向于理论,什么属性之类的,看到了也似懂非懂的,也是我在写代码过程中遇到了问题,才对这些属性有一个大致的理解,所以本系列的文章会结合网络编程来介绍,程序是计算机世界和人类世界沟通的桥梁,选取的语言是Java,如果主力编程语言是其他的,也可以看,大差不差。本系列的文章不会只介绍理论,还会辅以介绍网络编程、网络工具,尽量做到理论与实践相结合。网络相关的文章其实也写过一些了:
- 《从爬虫到万维网》
- 《Socket简介和I/O多路复用》
- 《NIO 学习笔记(一)初遇》
- 《NIO 学习笔记(二)相识篇》
- 《NIO学习笔记(三) 甚欢篇》
- 《Netty学习笔记(一)初遇篇》
这次会统一收拢这些文章到网络系列的文章中。如果在公众号还没发现这些文章,那就去思否、掘金找找。目前公众号、思否、掘金三个平台的文章还没有做到统一,会挑个时间将三个平台的文章进行统一。
前言
想起我大学的《计算机网络》这门课,第一堂课,老师让我们ping网址,好像还拿了网线,但是还是觉得蛮有趣的,后面就开始按书上讲概念,也就理论,我听了又不是很理解,总是似懂非懂的,我很讨厌的这种感觉,索性后面就不听了,期末拿一个60分万岁。后面想学计算机网络的原因是因为面试网络也是高频面试题,为了彻底理解,所以才会有学计算机网络的打算。但是到今年有一些新的打算,我打算做一点网络编程相关的东西,打算做一个开源项目,再加上工作上确实遇到了网络相关的问题,所以这次打算重新学习一下计算网络,我们对事物的认知,是一个逐步清晰的过程,所以本系列的文章不会一开始每个点都讲的很细,会有一条主线贯穿,然后需要用到某一点的时候,会将这一点描述的清楚。
通信的本质-交换信息
小的时候跟着家里人去浇地,对于小小的我来说,地还是很大的,有的时候水管摆的不对,叔叔会在地的那头,朝我喊,我叔叔会在地的那头,冲我喊。如果我没听清,我就会也冲着他喊:你说的啥。然后我叔叔就会再说一遍,一般再说一遍就行了,但有的时候地确实比较大,他说的话我确实没听清的时候,他就会走到我面前说。那我要是听错了一部分呢,他说的某句话中有个字我没听到,一般他会看我的动作,做的不对就直接来找我了。
这事实上就暗含了通信过程中所面临的一个典型问题:
- 信息在传输的过程中丢失了该怎么办?
再传一遍
- 如何确认信息正确收到了呢?
确认
我们可以将这个过程引申到互联网上,如今的网络已经成为了我们生活的一部分,你给微信上给朋友发消息,你从来不会担心你朋友在有网的情况下会收不到这条消息,即使你在北京,你的朋友在海南,消息快速准确的传递依然是被视作理所当然的,即使中间经过了一个一个又一个的路由器、各种各样的光纤,这仍然被视作理所当然的。但这种理所当然下面是各种各样的确认、转发,所谓冰山在海里移动很庄严,这是因为它只有八分之一漏出水面。
那让我们来想想这条信息在传输过程中会经历些什么,对于不熟悉网络的人来说,在电脑上发消息这条信息是不是直接就到光纤了呢,假定那个人在电脑上也开着微信,两台电脑都直接连着光纤,所以这个通信模型是下面这样:
但是仔细想一想这个模型实在简单的过分,我们将模型变的复杂一丢丢,通信的双方命名为A、B。A和B家里各有三台电脑,另外两台他们家里人用,那么A的这条信息再去找B,面临一个问题B的电脑在哪里? 如果这个问题复杂的话,我们不妨将问题再简化一些,A和自己老婆发信息,这条信息该如何送达,我们首先可以想到的问题仍然是A发送的这条信息该如何找到老婆B的电脑,由于两个人在一个房间,这让事情看起来简单了许多,我们为每台电脑登记一个地址即可,每台电脑在出厂的时候会有一个Mac(硬件地址,网卡地址)地址,但如何知道呢,我们可以从日常生活中找到一点灵感,我们每个人都会有身份证,这个是固定的,相当于一个固定地址,又假设全国人民都不爱动,一出生就待在一个地方,这样根据身份证上的地址,快递员就可以轻松的找到你。
一出生就完全待在一个地方的还是少数, 如果你出去打工,那么让快递员按照身份证上的地址去寻找你,这着实是有点难为快递员了,所以住址一般都是动态的,每换一个地方就会分配一个。然后快递员根据你填的地址,找到你的房间,然后给你送上门的时候,还会问一下是不是你。 在网络的世界也是这样,一样的动态,为了实现跨区域的通信,会为计算机动态的分配一个地址,我们称之为IP地址,这个地址有别于Mac地址,所以你在北京的IP地址和在上海的IP地址可能就是不一样的。
所以A和B用微信通信的时候,会先向微信的服务器汇报一下自己的IP地址,在发送消息的时候,根据接收方的唯一标识去找接收方的IP,那B的手机上有好多通讯软件,该给哪个? 答案是端口,IP地址+端口,那可能有朋友会问了,我是租的房子,一个房间住了好多人,大家可能都用一个地址,我的身份证号,也是就是上面讲的MAC地址在什么时候用呢? 这个也就是ARP(Address Resolution Protocol)协议了, 此协议可以通过IP地址解析出来物理地址,这样知道了你的住址,也就是IP地址,一个地址下面有好多主机,也不担心找错人。
事实上你在百度上搜索也是一种通信,你发给百度关键词,百度返回给你搜索结果,搜索引擎和微信属于不同的应用,应用之间也需要制定通信规则。上面的讨论其实简化了通信过程中的问题,通信是一个复杂的问题,相互通信的两个计算机系统必须高度协调工作才行,我们简单列举一下可能会遇到的问题:
- 发起通信的计算机必须查明对方计算机是否已经开机。
- 如果在通信过程中,经过某个路由器,信息还没传递出去,这台路由器就坏了,应当有可靠的措施保证对方计算机能够正确接收到正确的文件。
等等。为了设计这样复杂的计算机网络,早在ARPNET(是美国高级研究计划署(Advanced Research Project Agency)的简称,是世界上第一个运营的封包交换网络,也是全球互联网的始祖)在设计的时候提出了分层的方法,“分层”可将庞大而复杂的问题,转化为若干较小的局部问题,而这些较小的局部问题就比较易于研究和处理。
计算机网络体系结构简介
我们上面提到的光纤中如何组织信息在计算机网络中被划入到物理层,规定了一些电气特性,作用是负责传送0和1的电信号。单纯的0和1没有任何意义,必须规定解读方式: 多少个电信号算一组? 每个信号位有何意义。这也就是数据链路层的问题,除此之外数据链路层还负责局域网内的通信,MAC地址也被算在数据链路层。为了实现动态路由,也就是说计算机换一个地方,分配一个实际的住址,我们引入了网络层来解决这个问题,网络层比较为人所熟知的就是IP协议。为了明确这个信息是属于谁的,我们引入了端口,IP地址加端口就可以定位是哪个进程,这也就是传输层的由来,进程在收到传输层的报文之后就可以来解析数据了,不同的应用指定了不同的规则,这也就是应用层。
这个五层是综合OSI/RM(Open System Interconnection Reference Model 开放系统互联基本参考模型模型(由国际标准化组织ISO来制定)和TCP/IP协议的分层模型而来,TCP/IP协议的分层是事实上的标准,标准化的组织制定的没流行原因在于复杂、理想化且TCP/IP协议已经抢先占领市场了.
这里我们简单的介绍一下各层的作用:
- 应用层
应用层的任务是通过应用集成间的交互来完成特定网络应用。应用层协议定义的应用进程间通信和交互的规则。这一层比较为人所熟知的协议是:HTTP、HTTPS、SMTP。
- 运输层
运输层的任务就是负责向两台主机中进程之间的通信提供通用的数据传输服务,应用层利用该服务传送应用层的报文。 所谓“通用的”是指并不针对某个特定网络应用,而是多个应用可以使用同一个运输层服务。由于一台计算机可以同时运行多个进程,因此运输层有复用和分用的功能。复用就是指多个应用层进程可以同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付给上面应用层的相应进程。
这一层比较为人所熟知的协议为TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)协议. 这一协议一般驻留在操作系统,主流的高级编程语言一般都有Socket相关的类,我们通过这些类就可以间接调用操作系统使用TCP、UDP协议。
- 网络层
网络层负责为不同局域网上的不同主机提供通行服务。这一层比较为人所熟知的协议是IP协议。
- 数据链路层
粗略的说就是将网络层交下来的数据包组装成帧,每一帧包含数据和必要的控制信息。在接收数据的时,控制信息使接收端能够知道一个帧从哪个比特开始和哪个结束。
- 物理层
粗略的说就是规定多大的电压代表“1” 或“0”。
本系列的文章会将着重笔墨与应用层、运输层、网络层。本篇也是重学系列的第二个系列: 重学计算机网络。统一收拢自己对计算机网络的认知。
参考资料
- 《计算机网络 (第7版) 》 谢希仁著。
- 图解ARP协议(一) https://zhuanlan.zhihu.com/p/...
- 为什么要使用IP地址和MAC地址两种地址? https://www.zhihu.com/questio...