Andrew's Blog / 《Network Programming with Go》学习笔记
第一章: 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
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:
- 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
方法查询整个端口
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)
DialTCP
函数可以建立 TCP 连接- 客户端和服务器使用
TCPConn
交换信息,请求或者响应,直到关闭连接 laddr
是本机地址,raddr
是远程服务地址net
是可选的tcp4
,tcp6
ortcp
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
- go 的底层利用的是系统调用
select(2)
select(2)
可以检测同时等待的多个 I/O,告诉哪个可以读写
/* c 函数*/
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 的建立连接方法
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》学习笔记的更多相关文章
- Learning ROS for Robotics Programming Second Edition学习笔记(十) indigo Gazebo rviz slam navigation
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 moveit是书的最后一章,由于对机械臂完全不知,看不懂 ...
- Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Learning ROS for Robotics Programming Second Edition学习笔记(二) indigo tools
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Learning ROS for Robotics Programming Second Edition学习笔记(一) indigo v-rep
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
随机推荐
- 第一行代码近期bug及解决
Android学习笔记(5)----启动 Theme.Dialog 主题的Activity时程序崩溃的解决办法https://www.cnblogs.com/dongling/p/6476308.ht ...
- POJ 3273 Monthly Expense二分查找[最小化最大值问题]
POJ 3273 Monthly Expense二分查找(最大值最小化问题) 题目:Monthly Expense Description Farmer John is an astounding a ...
- linux 中的.so和.a文件
Linux下的.so是基于Linux下的动态链接,其功能和作用类似与windows下.dll文件. 下面是关于.so的介绍: 一.引言 通常情况下,对函数库的链接是放在编译时期(compile tim ...
- SQL注入常用函数(注入小白的学习笔记)
在盲注的情况下,往往需要一个一个字符的去猜解,即过程中需要截取字符串 在这里整理了一下一些常用函数 由于现阶段学习不够深入,整理分类不清楚具体,不过博主会慢慢进行完善 user() 查询当前数据库用户 ...
- 安装R的h5包
系统 redhat7 安装H5的包, 依赖系统hdf5包,如下安装完, 发现版本不一致, sudo yum install hdf5-devel 解决办法: 移花接木 sudo ln -s /opt/ ...
- 03-Java的基础语法
一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对象,它的 ...
- 895A. Pizza Separation#分披萨问题(前缀和)
题目出处:http://codeforces.com/problemset/problem/895/A 题目大意:对于给出的一些角度的披萨分成两份,取最小角度差 #include<stdio.h ...
- TZOJ-STL系列题
C++实验:STL之vector #include <bits/stdc++.h> using namespace std; void Input(vector<int>&am ...
- Xen入门系列四【Xen 管理实操】
1. 克隆一台虚拟机 # virt-clone -o base -n vm-clone -f /vm/vm-clone.img 参数说明: -o 原虚拟机的名称:必须为关闭或者暂停状态. -n 新虚拟 ...
- 69)PHP,cookie的有效域
(1)默认情况下,cookie只在当前域下有效,比如我的loclhost/PHP或者shop.wang.com下有效. (2)其实一个域就代表一个网站, 以及域名就比如:www.baidu.com ...