套接字
套接字是计算机网络数据结构。在任何类型的通信开始前,网络应用程序必须创建套接字。
有两种类型的套接字:基于文件的和面向网络的。
UNIX套接字是我们所讲的套接字的第一个家族,并且拥有一个”家族名字“AF_UNIX,它代表地址家族(address family):UNIX。其他比较旧的系统可能会将地址家族表示成域(domain)或协议家族(protocol family),并使用其缩写PF而非AF。
第二种类型的套接字是基于网络的,它也有自己的家族名字AF_INET,或者地址家族:因特网。另一个地址家族AF_INET6用于IPv6寻址。在所有的地址家族中,目前AF_INET是使用最广泛的。
python2.5中引入了对特殊类型的Linux套接字的支持。套接字的AF_NETLINK家族允许使用标准的BSD套接字接口进行用户级别和内核级别代码之间的IPC(Inter-Process Communication,进程间通信)
针对Linux的另一种特性(python2.6中新增)就是支持透明的进程间通信(TIPC)协议。TIPC允许计算机集群之中的机器相互通信,而无须使用基于IP的寻址方式。python对TIPC的支持以AF_TIPC家族的方式呈现。
总的来说,python只支持AF_UNIX、AF_NETLINK、AF_TIPC和AF_INET家族。在本章剩余的大部分内容中,我们将使用AF_INET。
面向连接的套接字和无连接的套接字
1.面向连接的套接字
不管你采用哪种地址家族,都有两种不同风格的套接字连接。
面向连接的通信提供序列化、可靠的和不重复的数据交付,每条消息可以拆分成多个片段,并且每一条消息片段都能确保能够到达目的地。实现这种连接类型的主要协议是传输控制协议(TCP),为了创建TCP套接字,必须使用SOCK_STREAM作为套接字类型。
2.无连接的套接字
在通信开始之前不需要建立连接。在数据传输过程中并无法保证它的顺序、可靠性或重复性。实现这种连接类型的主要协议是用户数据报协议(UDP),为了创建UDP套接字,必须使用SOCK_DGRAM作为套接字类型
3.Python中的网络编程
要创建套接字,必须使用socket.socket()函数,它一般的语法如下:
socket(socket_family,socket_type,protocol=0)
其中,socket_family是AF_UNIX或AF_INET,socket_type是SOCK_STREAM或SOCK_DGRAM。protocol通常省略,默认为0.