引入场景:客户与银行关系
银行职员负责给客户提供取钱服务,客户通过账户密码跟银行职员建立合作关系。此时银行职员就可以作为服务器,当用户A取完钱后他需要等待下一个用户的接入,用户的账号密码就是建立合作关系的凭据。------简单的客户端/服务器架构模型。
客户端/服务器网络编程过程
一:创建套接字(通信端点)
基于文件套接字
AF_UNIX
基于网络套接字
AF_INET 代表ipv4 (python网络编程中常用的套接字)
AF_INET6代表ipv6
AF_NETLINK 允许使用标准的BSD套接字进行用户级别和内核级别代码之间的IPC (针对linux)
AF_TIPC 允许计算机集群之中的机器相互通信,而无需使用基于ip的寻址 (针对linux)
二:主机-端口对
主机名和端口号组合用于填充套接字,使别人能准确寻址目标。 有效的端口号为0~65535。但有的端口号已经预留给了系统,自定义端口号时不能使用这些。系统预留端口号列表
三:面向连接的套接字与无连接的套接字
面向连接的套接字(SOCK_STREAM):通信之前必须建立一个连接,SOCK_STREAM提供序列化的、可靠的和不重复的数据交付,而没偶记录边界。换句话说就是每条信息都可以被拆分为多个片段,并且每条信息片段都确保能到达目的地,最后把完整的信息传递给等待的应用程序。实现这种类型连接的主要协议是传输控制协议(TCP),因为这些套接字的网络版是基于因特网协议IP来搜寻网络主机,所以整个系统通常结合这两种协议(tcp 和ip)来进行。简单点说就是tcp为信息提供了保障,ip为网络寻址提供服务。
无连接的套接字(SOCK_DGRAM):无连接的套接字也叫数据报类型的套接字,意味在通信开始之前并不需要建立连接。此时在数据传输过程中并无法保证它的顺序性、可靠性或重复性,但数据报保留了记录边界,这就意味着消息是以整体发送的,而并非首先分个多个片段。实现这种连接类型的主要协议是用户数据报协议(UDP),网络版的寻址方式用的也是基于因特网协议IP来搜寻网络主机。所以整个系统通常以UDP/IP来进行。
通过成本来选择使用哪种套接字
由于面向连接套接字所提供的保障(序列化、可靠和不重复的数据交付)所以它们的设置以及对虚拟电路连接的维护需要大量的开销,然而数据报不需要这些开销,即数据报套接字的成本较为“低廉”,因此能提供更好的性能并且适合一些类型的应用程序。但是用哪种套接字,要依赖于要完成哪些业务目标也就是依据任务来决定是用哪种套接字。