第一章: Architecture(体系结构)

Protocol Layers(协议层)

ISO OSI Protocol

每层的功能:

  • 网络层提供交换及路由技术
  • 传输层提供了终端系统之间的数据透明传输,并且负责端到端的错误恢复及流程控制
  • 会话层用来建立、管理、以及终止应用程序之间的连接
  • 表现层提供数据表现差异的独立性(例如加密)
  • 应用层支持应用程序和用户程序

TCP/IP Protocol

Gateways(网关)

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

  • 其中的中继器在物理层面上进行操作,它将信息从一个子网复制到另一个子网上。
  • 桥接在数据连接层面上进行操作,它在网络之间复制帧。
  • 路由器在网络层面上进行操作,它不仅在网络之间复制信息,还决定了信息的传输路线。

Packet encapsulation(数据包封装)

  • 在OIS或TCP/IP协议栈层与层之间的通信,是通过将数据包从一个层发送到下一个层,最终穿过整个网络的。
  • 每一层都有必须保持其自身层的管理信息。
  • 从上层接收到的数据包在向下传递时,会添加头信息。
  • 在接收端,这些头信息会在向上传递时移除。

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

Connection Models(连接模型)

  • Connection oriented 面向连接模型
  • Connectionless 无连接模型
  • 面向连接模型即为会话建立单个连接,沿着连接进行双向通信,例如 TCP
  • 在无连接系统中,消息的发送彼此独立。这类似于普通的邮件。无连接模型的消息可能不按顺序抵达。例子就是IP协议
  • 面向连接的传输可通过无连接模型——基于IP的TCP协议建立。
  • 无连接传输可通过面向连接模型——基于IP的HTTP协议建立。

Communications Models(通信模型)

Communications Models(消息传递)

  • 并发语言大多使用消息传递的机制,比如 Unix的管道
  • Parlog 能在并发的进程之间,将任意的逻辑数据结构当做消息来发送
  • 消息传递是分布式系统最基本的机制

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

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

  • 点对点(peer-to-peer): 若两个组件等价,且均可发起并响应信息
  • 过滤器(filter):有一个组件将信息传至另一个组件,它在修改该信息后会传至第三个组件。
    例如:中间组件通过SQL从数据库中获取信息,并将其转换为HTML表单提供给第三个组件(它可能是个浏览器)。
  • 客户端-服务器(客户端-服务器): 最常见的就是不对等的情况:客户端向服务器发送请求,然后服务端响应

Client/Server System

Client/Server Application

Server Distribution(服务器分布)

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

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

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

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

Component Distribution

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

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:
可以有三层、四层甚至多层。下图展示了一些可能的三层模型:

Middleware model 中间件模型

中间件示例

  • 像终端模拟器、文件传输或电子邮件这样的基础服务
  • 像RPC这样的基础服务
  • 像DCE、网络O/S这样的一体化服务
  • 像CORBA、OLE/ActiveX这样的分布式对象服务
  • 像RMI、Jini这样的移动对象服务
  • 万维网

中间件的功能包括:

  • 在不同计算机上初始化过程
  • 进行会话管理
  • 允许客户端定位服务器的目录服务
  • 进行远程数据访问
  • 允许服务器处理多个客户端的并发控制
  • 保证安全性和完整性
  • 监控
  • 终止本地处理和远程处理

Continuum of Processing

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

Points of Failure

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

  • The client side of the application could crash
  • The client system may have h/w problems
  • The client’s network card could fail
  • Network contention could cause timeouts
  • There may be network address conflicts
  • Network elements such as routers could fail
  • Transmission errors may lose messages
  • The client and server versions may be incompatable
  • The server’s network card could fail
  • The server system may have h/w problems
  • The server s/w may crash
  • The server’s database may become corrupted

Acceptance Factors

  • Reliability
  • Performance
  • Responsiveness
  • Scalability
  • Capacity
  • Security

Transparency

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

  • access transparency
  • location transparency
  • migration transparency
  • replication transparency
  • concurrency transparency
  • scalability transparency
  • performance transparency
  • failure transparency

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

  • The network is reliable.
  • Latency is zero.
  • Bandwidth is infinite.
  • The network is secure.
  • Topology doesn’t change.
  • There is one administrator.
  • Transport cost is zero.
  • The network is homogeneous.

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

The TCP/IP stack

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

  • TCP is a connection-oriented protocol,
  • UDP (User Datagram Protocol) is a connectionless protocol.

IP datagrams

  • IP 是无连接协议
  • IP datagrams 之间的关联必须由高层协议来提供支持
  • IP层包头支持数据校验,在包头包括源地址和目的地址
  • IP层包头支持数据校验,在包头包括源地址和目的地址

UDP&TCP

  • UDP是无连接的,不可靠的。它包括IP数据报的内容和端口号的校验
  • TCP是构建于IP之上的面向链接的协议。它提供了一个虚电路使得两个应用进程可以通过它来通信。它通过端口号来识别主机上的服务

Internet addresses

  • IPV4 由四位数字组成,各自的范围在 0~255,每一组数字可以用 8 位二进制数字来表示,合计共需 32 位二进制
  • IPv6使用128位地址,即使表达同样的地址,字节数变得很麻烦,由’:’分隔的4位16进制组成。一个典型的例子如:2002:c0e8:82e7:0:0:0:c0e8:82e7。

IP address type

  1. type IPAddr {
  2. IP IP
  3. }

IPAddr 最主要的用法是 DNS 查询

  1. func ResolveIPAddr(net, addr string) (*IPAddr, os.Error)
  1. addr, err := net.ResolveIPAddr("ip","www.google.com")
  2. if err != nil {
  3. fmt.Println("Resolution error", err.Error())
  4. os.Exit(1)
  5. }
  6. fmt.Println("Resolved address is ", addr.String())
  7. // 输出
  8. // 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:

  • Telnet usually uses port 23 with the TCP protocol.
  • DNS uses 大专栏  Andrew's Blog / 《Network Programming with Go》学习笔记port 53, either with TCP or with UDP.
  • FTP uses ports 21 and 20
  • HTTP usually uses port 80, but it often uses ports 8000, 8080 and 8088, all with TCP
  • The X Window System often takes ports 6000-6007, both on TCP and UDP.

unix 系统中常用的端口列在 /etc/services

LookupPort 方法查询整个端口

  1. func LookupPort(network, service string) (port int, err os.Error)

The type TCPAddr:

TCPAddr 是一个包含 IP 和 Port 的结构

  1. type TCPAddr struct {
  2. IP IP
  3. Port int
  4. }

ResolveTCPAddr 创建一个 TCPAddr

  1. func ResolveTCPAddr(net, addr string) (*TCPAddr, os.Error)

net 可选: tcp, tcp4 or tcp6
addr: 主机名或 IP 地址,中间是 :,后面跟端口号,本机的话,可以简写 :80

3.5 TCP Sockets

net.TCPConn 支持在客户端和服务端,全双工可读可写的通信

  1. func (c *TCPConn) Write(b []byte) (n int, err os.Error)
  2. func (c *TCPConn) Read(b []byte) (n int, err os.Error)

TCP client

  1. func DialTCP(net string, laddr, raddr *TCPAddr) (c *TCPConn, err os.Error)
  • DialTCP 函数可以建立 TCP 连接
  • 客户端和服务器使用 TCPConn 交换信息,请求或者响应,直到关闭连接
  • laddr 是本机地址, raddr 是远程服务地址
  • net 是可选的 tcp4, tcp6 or tcp
  1. func ListenTCP(net string, laddr *TCPAddr) (l *TCPListener, err os.Error)
  2. func (l *TCPListener) Accept() (c Conn, err os.Error)

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

3.6 Controlling TCP connections

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

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

Staying alive:

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

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

3.7 UDP Datagrams

UDP 的函数:

  1. func ResolveUDPAddr(net, addr string) (*UDPAddr, os.Error)
  2. func DialUDP(net string, laddr, raddr *UDPAddr) (c *UDPConn, err os.Error)
  3. func ListenUDP(net string, laddr *UDPAddr) (c *UDPConn, err os.Error)
  4. func (c *UDPConn) ReadFromUDP(b []byte) (n int, addr *UDPAddr, err os.Error
  5. func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (n int, err os.Error)

3.8 Server listening on multiple sockets

  • go 的底层利用的是系统调用 select(2)
  • select(2) 可以检测同时等待的多个 I/O,告诉哪个可以读写
  1. /* c 函数*/
  2. int select(int maxfd, fd_set *readfds, fd_set *writefds, fe_set *exceptfds, const struct timeval *timeout);
  • select 的第一个参数是文件描述符集中要被检测的比特数,这个值必须至少比待检测的最大文件描述符大1
  • 参数 readfds 指定了被读监控的文件描述符集
  • 参数 writefds 指定了被写监控的文件描述符集
  • 参数exceptfds指定了被例外条件监控的文件描述符集。
  • 参数timeout起了定时器的作用:到了指定的时间,无论是否有设备准备好,都返回调用

3.9 The types Conn, PacketConn and Listener

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

  1. 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》学习笔记的更多相关文章

  1. Learning ROS for Robotics Programming Second Edition学习笔记(十) indigo Gazebo rviz slam navigation

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 moveit是书的最后一章,由于对机械臂完全不知,看不懂 ...

  2. Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  3. Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  4. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  5. Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  6. Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  7. Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  8. Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(二) indigo tools

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  10. Learning ROS for Robotics Programming Second Edition学习笔记(一) indigo v-rep

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

随机推荐

  1. 第一行代码近期bug及解决

    Android学习笔记(5)----启动 Theme.Dialog 主题的Activity时程序崩溃的解决办法https://www.cnblogs.com/dongling/p/6476308.ht ...

  2. POJ 3273 Monthly Expense二分查找[最小化最大值问题]

    POJ 3273 Monthly Expense二分查找(最大值最小化问题) 题目:Monthly Expense Description Farmer John is an astounding a ...

  3. linux 中的.so和.a文件

    Linux下的.so是基于Linux下的动态链接,其功能和作用类似与windows下.dll文件. 下面是关于.so的介绍: 一.引言 通常情况下,对函数库的链接是放在编译时期(compile tim ...

  4. SQL注入常用函数(注入小白的学习笔记)

    在盲注的情况下,往往需要一个一个字符的去猜解,即过程中需要截取字符串 在这里整理了一下一些常用函数 由于现阶段学习不够深入,整理分类不清楚具体,不过博主会慢慢进行完善 user() 查询当前数据库用户 ...

  5. 安装R的h5包

    系统 redhat7 安装H5的包, 依赖系统hdf5包,如下安装完, 发现版本不一致, sudo yum install hdf5-devel 解决办法: 移花接木 sudo ln -s /opt/ ...

  6. 03-Java的基础语法

    一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对象,它的 ...

  7. 895A. Pizza Separation#分披萨问题(前缀和)

    题目出处:http://codeforces.com/problemset/problem/895/A 题目大意:对于给出的一些角度的披萨分成两份,取最小角度差 #include<stdio.h ...

  8. TZOJ-STL系列题

    C++实验:STL之vector #include <bits/stdc++.h> using namespace std; void Input(vector<int>&am ...

  9. Xen入门系列四【Xen 管理实操】

    1. 克隆一台虚拟机 # virt-clone -o base -n vm-clone -f /vm/vm-clone.img 参数说明: -o 原虚拟机的名称:必须为关闭或者暂停状态. -n 新虚拟 ...

  10. 69)PHP,cookie的有效域

    (1)默认情况下,cookie只在当前域下有效,比如我的loclhost/PHP或者shop.wang.com下有效. (2)其实一个域就代表一个网站, 以及域名就比如:www.baidu.com   ...