当前位置:  首页 →区块链百科 →正文

区块链技术基础语言:Go语言网络编程

2018-12-01 16:56:59 区块链百科

Go语言网络概述

1.1 网络协议

网络协议就是为网络数据交换而制定的规则、约定与标准。

 

1.2 分层模型

为了降低网络设计的复杂性,绝大多数网络都组织成一堆相互叠加的层。每一层都建立在下一层的基础之上,且每一层的目的都是向上一层提供特定的服务,但是把如何实现这些服务的细节对上一层加以屏蔽。用户接触到的是网络体系的应用层,属于最上层;网络体系层级越低,越接近硬件。

常见的网络体系结构分层模型有两种:OSI模型和TCP/IP模型。OSI模型将网络层分为七层:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。TCP/IP模型将网络层分为四层:主机至网络层、互联网层、传输层和应用层。OSI模型对于讨论计算机网络非常有用,但是没有流行;TCP/IP模型没有被纳入国际标准,但是协议被广泛地使用。为了更清晰地解释网络体系结构,本文采用如图所示的五层模型。

区块链技术基础语言(三十一):Go语言网络编程(上)

1.3 每层协议的功能

网络体系结构的每一层都是为了实现一种功能。为了实现这些功能,需要大家遵守共同的规则,因此每一层都定义了很多协议。这些协议的总称叫做“互联网协议(Internet Protocol Suite)”。

1.3.1 物理层

物理层就是把电脑连接起来的物理手段。它定义了物理设备的标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。

它的主要作用是传输比特流(就是将1、0转化为电流强弱来进行传输,到达目的地后再将电流强弱转化为1、0,也就是数模转换与模数转换),这一层的数据叫做比特。

区块链技术基础语言(三十一):Go语言网络编程(上)

1.3.2数据链路层

☛ 1.3.2.1 设计数据链路层的原因

在原始的物理线路上传输数据信号是有差错的,数据链路层采取差错检测、差错控制与流量控制等方法,将有差错的物理线路改进成逻辑上无差错的数据链路,向网络层提供高质量的服务。

☛ 1.3.2.2 数据链路层的基本功能

数据链路层位于物理层上方,它定义了如何让格式化数据以帧(Frame)为单位进行传输,以及如何控制对物理介质的访问。数据链路层还提供了错误检测和纠正措施,以确保数据的可靠传输。

在数据链路层,通过以帧为单位进行数据传输、以获取网卡MAC地址作为对物理介质的访问控制、以广播作为数据的发送方式,多台计算机之间可以相互传送数据。

☛ 1.3.2.3 以太网协议

以太网是目前最流行的一种局域网组网技术,它规定了在以太网中传输的数据帧结构。

以太网协议将一组电信号构成的一个数据包叫做“帧”,帧分为两个部分:标头(Head)和数据(Data)。

区块链技术基础语言(三十一):Go语言网络编程(上)

标头(Head):数据包的说明项,比如发送者、接受者、数据类型等,固定为18字节;

数据(Data):数据包的具体内容,最短为46字节,最长为1500字节。

因此,整个帧最短为64字节,最长为1518字节。如果数据很长,就必须分割成多个帧进行发送。

☛ 1.3.2.4 MAC地址

介质访问控制(Medium Access Control)简称MAC,它是解决当局域网中共用信道的使用产生竞争时,如何分配信道的使用权问题。

MAC(Medium Access Control)地址,也称为物理地址、硬件地址,用来定义网络设备的位置。一个主机有一个MAC地址,MAC地址是网卡决定的,是固定的。

以太网规定,连入网络的所有设备,都必须具有“网卡”接口。数据包必须是从一块网卡,传送到另一块网卡。网卡的地址,就是数据包的发送地址和接收地址,也就是MAC地址。

每块网卡出厂的时候,都有一个全世界独一无二的MAC地址,长度是48个二进制位,通常用12个十六进制数表示。

区块链技术基础语言(三十一):Go语言网络编程(上)

前6个十六进制数是厂商编号,后6个是该厂商的网卡流水号。有了MAC地址,就可以定位网卡和数据包的路径了。

☛ 1.3.2.5 广播

以太网规定数据包必须从一块网卡传送到另一块网卡,但是一块网卡无法直接获取另一块网卡的MAC地址。在网络层中会介绍一种ARP协议(Address Resolution Protocol,地址解析协议),如果两台主机位于同一个子网络(由活性节点组成的局部网络),通过对方的IP(Internet Protocol,网络之间互连的协议)可以获得对方的MAC地址。

虽然获得了对方的MAC地址,系统并不是把数据包准确地发送给接收方。其中一种实现数据包发送到接收方的方式就是广播,就是以广播的方式向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方。

区块链技术基础语言(三十一):Go语言网络编程(上)

上图中,1号计算机向2号计算机发送一个数据包,同一个子网络的3号、4号、5号计算机都会收到这个包。它们读取这个包的“标头”,找到接收方的MAC地址,然后与自身的MAC地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。这种发送方式就叫作“广播(broadcasting)”。

有了数据包的定义、网卡的MAC地址、广播的发送方式,数据链路层就可以在多台计算机之间传送数据了。

1.3.3 网络层

网络层的目的是两个端系统之间的数据实现透明传送。具体功能包括寻址、路由选择、建立连接、保持连接和终止连接等。这使得位于不同地理位置网络中的两个主机系统之间提供连接和路径选择,世界各站点访问信息的用户数大大增加。

☛ 1.3.3.1 网络层的由来

当两台主机位于同一个子网络,可以通过广播的方式把数据包发送给本网络内所有的计算机,让每台计算机自己判断是否为接收方。但是当两个主机不在一个子网络,例如一个在北京,一个在纽约,这样发送信息的方式就不合理了。

网络层引进了一套地址,用来判断不同的计算机是否属于同一个子网络,这套地址叫作网络地址,也就是网址。属于同一个子网络的采用广播方式发送数据包,否则就采用路由方式发送数据包。

因此每台计算机有了两种地址:MAC地址和网络地址。这两种地址之间没有任何联系,MAC地址是绑定在网卡上的,网络地址则是管理员分配的,它们只是随机组合在一起。网络地址帮助我们确定计算机所在的子网络,MAC地址则是将数据包送到该子网络中的目标网卡。因此,必定是先处理网络地址,然后再处理MAC地址。

区块链技术基础语言(三十一):Go语言网络编程(上)

☛ 1.3.3.2 IP协议

IP协议就是规定网络地址的协议。它所定义的地址,就叫作IP地址。

目前的IP版本有IPv4和IPv6两种,最流行的版本是Ipv4。Ipv4有十进制和二进制两种表示方法,用点分为四组,每一组的范围是0~255。如图所示,IP地址的两种表示方法为:

十进制表示为:172.16.254.1;

二进制表示为:10101100.00010000.11111110.00000001。

区块链技术基础语言(三十一):Go语言网络编程(上)

互联网上的每一台计算机都会拥有一个IP地址。IP地址分为两个部分,前一部分代表网络,后一部分代表主机。但是从一个IP地址无法判断哪一段代表网络,哪一段代表主机。当两台联网的计算机的IP地址的网络部分完全相同,说明两台计算机位于同一个子网络。但是要从两台计算机的IP地址判断两台计算机是否属于同一个子网络,需要用到一个表示子网络特征的参数——“子网掩码(subnet mask)”。子网掩码在形式上等同于IP地址,例如IPv4版本的子网掩码也是一个32位二进制数字,一般子网掩码地址都是255.255.255.0。

根据子网掩码可以判断任意两个IP地址是否处于同一个子网络。先将两个IP地址分别和子网掩码(255.255.255.0)换算为二进制形式;然后将两个IP地址分别与子网掩码进行按位与运算;最后比较结果是否相同,相同表明两个IP地址在同一个子网络,否则不在一个子网络。

例如IP地址分别为172.16.254.1和172.16.254.233,它们分别与子网掩码255.255.255.0按位与的运算结果都是172.16.254.0,这说明这两个IP地址在同一个子网络。

总得来说,IP协议一个作用是为每一台计算机分配IP地址,另一个作用是确定哪些IP地址位于同一个子网络。

☛ 1.3.3.3 IP数据包

根据IP协议发送的数据叫作IP数据包,其中数据包包括IP地址信息。

在数据链路层中,以太网协议将一组电信号构成的一个数据包叫做“帧”,帧包含MAC地址,但没有IP地址。在网络层,不需要修改以太网的规格,直接将IP数据包放进以太网数据包的Data部分。

IP数据包分为“标头”和“数据”两个部分。标头Head包括版本、长度、IP地址等信息,数据Data则是IP数据包的具体内容。

区块链技术基础语言(三十一):Go语言网络编程(上)

☛ 1.3.3.4 ARP协议

因为IP数据包是放在以太网数据包里发送的,所以在发送数据包时必须同时知道接收方的MAC地址和IP地址。一般接收方的IP地址已知,但是MAC地址无法直接获取。

在数据链路层中提到过,一块网卡无法直接获取另一块网卡的MAC地址,如果两台主机位于同一个子网络,需要根据ARP协议(Address Resolution Protocol,地址解析协议),通过对方的IP获得对方的MAC地址。ARP协议就是向子网络的每一台主机发送数据包,从中取出IP地址,并与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包。

如果两台主机不在同一个子网络,要在网络层上实现网络互连,就需要网络互联设备——网关(Gateway)。它又称网间连接器、协议转换器,其本质上是一个网络通向其他网络的IP地址。假如两台主机分别在不同的子网络A和B,网络A中的某一主机将数据包传送到网络B中的某一主机,需要经过以下步骤:首先网络A中的主机将数据包传送到网络A所在的网关;然后网络A所在的网关将数据包转发给网络B所在的网关,最后网络B所在的网关将数据包转发给网络B的那台主机。

总的来说,有了ARP协议和网关,一台主机可以把数据包发送到任意一台主机。

1.3.4 传输层

☛ 1.3.4.1 传输层的由来

有了MAC地址和IP地址就可以在互联网上的任意两台主机上建立通信。但是从互联网上发送过来的数据包到底供给哪个程序(进程)使用,需要用到传输层。

传输层(Transport Layer)是最重要,最关键的一层,唯一负责总体的数据传输和数据控制,实现了端到端的数据传输。传输层在终端用户之间提供透明的数据传输,向上层提供可靠的数据传输服务。传输层在给定的链路上通过流量控、分段/重组和差错控制,保持对分段的跟踪,并且重传那些失败的分段。

在传输层中,端口(port)表示一个数据包到底供哪个程序(进程)使用,它是每一个使用网卡的程序编号,每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。

网络层建立了主机到主机的通信,而传输层建立了端口到端口的通信。只要确定主机和端口,就能实现程序之间的交流。因此,Unix系统把主机+端口,叫作“套接字(socket)”。有了它,就可以进行网络应用程序开发。

☛ 1.3.4.2 UDP协议

UDP(User Datagram Protocol,用户数据报协议)是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表。

UDP协议数据包由“标头”和“数据”两部分组成。“标头”定义了发出端口和接收端口,“数据”就是具体的内容。

区块链技术基础语言(三十一):Go语言网络编程(上)

UDP数据包是IP数据包中“数据”的一部分,而IP数据包又是以太网数据包中的一部分,所以整个以太网数据包如下图所示:

区块链技术基础语言(三十一):Go语言网络编程(上)

UDP协议比较简单,容易实现,但是可靠性较差,一旦数据包发出,无法知道对方是否收到。因此对于传输可靠性要求不高、数据量小的数据,如QQ聊天的数据,就是通过这种方式传输的。

☛ 1.3.4.3 TCP协议

TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来:

第一次对话,客户端通过向服务器发送一个含有同步序列号的标志位(SYN)的数据段给服务器,向服务器请求建立连接,通过这个数据段,客户端告诉服务器两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我。

第二次对话,服务器收到客户端的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应客户端,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用哪个序列号作为起始数据段来回应我。

第三次对话,客户端再发出一个数据包确认服务器的要求同步。客户端收到这个数据段后,再发送一个确认应答(ACK),确认已收到服务器的数据段:“我已收到回复,我现在要开始传输实际数据了。”这样3次握手就完成了,客户端和服务器就可以传输数据了。

三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,客户端才向服务器正式发送数据。这个协议虽然传输效率低,但它可靠性强,主要用于传输可靠性要求高、数据量大的数据。

区块链技术基础语言(三十一):Go语言网络编程(上)

1.3.5 应用层

应用层是最靠近用户的网络层,它对“传输层”传上来的数据进行解读。由于数据来源五花八门,必须事先规定好格式,否则无法解读。例如,TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了“应用层”。

应用层是网络层最高的一层,直接面对用户。它的数据就放在TCP数据包的Data部分。因此,以太网的数据包如下图所示:

区块链技术基础语言(三十一):Go语言网络编程(上)

BB财经原创,作者区块链百科,转载请注明出处:http://www.bbcaijing.cn/baike/31758.html