《Network Programming with Go》学习笔记

第一章: Architecture(体系结构)

Protocol Layers(协议层)

ISO OSI Protocol Alt text

每层的功能:

TCP/IP Protocol

Alt text

Gateways(网关)

网关是一个统称,它用于连接起一个或多个网络。

Packet encapsulation(数据包封装)

TFTP(普通文件传输协议)将文件从一台计算机移动到另一台上。它使用IP协议上的UDP协议,该协议可通过以太网发送。看起来就像这样:

Alt text

Connection Models(连接模型)

Communications Models(通信模型)

Communications Models(消息传递)

Alt text

Distributed Computing Models(分布式计算模型)

Alt text

考虑分布式系统的组件是否等价,三种模型:

Client/Server System

Alt text

Client/Server Application

Alt text

Server Distribution(服务器分布)

单一客户端,单个服务器:

Alt text

多个客户端,单一服务器:

Alt text

主站只需接收请求并处理一次,而无需将它们传递给其它服务器来处理。当客户端可能并发时,这就是个通用的模型

单一客户端,多个服务器,例如当业务逻辑服务器从数据库服务器获取信息时

Alt text

Component Distribution

分解一些应用的一个简单有效的方式就是把它们看做三部分:

Presentation component 表现组件 Application logic 应用逻辑 Data access 数据访问

表现组件负责与用户进行交互,即显示数据和采集输入,可以是 GUI 界面,也可以是命令行界面 应用逻辑组件负责解释用户的响应,根据应用业务规则,准备查询并管理来自其组件的响应 数据访问组件负责存储并检索数据。这一般是通过数据库进行,不过也不一定

Alt text

Example: Distributed Database: Gartner第一种分类

Alt text

例如 google map 会下载附近的地图为浏览器中的小型数据库,当用户移动了地图时,可以快速响应

Example: Network File Service 网络文件服务

Alt text

Gartner第二种分类允许远程客户端访问已共享的文件系统 这类系统的例子:NFS、Microsoft共享和DCE等等。

Example: Web:

Alt text

Gartner第三种分类的一个例子就是Web上的小型Java应用

Example: Terminal Emulation

Alt text

Gartner第四种分类就是终端仿真。这允许远程系统在本地系统上作为普通的终端: Telnet就是最常见的例子。

Three Tier Models: 可以有三层、四层甚至多层。下图展示了一些可能的三层模型:

Alt text

Middleware model 中间件模型

Alt text

中间件示例

中间件的功能包括:

Continuum of Processing

Gartner模型基于将一个应用分解为表现组件、应用逻辑和数据处理。一个更细粒度的分解方式为:

Alt text

Points of Failure

分布式应用一般运行在复杂的环境中。这使得它比单一计算机上的独立应用更易发生故障。故障点包括:

Acceptance Factors

Transparency

分布式系统的“圣杯”就是提供以下几点:

Eight fallacies of distributed computing:分布式计算的八个误区

第3章: Socket-level Programming(套接字层编程)

The TCP/IP stack

The TCP/IP stack is shorter than the OSI one:

Alt text

IP datagrams

UDP&TCP

Internet addresses

IP address type

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返回公认的主机名称

3.4 Services

端口号: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

3.5 TCP Sockets

` 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)
func ListenTCP(net string, laddr *TCPAddr) (l *TCPListener, err os.Error)
func (l *TCPListener) Accept() (c Conn, err os.Error)

ListenTCP 函数,侦听本地的地址在指定端口,Accept 阻塞,然后等待客户端连接

3.6 Controlling TCP connections

func (c *TCPConn) SetTimeout(nsec int64) os.Error

客户端和服务器设置超时用 SetTimeout,函数在 “net” 包

Staying alive:

func (c *TCPConn) SetKeepAlive(keepalive bool) os.Error

SetKeepAlive 可以设置客户端保持连接,函数在 “net” 包

3.7 UDP Datagrams

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)

3.8 Server listening on multiple sockets

/* c 函数*/
int select(int maxfd, fd_set *readfds, fd_set *writefds, fe_set *exceptfds, const struct timeval *timeout);

3.9 The types Conn, PacketConn and Listener

使用 Dial 可以替代指定类型的 TCP and UDP 的建立连接方法

func Dial(net, laddr, raddr string) (c Conn, err os.Error)

IPGetHeadInfo 源代码例子 chapter03/IPGetHeadInfo.go ThreadedIPEchoServer 源代码例子 chapter03/ThreadedIPEchoServer.go

未完。。。。