Python网络编程 —— 网络基础知识
1、网络的基础概念
(1)、网络架构
C / S 架构: client 客户端 / server 服务端
诸如:qq 微信 浏览器 英雄联盟 穿越火线 ··· — 需要安装客户端
这里的客户端一般泛指客户端应用程序 EXE,程序需要先安装后 ,才能运行在用户电脑上,对用户的电脑操作系统环境依赖较大。
B / S 架构: browser 浏览器 / server 服务器
诸如:百度 淘宝 码云 ··· — 只要在浏览器输入网址就可以直接使用了
B / S 架构中的浏览器,也是客户端的一种,不过不需要大家去安装什么应该程序,只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),客户端浏览器就能够进行增删改查。
B / S 是 C / S 架构中的一种;C / S 架构安全性较高,但程序比较庞大。
(2)、移动端
APP
微信小程序:统一了所有web程序的入口
支付宝:统一了所有和钱相关的事
(3)、mac地址
Mac地址是一个物理地址,唯一的标识了一台网络设备,每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)
head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址。
(4)、IP地址
IP地址是一个逻辑地址,是可以根据位置变化而变化的,能够在广域网中进行快速的定位
<1>、IPV4地址
表示 : 4 位点分十进制
范围 : 0.0.0.0 – 255.255.255.255
数量 :2**32
<2>、IPV6地址
6位冒分十六进制
0.0.0.0 – FFFF:FFFF:FFFF:FFFF:FFFF:FFFFF
(5)、公网和内网
公网 : 0.0.0.0 – 255.255.255.255 (不包含保留字段的IP)
能够在任意一个地方去访问的IP地址
内网 : 所有的内网IP都要使用保留字段
只能在一个区域内使用,出了这个区域就用不了了
# ip保留地址
a类网:192.168.0.0 - 192.168.255.255
b类网:172.16.0.0 - 172.32.255.255
c类网:10.0.0.0 - 10.255.255.255
(6)、路由器和交换机
<1>、 交换机
交换机(Switch)是一种用于电(光)信号转发的[网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机。其他常见的还有电话语音交换机、光纤交换机等。
# 交换机完成局域网内通信
交换机不认识 IP 地址,只认识 mac 地址
通过 IP 找 mac 地址:arp协议(地址解析协议)
方式: 单播 广播 组播
<2>、 路由器
路由器是连接两个或多个网络的硬件设备,在网络间起网关的作用,是读取每一个数据包中的地址然后决定如何传送的专用智能性的网络设备。
# 路由器完成局域网间通信
(7)、网关IP
网关实质上是一个网络通向其他网络的IP地址。
(8)、子网掩码
子网掩码,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
知道”子网掩码”,就可以判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。
255.0.0.0
255.255.0.0
255.255.255.0
# 判断两个IP地址是否在同一网段 结果相同则为同一网段,反之不是, IP 和 子网掩码 之间是 按位运算
192.168.13.26
255.255.0.0
11000000.10101000.00001101.00011010
11111111.11111111.00000000.00000000
11000000.10101000.00000000.00000000 = 192.168.0.0
192.168.12.134
255.255.0.0
11000000.10101000.00001100.10000110
11111111.11111111.00000000.00000000
11000000.10101000.00000000.00000000 = 192.168.0.0
# 结果都是192.168.0.0,因此它们在同一个子网络。
(9)、port 端口 : 0 – 65535
一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区分不同的服务的。
IP + port 能够唯一的确认网络上的一台机器上的一个服务。
2、互联网协议与OSI模型
(1)osi七层协议
应用层 : 网络服务与最终用户的一个接口
表示层 : 数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
会话层 : 建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
传输层 : 定义传输数据的协议端口号,以及流控和差错校验。
网络层 : 进行逻辑地址寻址,实现不同网络之间的路径选择。
数据链路层 : 建立逻辑连接、进行硬件地址寻址、差错校验等功能。(由底层网络定义协议)
物理层 : 建立、维护、断开物理连接。(由底层网络定义协议)
(2)osi五层协议
应用层(五层)
传输层(四层) 端口 UDP协议 / TCP协议 四层交换机 四层路由器
网络层(三层) IPV4协议 / IPV6协议 路由器 三层交换机
数据链路层(二层) mac arp协议 网卡 (二层)交换机
物理层(一层)
3、TCP/UDP协议
(1)、TCP协议
当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。
用途:上传,下载
特性:安全可靠、 面向连接、 速度慢、 能传递的数据长度不限
过程:
建立连接 -- 三次握手
消息传递 -- 可靠传输
断开连接 -- 四次挥手
TCP三次握手的过程如下:
客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
TCP四次挥手的过程如下:
建立一个连接需要三次握手,而终止一个连接要经过四次挥手,这是由TCP的半关闭(half-close)造成的。
(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。
既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。
注意:
(1) “通常”是指,某些情况下,步骤1的FIN随数据一起发送,另外,步骤2和步骤3发送的分节都出自执行被动关闭那一端,有可能被合并成一个分节。
(2) 在步骤2与步骤3之间,从执行被动关闭一端到执行主动关闭一端流动数据是可能的,这称为“半关闭”(half-close)。
(3) 当一个Unix进程无论自愿地(调用exit或从main函数返回)还是非自愿地(收到一个终止本进程的信号)终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接上也发出一个FIN。
无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是,客户执行主动关闭,但是某些协议,例如,HTTP/1.0却由服务器执行主动关闭。
(2)、UDP协议
当应用程序希望通过UDP与一个应用程序通信时,传输数据之前源端和终端不建立连接。当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
用途:即时通讯工具
特性:不可靠、 面向数据报、 速度快、 能传递的数据长度有限
过程:
不管对方在不在线 直接发送
不占连接
随时可以收发消息
(3)、TCP和UDP的比较:
TCP — 传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP — 用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
现在Internet上流行的协议是TCP/IP协议,该协议中对低于1024的端口都有确切的定义,他们对应着Internet上一些常见的服务。这些常见的服务可以分为使用TCP端口(面向连接)和使用UDP端口(面向无连接)两种。
说到TCP和UDP,首先要明白“连接”和“无连接”的含义,他们的关系可以用一个形象地比喻来说明,就是打电话和写信。两个人如果要通话,首先要建立连接——即打电话时的拨号,等待响应后——即接听电话后,才能相互传递信息,最后还要断开连接——即挂电话。写信就比较简单了,填写好收信人的地址后将信投入邮筒,收信人就可以收到了。从这个分析可以看出,建立连接可以在需要痛心地双方建立一个传递信息的通道,在发送方发送请求连接信息接收方响应后,由于是在接受方响应后才开始传递信息,而且是在一个通道中传送,因此接受方能比较完整地收到发送方发出的信息,即信息传递的可靠性比较高。但也正因为需要建立连接,使资源开销加大(在建立连接前必须等待接受方响应,传输信息过程中必须确认信息是否传到及断开连接时发出相应的信号等),独占一个通道,在断开连接钱不能建立另一个连接,即两人在通话过程中第三方不能打入电话。而无连接是一开始就发送信息(严格说来,这是没有开始、结束的),只是一次性的传递,是先不需要接受方的响应,因而在一定程度上也无法保证信息传递的可靠性了,就像写信一样,我们只是将信寄出去,却不能保证收信人一定可以收到。
TCP是面向连接的,有比较高的可靠性, 一些要求比较高的服务一般使用这个协议,如FTP、Telnet、SMTP、HTTP、POP3等。
UDP是面向无连接的,使用这个协议的常见服务有DNS、SNMP、QQ等。对于QQ必须另外说明一下,QQ2003以前是只使用UDP协议的,其服务器使用8000端口,侦听是否有信息传来,客户端使用4000端口,向外发送信息(这也就不难理解在一般的显IP的QQ版本中显示好友的IP地址信息中端口常为4000或其后续端口的原因了),即QQ程序既接受服务又提供服务,在以后的QQ版本中也支持使用TCP协议了。