Go的网络编程详解

一 互联网协议介绍1.1互联网分层模型互联网的逻辑实现被分为好几层 。每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持 。用户接触到的只是最上面的那一层,根本不会感觉到下面的几层 。要理解互联网就需要自下而上理解每一层的实现的功能 。

Go的网络编程详解

文章插图
如上图所示,互联网按照不同的模型划分会有不用的分层,但是不论按照什么模型去划分,越往上的层越靠近用户 , 越往下的层越靠近硬件 。在软件开发中我们使用最多的是上图中将互联网划分为五个分层的模型 。
接下来我们一层一层的自底向上介绍一下每一层 。
物理层我们的电脑要与外界互联网通信,需要先把电脑连接网络,我们可以用双绞线、光纤、无线电波等方式 。这就叫做”实物理层”,它就是把电脑连接起来的物理手段 。它主要规定了网络的一些电气特性,作用是负责传送0和1的电信号 。
数据链路层单纯的0和1没有任何意义,所以我们使用者会为其赋予一些特定的含义,规定解读电信号的方式:例如:多少个电信号算一组?每个信号位有何意义?这就是”数据链接层”的功能 , 它在”物理层”的上方,确定了物理层传输的0和1的分组方式及代表的意义 。早期的时候,每家公司都有自己的电信号分组方式 。逐渐地 , 一种叫做”以太网”(Ethernet)的协议,占据了主导地位 。
以太网规定,一组电信号构成一个数据包,叫做”帧”(Frame) 。每一帧分成两个部分:标头(Head)和数据(Data) 。其中”标头”包含数据包的一些说明项,比如发送者、接受者、数据类型等等;”数据”则是数据包的具体内容 。”标头”的长度,固定为18字节 。”数据”的长度,最短为46字节,最长为1500字节 。因此,整个”帧”最短为64字节,最长为1518字节 。如果数据很长 , 就必须分割成多个帧进行发送 。
那么,发送者和接受者是如何标识呢?以太网规定,连入网络的所有设备都必须具有”网卡”接口 。数据包必须是从一块网卡,传送到另一块网卡 。网卡的地址,就是数据包的发送地址和接收地址 , 这叫做MAC地址 。每块网卡出厂的时候 , 都有一个全世界独一无二的MAC地址,长度是48个二进制位,通常用12个十六进制数表示 。前6个十六进制数是厂商编号,后6个是该厂商的网卡流水号 。有了MAC地址 , 就可以定位网卡和数据包的路径了 。
我们会通过ARP协议来获取接受方的MAC地址,有了MAC地址之后,如何把数据准确的发送给接收方呢?其实这里以太网采用了一种很”原始”的方式,它不是把数据包准确送到接收方,而是向本网络内所有计算机都发送,让每台计算机读取这个包的”标头” , 找到接收方的MAC地址 , 然后与自身的MAC地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包 。这种发送方式就叫做”广播”(broadcasting) 。
网络层按照以太网协议的规则我们可以依靠MAC地址来向外发送数据 。理论上依靠MAC地址,你电脑的网卡就可以找到身在世界另一个角落的某台电脑的网卡了,但是这种做法有一个重大缺陷就是以太网采用广播方式发送数据包,所有成员人手一”包”,不仅效率低,而且发送的数据只能局限在发送者所在的子网络 。也就是说如果两台计算机不在同一个子网络,广播是传不过去的 。这种设计是合理且必要的 , 因为如果互联网上每一台计算机都会收到互联网上收发的所有数据包 , 那是不现实的 。
因此,必须找到一种方法区分哪些MAC地址属于同一个子网络,哪些不是 。如果是同一个子网络,就采用广播方式发送,否则就采用”路由”方式发送 。这就导致了”网络层”的诞生 。它的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络 。这套地址就叫做”网络地址”,简称”网址” 。
“网络层”出现以后,每台计算机有了两种地址,一种是MAC地址 , 另一种是网络地址 。两种地址之间没有任何联系,MAC地址是绑定在网卡上的 , 网络地址则是网络管理员分配的 。网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据包送到该子网络中的目标网卡 。因此 , 从逻辑上可以推断,必定是先处理网络地址,然后再处理MAC地址 。
规定网络地址的协议 , 叫做IP协议 。它所定义的地址,就被称为IP地址 。目前,广泛采用的是IP协议第四版,简称IPv4 。IPv4这个版本规定,网络地址由32个二进制位组成,我们通常习惯用分成四段的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255 。

推荐阅读