内容简介:通信协议也叫网络传输协议或简称为传送协议(Communications Protocol),是指计算机通信或网络设备的共同语言。现在最普及的计算机通信为网络通信,所以“传送协议”一般都指计算机通信的传送协议,如:TCP/IP、NetBEUI、HTTP、FTP等。然而,传送协议也存在于计算机的其他形式通信,例如:面向对象编程里面对象之间的通信;操作系统内不同程序之间的消息,都需要有一个传送协议,以确保传信双方能够沟通无间。
Go的网络编程
通信协议
通信协议也叫网络传输协议或简称为传送协议(Communications Protocol),是指计算机通信或网络设备的共同语言。
现在最普及的计算机通信为网络通信,所以“传送协议”一般都指计算机通信的传送协议,如:TCP/IP、NetBEUI、HTTP、FTP等。
然而,传送协议也存在于计算机的其他形式通信,例如:面向对象编程里面对象之间的通信;操作系统内不同程序之间的消息,都需要有一个传送协议,以确保传信双方能够沟通无间。
协议 | 解释 |
---|---|
传输层 | 常见协议有TCP/UDP协议。 |
应用层 | 常见的协议有HTTP协议,FTP协议。 |
网络层 | 常见协议有IP协议、ICMP协议、IGMP协议。 |
网络接口层 | 常见协议有ARP协议、RARP协议。 |
TCP传输控制协议 | (Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 |
UDP用户数据报协议 | (User Datagram Protocol)是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。 |
HTTP | 超文本传输协议(Hyper Text Transfer Protocol)是互联网上应用最为广泛的一种网络协议。 |
FTP | 文件传输协议(File Transfer Protocol) |
IP协议 | 是因特网互联协议(InternetProtocol) |
ICMP协议 | 是Internet控制报文协议(Internet Control Message Protocol)它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。 |
IGMP协议 | 是Internet组管理协议(Internet Group Management Protocol),是因特网协议家族中的一个组播协议。该协议运行在主机和组播路由器之间。 |
ARP协议 | 是正向地址解析协议(Address Resolution Protocol),通过已知的IP,寻找对应主机的MAC地址。 |
RARP | 是反向地址转换协议,通过MAC地址确定IP地址。 |
Socket编程
对于底层网络应用开发者而言,几乎所有网络编程都是Socket,因为大部分底层网络的编程都离不开Socket编程。HTTP编程、Web开发、IM通信、视频流传输的底层都是Socket 编程。
- Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
-
可以把Socket理解成类似插座的东西, 通过Socket就可以发送和接受数据了, 就像插座插上电器之后就可以向外提供电能了.
-
TCP编程的客户端和服务器端都是通过Socket来完成的.其实UDP协议通信也是使用的套接字, 和TCP协议稍有差别. TCP是面向连接的套接字, 而UDP是面向无连接的套接字.
简单的套接字原理图
在TCP/IP协议中, IP地址+TCP或UDP端口号
唯一标识网络通讯中的一个进程。“IP地址+端口号”就对应一个socket。欲建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。因此可以用Socket来描述网络连接的一对一关系。
常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。
常见的网络设计模式
C/S模式
- 传统的网络应用设计模式,客户机(client)/服务器(server)模式。需要在通讯两端各自部署客户机和服务器来完成数据通信。
B/S模式
- 浏览器(Browser)/服务器(Server)模式。只需在一端部署服务器,而另外一端使用每台PC都默认配置的浏览器即可完成数据的传输。
优缺点
- 对于C/S模式来说,其优点明显。客户端位于目标主机上可以保证性能,将数据缓存至客户端本地,从而提高数据传输效率。且,一般来说客户端和服务器程序由一个开发团队创作,所以他们之间所采用的协议相对灵活。可以在标准协议的基础上根据需求裁剪及定制。
-
B/S模式相比C/S模式而言,由于它没有独立的客户端,使用标准浏览器作为客户端,其工作开发量较小。只需开发服务器端即可。另外由于其采用浏览器显示数据,因此移植性非常好,不受平台限制。如早期的在线网页游戏,在各个平台上都可以完美运行。
-
B/S模式的缺点也较明显。由于使用第三方浏览器,因此网络应用支持受限。另外,没有客户端放到对方主机上,缓存数据不尽如人意,从而传输数据量受到限制。应用的观感大打折扣。第三,必须与浏览器一样,采用标准http协议进行通信,协议选择不灵活。
TCP的架构
Server端函数
Listen函数: func Listen(network, address string) (Listener, error) network:选用的协议:TCP、UDP, 如:“tcp”或 “udp” address:IP地址+端口号, 如:“127.0.0.1:8000”或 “:8000” Listener 接口: type Listener interface { Accept() (Conn, error) Close() error Addr() Addr } Conn 接口: type Conn interface { Read(b []byte) (n int, err error) Write(b []byte) (n int, err error) Close() error LocalAddr() Addr RemoteAddr() Addr SetDeadline(t time.Time) error SetReadDeadline(t time.Time) error SetWriteDeadline(t time.Time) error }
Client端
Dial函数: func Dial(network, address string) (Conn, error) network:选用的协议:TCP、UDP,如:“tcp”或 “udp” address:服务器IP地址+端口号, 如:“121.36.108.11:8000”或 “www.itcast.cn:8000” Conn 接口: type Conn interface { Read(b []byte) (n int, err error) Write(b []byte) (n int, err error) Close() error LocalAddr() Addr RemoteAddr() Addr SetDeadline(t time.Time) error SetReadDeadline(t time.Time) error SetWriteDeadline(t time.Time) error }
简单的C/S架构通讯
- 服务端
func main() { //创建监听 listener,err := net.Listen("tcp",":8000") if err != nil { fmt.Println("listen err:",err) return } defer listener.Close() //主main结束自动关闭监听 fmt.Println("服务端等待建立连接。。。") //监听,等待客户端的请求连接 conn,err := listener.Accept() if err != nil { fmt.Println("accept err",err) } buf := make([]byte,1024) //建立读取的缓冲区 n,err := conn.Read(buf) if err != nil { fmt.Println("Read err",err) return } fmt.Println("服务端读取到:",string(buf[:n])) }
- 客户端
func main() { //主动发起连接请求 conn, err := net.Dial("tcp", "docker.poph163.com:8000") if err != nil { fmt.Println("Dial err",err) return } defer conn.Close() //发送数据 _,err = conn.Write([]byte("Are You Ok?")) if err != nil { fmt.Println("Write err:",err) return } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。