golang网络编程

1、网络编程

1.1协议

协议可以理解为规则,是数据传输和解释的规则,是通信双方都要遵守的规则。

协议存在的意义是为了让双方更好的沟通。

在双方之间被遵守的协议成为原始协议

当此协议被更多的人采用后,不断的完善,最终形成一个稳定的、完整的文件传输协议,被广泛应用于各种文件传输过程中。该协议就成为了一个标准协议。最初的ftp协议就是这样来的。

1.2分层模型


越下面的层,越靠近硬件;越上面的层,越靠近用户。

典型协议

应用层:HTTP、FTP

传输层:TCP、UDP

网络层:IP、ICMP、IGMP

网络接口层:ARP、RARP

物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。

数据链路层:定义了如何让格式化数据以帧为单位进行传输,以及如何控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输

网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。

传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。

会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。

应用层:最靠近用户的OSI层,这一层为用户的应用程序提供网络服务。发送邮件(https)、文件传输(FTP)...。

socket编程

一个unix的概念“一切皆文件” --“打开open –> 读写 write/read –> 关闭close”模式

而socket就是这种模式的一个实现。

IP+PORT 对应一个socket,唯一标识网络通讯仲的一个进程。两个进程之间的socket对就唯一标识了一个连接。因此可以用socket来描述网络连接的一对一关系

传统的网络应用模型有两种

C/S模型 :需要在服务器端和客户端都安装部署,才能完成数据通信。优势非常明显,就是性能好,因为可以提前把数据缓存到客户端本地,提高用户体验,限制也少,可采用的协议相对灵活。像一些网络游戏,3D的,数据量庞大的都是采用C/S模型。缺点是要安装部署客户端,麻烦,并且是在用户主机上安装的,会对用户主机安全性构成威胁。

B/S模型:只需要在服务器端安装部署,客户端只需要一个浏览器即可。优势是移植性非常好,不收平台限制,只需一个浏览器就可以打开。缺点是无法想C/S那样提前缓存大量数据在本地,网络受限时,应用的体验感非常差,而且浏览器采用的协议是标准http协议通信,没有c/s这么灵活

Go的TCP架构(C/S)

net.Listen() 设置好了连接方式(tcp还是udp)、IP地址以及端口

Accept() 这时候发起监听,并阻塞等待客户端建立连接

net.Dail()客户端用来发送访问请求的

连接建立之后,就可以进行读写操作了。

大致流程

Accept和Dail 成功之后都会返回一个socket,也就是上文提到的一对socket

其实Listen()的时候也会创建一个socket,但是这个socket不是用于通信的,只是创建用于通信的socket,绑定IP地址和端口设置监听的


服务器端tcp socket

执行结果


20行没有打印,印证上文所说accept才开始监听并阻塞
客户端tcp socket


将客户端test2跑起来后,连接消除阻塞并开始读写


持续读写:


推荐阅读更多精彩内容