python基础:网络编程

一、引入
我们可以在我们的电脑上和别人聊天,可以在自己的电脑上向网盘中上传、下载内容。这些都是两个程序在通信。由于在不同机器上的程序需要通信,才产生了网络。

二、网络编程
就是通过网络让不同计算机上运行的程序可以进行通信。
例如两台电脑上的qq通过网络进行相互聊天。

三、软件开发架构
两个程序之间通讯的应用大致可以分为两种:
第一种是应用类程序:qq、微信、网盘、优酷这一类是属于需要安装的桌面应用
第二种是web类程序:用户只需要浏览器即可访问程序。常见的web类应用程序
比如百度、知乎、CSDN等使用浏览器访问就可以直接使用。
不管是应用类程序还是web类程序,这些应用的本质其实都是两个程序之间的通讯。
而这两个分类又对应了两个软件开发的架构。
1、客户端服务端概念
客户端:就是我们常用的程序例如qq、微信,浏览器等等。
服务端:要一直运行着给别人提供服务的机器(电脑、服务器)。

2、C/S架构
C/S即:Client与Server ,中文意思:客户端与服务器端架构。
这里的客户端一般泛指客户端应用程序exe,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。

python基础:网络编程

3、B/S架构
B/S即:Browser与Server,中文意思:浏览器端与服务器端架构。
只需在浏览器上通过HTTP去请求服务器端相关的资源(网页资源)。

python基础:网络编程
四、计算机网络
首先说明一下每台电脑在网络世界中都有一个全球唯一的标识就是ip地址。
那ip地址是什么呢?我们的电脑上网需要有硬件设施网线和网卡,网卡用来链接网线。网卡上有全球上唯一的物理地址(mac),长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)

python基础:网络编程

但是链接mac地址记起来很麻烦因此出现了ip地址。范围0.0.0.0-255.255.255.255。
一个ip地址通常写成四段十进制数,例:172.16.10.1
通过 ip地址 就能找到mac地址,中间遵循了ARP(Address Resolution Protocol)协议,
中文叫:地址解析协议, 是根据IP地址获取物理地址的一个TCP/IP协议。
一个特殊的地址 127.0.0.1 本地回环地址,访问自己电脑上的程序。

我们通过了ip地址找到了具体的某一台电脑,那我们怎么找到了想访问的应用呢?例如两台
QQ进行聊天案例,怎样找到另外一台电脑上的QQ程序呢?就需要通过电脑上的端口了。

电脑上的每一个应用程序想运行必须占一个端口号。并且端口号同时间只能被一个应用程序占用。
每一台电脑上一共有65536个端口,端口的范围是0-65536。一般0~1023被一些其他应用已经占用,因此我们一般从1024开始指定端口。
1、网络协议(TCP/IP协议族)
网络协议就是为了能让计算机网络中进行数据交换而建立的规则、标准;
例如下载软件然后如果不同意协议就不能继续下一步,同样的道理在互联网中,如果不遵循互联网协议就不能访问到资源;
互联网上有上百种协议,但是最重要的两个协议是TCP协议和IP协议,因此我们将上百种协议统称为TCP/IP 协议族。TCP/IP协议族,根据协议的功能的不同抽象成了4层。
应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
传输层:TCP,UDP
网络层:IP,ICMP,OSPF,EIGRP,IGMP
数据链路层:SLIP,CSLIP,PPP,MTU

python基础:网络编程

2、TCP协议
TCP(Transmission Control Protocol)可靠的、面向连接的协议
(什么是面向连接呢?就是发送消息之前先建立连接然后再发送消息例如打电话场景,在网络中具体指的是三次握手)
TCP协议特点:数据安全,速度略低。分为客户端和服务端。
使用TCP的应用:Web浏览器;电子邮件等程序。
TCP的三次握手和4次挥手
TCP三次握手:
三次握手就是客户端和服务器进行通信的时候有三次交流。例如如下:
客户端问服务端你准备好了吗(第一次),服务端告诉客户端装备好了,并且问客户端你准备好了吗(第二次),客户端说我准备好了(第三次)。
第一次握手:是客户端让服务器准备好资源。
第二次握手:服务端资源准备好了并且服务端问客户端资源有没有准备好。
第三次握手:客户端资源也准备好了。接下来才真正的发生数据。

真正进行3次握手的时候发送的是值。

第一次客户端装备了一个值例如是11,发送给了服务端,服务端如果准备好了就将11+1变成12再发送给客户端,表示服务端准备好了资源。
服务怎么知道客户端准备好了资源呢?服务器给客户端发送一次数据例如33,客户端如果准备好了就再将数据加1 33+1 =34 发送给服务端,服务端接受到后就表明客户端准备好了。这样4次才知道双方准备好了资源。这里发生了4次,不是3次,

四次挥手
客户端给服务器说再见,服务器给客户端说拜拜,服务端告诉客户端我也不和你玩了,客户端说不玩就不玩。
第一次,客户端告诉服务端我不会给你发数据了,第二次服务端告诉客户端我收到你发生的信息了,第三次服务端给客户端发生数据说我也不给你发了,第四次客户端给服务端说我知道了。

四次挥手:
建立一个连接需要三次握手,而终止一个连接要经过四次挥手。
(1) 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
(2) 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。
注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
(3) 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
(4) 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。[1]

2、UDP协议
UDP协议:面向无连接,数据不安全,速度快。不区分客户端与服务端。
用于网络电话,在线视频网络会议等等,要求实时性比较高(数据传输快)不能有延迟。
当应用程序希望通过UDP与一个应用程序通信时,传输数据之前源端和终端不建立连接。
当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
因此UDP是不可靠无连接的协议。因为有可能数据会丢失。