ISO OSI Protocol
每层的功能:
网络层
提供交换及路由技术传输层
提供了终端系统之间的数据透明传输,并且负责端到端的错误恢复及流程控制会话层
用来建立、管理、以及终止应用程序之间的连接表现层
提供数据表现差异的独立性(例如加密)应用层
支持应用程序和用户程序TCP/IP Protocol
网关是一个统称,它用于连接起一个或多个网络。
中继器
在物理层面上进行操作,它将信息从一个子网复制到另一个子网上。桥接
在数据连接层面上进行操作,它在网络之间复制帧。路由器
在网络层面上进行操作,它不仅在网络之间复制信息,还决定了信息的传输路线。TFTP(普通文件传输协议)将文件从一台计算机移动到另一台上。它使用IP协议上的UDP协议,该协议可通过以太网发送。看起来就像这样:
Communications Models(消息传递)
考虑分布式系统的组件是否等价,三种模型:
单一客户端,单个服务器:
多个客户端,单一服务器:
主站只需接收请求并处理一次,而无需将它们传递给其它服务器来处理。当客户端可能并发时,这就是个通用的模型
单一客户端,多个服务器,例如当业务逻辑服务器从数据库服务器获取信息时
分解一些应用的一个简单有效的方式就是把它们看做三部分:
Presentation component 表现组件 Application logic 应用逻辑 Data access 数据访问
表现组件负责与用户进行交互,即显示数据和采集输入,可以是 GUI 界面,也可以是命令行界面 应用逻辑组件负责解释用户的响应,根据应用业务规则,准备查询并管理来自其组件的响应 数据访问组件负责存储并检索数据。这一般是通过数据库进行,不过也不一定
Example: Distributed Database: Gartner第一种分类
例如 google map 会下载附近的地图为浏览器中的小型数据库,当用户移动了地图时,可以快速响应
Example: Network File Service 网络文件服务
Gartner第二种分类允许远程客户端访问已共享的文件系统 这类系统的例子:NFS、Microsoft共享和DCE等等。
Example: Web:
Gartner第三种分类的一个例子就是Web上的小型Java应用
Example: Terminal Emulation
Gartner第四种分类就是终端仿真。这允许远程系统在本地系统上作为普通的终端: Telnet就是最常见的例子。
Three Tier Models: 可以有三层、四层甚至多层。下图展示了一些可能的三层模型:
中间件示例
中间件的功能包括:
Gartner模型基于将一个应用分解为表现组件、应用逻辑和数据处理。一个更细粒度的分解方式为:
分布式应用一般运行在复杂的环境中。这使得它比单一计算机上的独立应用更易发生故障。故障点包括:
分布式系统的“圣杯”就是提供以下几点:
The TCP/IP stack is shorter than the OSI one:
type IPAddr {
IP IP
}
IPAddr 最主要的用法是 DNS 查询
func ResolveIPAddr(net, addr string) (*IPAddr, os.Error)
addr, err := net.ResolveIPAddr("ip","www.google.com")
if err != nil {
fmt.Println("Resolution error", err.Error())
os.Exit(1)
}
fmt.Println("Resolved address is ", addr.String())
// 输出
// Resolved address is 243.185.187.39
Host lookup
ResolveIPAddr
执行一个 DNS 查找,返回单个的 IP 地址
LookupHost
执行 DNS 查找,返回字符串切片,ipv4 和 ipv6 的 ip 地址
LookupCNAME
返回公认的主机名称
端口号:This is an unsigned integer between 1 and 65,535
“standard” ports:
unix 系统中常用的端口列在 /etc/services
LookupPort
方法查询整个端口
func LookupPort(network, service string) (port int, err os.Error)
The type TCPAddr:
TCPAddr
是一个包含 IP 和 Port 的结构
type TCPAddr struct {
IP IP
Port int
}
ResolveTCPAddr
创建一个 TCPAddr
func ResolveTCPAddr(net, addr string) (*TCPAddr, os.Error)
net
可选: tcp
, tcp4
or tcp6
addr
: 主机名或 IP 地址,中间是 :
,后面跟端口号,本机的话,可以简写 :80
net.TCPConn
支持在客户端和服务端,全双工可读可写的通信
func (c *TCPConn) Write(b []byte) (n int, err os.Error)
func (c *TCPConn) Read(b []byte) (n int, err os.Error)
TCP client:
func DialTCP(net string, laddr, raddr *TCPAddr) (c *TCPConn, err os.Error)
DialTCP
函数可以建立 TCP 连接TCPConn
交换信息,请求或者响应,直到关闭连接laddr
是本机地址, raddr
是远程服务地址net
是可选的 tcp4
, tcp6
or tcp
func ListenTCP(net string, laddr *TCPAddr) (l *TCPListener, err os.Error)
func (l *TCPListener) Accept() (c Conn, err os.Error)
ListenTCP
函数,侦听本地的地址在指定端口,Accept
阻塞,然后等待客户端连接
func (c *TCPConn) SetTimeout(nsec int64) os.Error
客户端和服务器设置超时用 SetTimeout
,函数在 “net” 包
Staying alive:
func (c *TCPConn) SetKeepAlive(keepalive bool) os.Error
SetKeepAlive
可以设置客户端保持连接,函数在 “net” 包
UDP 的函数:
func ResolveUDPAddr(net, addr string) (*UDPAddr, os.Error)
func DialUDP(net string, laddr, raddr *UDPAddr) (c *UDPConn, err os.Error)
func ListenUDP(net string, laddr *UDPAddr) (c *UDPConn, err os.Error)
func (c *UDPConn) ReadFromUDP(b []byte) (n int, addr *UDPAddr, err os.Error
func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (n int, err os.Error)
select(2)
select(2)
可以检测同时等待的多个 I/O,告诉哪个可以读写/* c 函数*/
int select(int maxfd, fd_set *readfds, fd_set *writefds, fe_set *exceptfds, const struct timeval *timeout);
使用 Dial
可以替代指定类型的 TCP and UDP 的建立连接方法
func Dial(net, laddr, raddr string) (c Conn, err os.Error)
net
可选:”tcp”, “tcp4” (IPv4-only), “tcp6” (IPv6-only), “udp”, “udp4” (IPv4-only), “udp6” (IPv6-only), “ip”, “ip4” (IPv4-only) and “ip6” IPv6-only)Conn
接口raddr
是字符串IPGetHeadInfo 源代码例子 chapter03/IPGetHeadInfo.go
ThreadedIPEchoServer 源代码例子 chapter03/ThreadedIPEchoServer.go
未完。。。。
Andrew‘s Blog / 《Network Programming with Go》学习笔记
原文:https://www.cnblogs.com/lijianming180/p/12227194.html