python网络编程01 C/S架构和套接字

1、客户端/服务器架构

1、客户端/服务器

  • 服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。它存在唯一目的就是等待客户端的请求,并响应它们(提供服务),然后等待更多请求。
  • 客户端因特定的请求而联系服务器,并发送必要的数据,然后等待服务器的回应,最后完成请求或给出故障的原因。
  • 服务器无限地运行下去,并不断地处理请求;而客户端会对服务进行一次性请求,然后接收该服务,最后结束它们之间的事务。客户端在一段时间后可能会再次发出其他请求,但这些都被当作不同的事务

2、硬件客户端/服务器架构

  • 打印(打印机)服务器是硬件服务器。
  • 文件服务器是硬件服务器。

3、软件客户端/服务器架构

  • 软件服务器也运行在一块硬件之上,但是没有像硬件服务器那样的专用外围设备(如打印机、磁盘驱动器等)。
  • 软件服务器提供的主要服务包括程序执行、数据传输检索、聚合、更新,或其他类型的编程或数据操作。
  • Web服务器是软件服务器。
  • 数据库服务器是软件服务器。
  • 窗体(window)服务器是软件服务器,几乎可以认为窗体服务器是硬件服务器。它们运行在一台附带(外接)显示设备(如显示器)的计算机上。窗体客户端其实就是一些程序,这些程序需要一个窗口化的环境来运行。这些通常被当作图形用户界面(GUI)应用程序。

2、套接字:通信端点

1、套接字

  • 套接字称为伯克利套接字或BSD套接字。
  • 在任何类型的通信开始之前,网络应用程序必须创建套接字
  • 套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信。这就是所谓的进程间通信(Inter Process Communication,IPC)。
  • 有两种类型的套接字:基于文件的和面向网络的。
  • Python只支持AF_UNIX、AF_NETLINK、AF_TIPC和AF_INET家族

1、UNIX套接字(进程)

  • UNIX套接字的“家族名字”是AF_UNIX(又名AF_LOCAL,在POSIX1.g标准中指定),它代表地址家族(address family):UNIX。
  • 包括Python在内的大多数受欢迎的平台都使用术语地址家族及其缩写AF;其他比较旧的系统可能会将地址家族表示成域(domain)或协议家族(protocol family),并使用其缩写PF而非AF。
  • AF_LOCAL(在2000~2001年标准化)将代替AF_UNIX。然而,考虑到后向兼容性,很多系统都同时使用二者,只是对同一个常数使用不同的别名。
  • Python本身仍然在使用AF_UNIX。

2、AF_INET和AF_INET6地址家族(基于网络的套接字)

  • 第二种类型的套接字是基于网络的,家族名字是AF_INET,或者地址家族:因特网。另一个地址家族AF_INET6用于第6版因特网协议(IPv6)寻址。
  • AF_INET地址族使用一个双元素元组(host, port),AF_INET6地址族使用一个四元组 (host, port, flowinfo, scopeid)。
  • 在所有的地址家族之中,目前AF_INET是使用得最广泛的

3、AF_NETLINK家族(用户和内核)

  • Python2.5中引入了对特殊类型的Linux套接字的支持。套接字的AF_NETLINK家族允许使用标准的BSD套接字接口进行用户级别和内核级别代码之间的IPC。
  • AF_NETLINK套接字使用双元素元组(pid, groups)。

4、AF_TIPC家族(计算机集群)

  • 针对Linux的另一种特性(Python2.6中新增)就是支持透明的进程间通信(TIPC)协议。TIPC允许计算机集群之中的机器相互通信,而无须使用基于IP的寻址方式。Python对TIPC的支持以AF_TIPC家族的方式呈现。
  • AF_TIPC地址族一般使用的元组形式为(addr_type, v1, v2, v3 [, scope])。
    • addr_type取TIPC_ADDR_NAMESEQ、TIPC_ADDR_NAME或TIPC_ADDR_ID中的一个。
      • 如果addr_type为TIPC_ADDR_NAME,那么v1是服务器类型,v2是端口标识符,v3应为0。
      • 如果addr_type为TIPC_ADDR_NAMESEQ,那么v1是服务器类型,v2是端口号下限,而v3是端口号上限。
      • 如果addr_type为TIPC_ADDR_ID,那么v1是节点(node),v2是ref,v3应为0。
    • scope取TIPC_ZONE_SCOPE、TIPC_CLUSTER_SCOPE和TIPC_NODE_SCOPE中的一个。

5、AF_BLUETOOTH(蓝牙)

  • BTPROTO_L2CAP接受(bdaddr, psm),其中bdaddr为字符串格式的蓝牙地址,psm是一个整数。
  • BTPROTO_RFCOMM接受(bdaddr, channel),其中bdaddr为字符串格式的蓝牙地址,channel是一个整数。
  • BTPROTO_HCI接受(device_id,),其中device_id为整数或字符串,它表示接口对应的蓝牙地址(具体取决于你的系统,NetBSD和DragonFlyBSD需要蓝牙地址字符串,其他系统需要整数)。
  • BTPROTO_SCO接受bdaddr,其中bdaddr是bytes对象,其中含有字符串格式的蓝牙地址(如b'12:23:34:45:56:67'),FreeBSD不支持此协议。

6、AF_PACKET接口(网卡)

  • AF_PACKET 是一个底层接口,直接连接至网卡。数据包使用元组 (ifname, proto[, pkttype[, hatype[, addr]]]) 表示,其中:
    • ifname:指定设备名称的字符串。
    • proto:一个用网络字节序表示的整数,指定以太网协议版本号。
    • pkttype:指定数据包类型的整数(可选):
      • PACKET_HOST (默认):寻址到本地主机的数据包。
      • PACKET_BROADCAST:物理层广播的数据包。
      • PACKET_MULTIHOST:发送到物理层多播地址的数据包。
      • PACKET_OTHERHOST:被(处于混杂模式的)网卡驱动捕获的、发送到其他主机的数据包。
      • PACKET_OUTGOING:来自本地主机的、回环到一个套接字的数据包。
    • hatype:可选整数,指定 ARP 硬件地址类型。
    • addr:可选的类字节串对象,用于指定硬件物理地址,其解释取决于各设备。

2、套接字地址:主机-端口对

  • 套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
  • 一个网络地址由主机名和端口号对组成,而这是网络通信所需要的。
  • 有效的端口号范围为0~65535(小于1024的端口号是预留给系统的)。
  • 众所周知的端口号列表可以在这个网站中查看:http://www.iana.org/assignments/port-numbers。

3、面向连接的套接字与无连接的套接字

  • 不管你采用的是哪种地址家族,都有两种不同风格的套接字连接:面向连接的套接字与无连接的套接字。
  • 由于面向连接的套接字所提供的保证,因此它们的设置以及对虚拟电路连接的维护需要大量的开销。然而,数据报不需要这些开销,即它的成本更加“低廉”。

1、面向连接的套接字

  • 面向连接的通信提供序列化的可靠的不重复的数据交付,而没有记录边界
  • 在进行通信之前必须先建立一个连接。每条消息可以拆分成多个片段,并且每一条消息片段都确保能够到达目的地,然后将它们按顺序组合在一起,最后将完整消息传递给正在等待的应用程序。
  • 实现面向连接类型的主要协议是传输控制协议(TCP)。为了创建TCP套接字,必须使用SOCK_STREAM作为套接字类型。
  • TCP套接字的名字SOCK_STREAM基于流套接字的其中一种表示。因为这些套接字(AF_INET)的网络版本使用因特网协议(IP)来搜寻网络中的主机,所以整个系统通常结合这两种协议(TCP和IP)来进行。(当然,也可以使用TCP和本地[非网络的AF_LOCAL/AF_UNIX]套接字,但是很明显此时并没有使用IP)。

2、无连接的套接字

  • 数据报类型的套接字,它是一种无连接的套接字。
  • 在通信开始之前并不需要建立连接。此时,在数据传输过程中并无法保证它的顺序性、可靠性或重复性。然而,数据报确实保存了记录边界,这就意味着消息是以整体发送的,而并非首先分成多个片段
  • 实现这种连接类型的主要协议是用户数据报协议(UDP)。为了创建UDP套接字,必须使SOCK_DGRAM作为套接字类型。
  • 因为这些套接字也使用因特网协议来寻找网络中的主机,所以这个系统也有一个更加普通的名字,即这两种协议(UDP和IP)的组合名字,或UDP/IP
#                                                                                                                    #
posted @ 2021-04-08 17:47  麦恒  阅读(258)  评论(0编辑  收藏  举报