在学习网络编程之前,理解几个名词:计算机网络、互联网、因特网、万维网。
计算机网络:计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来。在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
互联网:互联网是指网络与网络之间所串联的庞大网络。这种将计算机网络互相连接在一起的方法叫做网络互连,而互联网就是基于此而发展出来的。
网络通信协议:互联网是网络与网络组成的更加复杂、更加庞大的网络,为了让互联网真正做到互联,就必须规定通信协议。你可以想象一群不同国家的人相处在一起各说各的语言是一种什么场景,你也应该就能明白通信协议的重要性。
TCP/IP协议:互联网包含了上百种协议标准,但其中最重要的两个协议是TCP和IP协议。因此互联网协议也可以简称为TCP/IP协议。
互联网、因特网、万维网的关系:
互联网包含因特网,因特网包含万维网,凡是能够彼此通信的设备组成的网络就叫互联网,而因特网是最大的计算机网络。
因特网使用TCP/IP协议让不同的设备可以彼此通信,但是用TCP/IP协议的网络不一定是因特网,一个局域网也可以使用TCP/IP协议。
上百个因特网协议被放在不同的层中,其中位于应用层的就有许多种协议,而只要使用的是应用层中的HTTP协议的网络,就称为万维网。
IP协议:
要想实现不同设备之间的通信,就必须事先知道彼此的标识。在互联网内的每一台计算机都有唯一的IP地址标识,如果一台计算机连接了多个网络,它就有多个IP地址。IP地址对应于计算机的网络接口,通常是网卡。
IP协议负责把数据从一台计算机通过网络发送给另一台计算机。数据会被分割成多小块,然后通过IP包发送出去。由于互联网链路复杂,因此两台计算机之间通常有多条线路,其中路由器可以看作是线路中一个中转点,它负责把一个IP包转发出去。IP包的特点是按块发送,途径多个路由,但无法保证顺序到达,也无法保证顺序到达。
IP地址是一个32位整数,即IPv4,但众所周知,随着互联网的迅猛发展,IPv4早就无法满足需求,因此新的IP地址是一个128位整数,即IPv6。
TCP协议:
TCP协议是建立在IP协议之上的。它负责在两台计算机之间建立可靠连接,保证数据包按顺序送达。TCP协议通过握手建立连接,然后对每个IP包编号,这有助于顺序送达,如果在传输的过程中包丢失了,就自动重发。
许多更高级的协议都是建立在TCP协议基础上的,比如HTTP协议。
端口:
一个TCP报文除了包含要传输的数据外,还包含源IP地址和目标IP地址,源端口和目标端口。
一台计算机上不可能只有一个网络程序,很多情况下它同时运行有多个网络程序,比如浏览器,QQ,邮箱等,那么一个TCP报文来了之后,到底该把它交给谁?这就需要端口号来区分,每个网络程序都会向操作系统申请唯一的端口号,这样,TCP报文就会根据端口号找到正确的网络程序。
一个网络进程也可能同时与多个计算机建立连接,这时它会申请很多端口。
客户端/服务器架构模型:
简单来说,客户端发送请求,服务器响应请求。
硬件服务器如文件服务器,软件服务器如数据库服务器,Web服务器等,而客户端可以是任何能够发送请求的设备。
你可以把服务器看作是一台永不休止的机器,它无时无刻不在工作,当有客户端的请求送达时,它处理客户端的请求,当无客户端请求时,它将处于监听状态。
网络编程实现客户端/服务器架构模型:
服务器:
建立通信端点 → 监听服务器 → 等待请求 → 响应请求 → 无限循环二、三、四流程
客户端:
建立通信端点 → 连接服务器 → 发送请求 → 收到结果 → 结束
套接字:
套接字(socket)是计算机网络数据结构,它体现了上文所描述的通信端点的概念,因为套接字十分重要,因此网络编程也叫套接字编程。
一个网络应用程序必须创建套接字。
两种类型的套接字:
#1 基于文件
AF_UNIX(又名AF_LOCAL),Python中仍使用AF_UNIX。
#2 面向网络
AF_INET。
AF_INET6(用于IPv6)。
其它套接字暂不说明。
套接字分类:
就算是对同一种套接字,也分为面向连接的和无连接的。
#1 面向连接
面向连接的套接字在通信开始之前必须先建立连接,这种通信也叫做虚拟电路或流套接字。
面向连接的套接字基于TCP/IP协议,要创建这种TCP套接字,必须使用SOCK_STREAM。
TCP套接字特点:数据分段传输、安全可靠、不记录边界、序列化、不重复、设置、维护开销大。
#2 无连接
数据报类型的套接字属于无连接的套接字,它基于用户数据报协议,即UDP/IP协议,要想创建这种套接字,必须使用SOCK_DGRAM。
UDP套接字特点:记录边界、无法保证安全性、顺序性和重复性、数据整体传输、成本低廉。
参考:
百科
《Python核心编程》
https://www.liaoxuefeng.com/wiki/1016959663602400/1017788916649408