🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 一、引言   假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好。但是如果这两个程序之间想要传递一个数据,你要怎么做呢?我们可以创建一个文件,把a.py想要传递的内容写到文件中,然后b.py从这个文件中读取内容就可以了。 ![](https://img.kancloud.cn/c3/9a/c39a149a3519f5e00a12468d2f65b904_361x85.png)   但是当你的a.py和b.py分别在不同电脑上的时候,要怎么办呢?类似的机制有计算机网盘,qq等等。我们可以在我们的电脑上和别人聊天,可以在自己的电脑上向网盘中上传、下载内容。这些都是两个程序在通信。 ## 二、软件开发架构 我们了解的涉及到两个程序之间通讯的应用大致可以分为两种: * 第一种是应用类:qq、微信、网盘、优酷这一类是属于需要安装的桌面应用 * 第二种是web类:比如百度、知乎、博客园等使用浏览器访问就可以直接使用的应用 这些应用的本质其实都是两个程序之间的通讯。而这两个分类又对应了两个软件开发的架构~ ### C/S架构   C/S即:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的。这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。 ![](https://img.kancloud.cn/a7/9d/a79dc3350dabd6db5e64a4c4d1f97a12_574x264.png) ### B/S架构   B/S即:Browser与Server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的。Browser浏览器,其实也是一种Client客户端,只是这个客户端不需要大家去安装什么应用程序,只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),客户端Browser浏览器就能进行增删改查。 ![](https://img.kancloud.cn/32/96/32961f5afea96ce984d3e8543aaec1ed_556x277.png) ## 三、网络基础 ### IP和port 两个程序如何在网络上相互找到?   首先,程序必须要启动,其次,必须有这台机器的地址,我们都知道我们人的地址大概就是国家\\省\\市\\区\\街道\\楼\\门牌号这样字。那么每一台联网的机器在网络上也有自己的地址,它的地址是怎么表示的呢? ~~~ IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。 IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。 "端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。 ~~~   因此ip地址精确到具体的一台电脑,而端口精确到具体的程序。   须知一个完整的计算机系统是由硬件、操作系统、应用软件三者组成,具备了这三个条件,一台计算机系统就可以自己跟自己玩了(打个单机游戏,玩个扫雷啥的)如果你要跟别人一起玩,那你就需要上网了,什么是互联网?互联网的核心就是由一堆协议组成,协议就是标准,比如全世界人通信的标准是英语,如果把计算机比作人,互联网协议就是计算机界的英语。所有的计算机都学会了互联网协议,那所有的计算机都就可以按照统一的标准去收发信息从而完成通信了。 ### OSI七层网络模型 人们按照分工不同把互联网协议从逻辑上划分了层级: ![](https://img.kancloud.cn/44/4f/444f508d60dcdae3ce6de0930a902de2_599x244.png) 每层详细如下: ![](https://box.kancloud.cn/81caf4fb629846c1f6900fc7cab80006_1120x1587.png) 详细的网络通信原理可以参考如下博客:   [http://www.cnblogs.com/linhaifeng/articles/5937962.html](http://www.cnblogs.com/linhaifeng/articles/5937962.html) 每层常见的物理设备 ![](https://img.kancloud.cn/af/8a/af8adf0726ecfd8b4aeef09b39c6348e_584x156.png) ### 初识Socket ![](https://img.kancloud.cn/6e/61/6e61fa835fcdc91e98d242986055a36c_597x463.png)   socket层   对socket的理解:Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。   套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。 因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。  基于文件类型的套接字     套接字家族的名字:AF\_UNIX。unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信。 基于网络类型的套接字   套接字家族的名字:AF\_INET。(还有AF\_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF\_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我只使用AF\_INET。) ### tcp协议和udp协议 **TCP**(Transmission Control Protocol)可靠的、面向连接的协议、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。 **UDP**(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。 ![](https://img.kancloud.cn/95/12/9512510a3fb2af25b56a5d4ea7b625c6_565x359.png)  socket建立TCP链接需要经过三次握手(链接),四次挥手机制(断开)。 三次握手的目的:建立双向通信链路。SYN代表客户端向服务端发送的一个请求,ACK代表服务端向客户端发送的回应。 ![](https://img.kancloud.cn/5a/af/5aaf4a8aa336d5ec0b5680fb832e915a_585x381.png) TCP和UDP区别: 1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接 2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付 Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。 3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。 4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信 5、TCP对系统资源要求较多,UDP对系统资源要求较少。