计算机网络的发展
早期 : 联机
以太网 : 局域网与交换机
软件开发的架构
1.C/S架构
C/S即:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的。
这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。
2.B/S架构
B/S即:Browser与Server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的。
Browser浏览器,其实也是一种Client客户端,只是这个客户端不需要大家去安装什么应用程序,只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),客户端Browser浏览器就能进行增删改查。
解耦分治的思想 —— 统一入口
b/s架构是c/s架构的关系:b/s架构是c/s架构的一种
想要实现通信:网卡和网线,网卡上有全球唯一的mac地址
三.网络基础
1.一个程序如何在网络上找到另一个程序
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地址精确到具体的一台电脑,而端口精确到具体的程序 规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示 范围0.0.0.0-255.255.255.255 一个ip地址通常写成四段十进制数,例:172.16.10.1 保留字段192.168. . 127.0.0.1 本地的回环地址 在计算机上 每一个需要的网络通信的程序 都会开一个端口 在同一时间只会有一个程序占用一个端口 不可能在同一时间同一个计算机上有两个程序 占用同一个端口 端口的范围:0-65535 一般情况下 8000 之后的端口 ip --确定唯一一台机器 端口 -- 确定唯一的一个程序 ip+端口 找到唯一的一台机器上的唯一的一个程序 '''
2.广播风暴
主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。有线电视网就是典型的广播型网络,我们的电视机实际上是接受到所有频道的信号,但只将一个频道的信号还原成画面。在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。
3.mac地址
head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址。
mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)
4.arp协议 ——查询IP地址和MAC地址的对应关系
5.广域网与路由器
比如,已知IP地址172 .16 .10 .1 和172 .16 .10 .2 的子网掩码都是255 .255 .255 .0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算, 172.16 .10 .1:10101100.00010000 .00001010 .000000001 255.255 .255 .0: 11111111.11111111 .11111111 .00000000 AND运算得网络地址结果:10101100.00010000 .00001010 .000000001->172.16 .10 .0 172.16 .10 .2:10101100.00010000 .00001010 .000000010 255.255 .255 .0: 11111111.11111111 .11111111 .00000000 AND运算得网络地址结果:10101100.00010000 .00001010 .000000001->172.16 .10 .0 结果都是172 .16 .10 .0,因此它们在同一个子网络。 ''' 其位运算 将数字转换成等价的二进制形式后在进行处理数据 & x&y(按位与) 如果两个操作数的相应均为1,则该位的结果为1 | x|y(按位或) 如果两个操作数的相应为有一个为1,则该位的结果为1 ~ ~x(按位取反) 讲操作数按位取反(0->1和1->0) ^ ^x(按位异或) 如果参数运算的两个操作数的相应同号,则结果为0,异号为1 << x<<2(左移2位) 左端(高位)溢出部分舍弃,右端低位补0 >> x>>2(右移2位) 右端(低位)溢出部分舍弃,左端根据符号补0或者1,无符号或整数补0,负数补1 按位运算中需要将要运算的数值转换为补码的形式,然后考虑是32位还是64位,比如右移的情况下 -5 原码 1000 0101 //中间的零根据32位还是64位变换多位 反码 1111 1010 补码 1111 1011 //补码在右侧加1,同时补上符号位 左移的情况下 1000 1111 左移一位, 0001 1110 只需要右边补0就行 '''
6.tcp协议和udp协议
TCP协议
当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。
这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。
tcp协议:是可靠地面向连接的 是全双工的
全双工 双方都可以收发信息
建立连接三次握手 断开连接四次挥手
一方发起请求另一方同意请求
tcp协议是全双工的 必须双方同意
UDP协议(不需要建立连接 快并且不占连接)
当应用程序希望通过UDP与一个应用程序通信时,传输数据之前源端和终端不建立连接。
当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
tcp和udp的对比
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
7.互联网协议
我们开发其主要运用中间五层
socket概念
套接字(socket)的发展史
套接字家族的名字:AF_UNIX
unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信。
套接字家族的名字:AF_INET
(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)。
基于TCP协议的socket
server端
import socket sk = socket.socket() #sk.bind(('ip','port')) sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字 sk.listen() #监听链接 conn,addr = sk.accept() #接受客户端链接 ret = conn.recv(1024) #接收客户端信息 print(ret) #打印客户端信息 conn.send(b'hi') #向客户端发送信息 conn.close() #关闭客户端套接字 sk.close() #关闭服务器套接字(可选)
client端
import socket sk = socket.socket() # 创建客户套接字 sk.connect(('127.0.0.1',8898)) # 尝试连接服务器 sk.send(b'hello!') ret = sk.recv(1024) # 对话(发送/接收) print(ret) sk.close() # 关闭客户套接字
#加入一条socket配置,重用ip和端口 import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket.socket() sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加 sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字 sk.listen() #监听链接 conn,addr = sk.accept() #接受客户端链接 ret = conn.recv(1024) #接收客户端信息 print(ret) #打印客户端信息 conn.send(b'hi') #向客户端发送信息 conn.close() #关闭客户端套接字 sk.close() #关闭服务器套接字(可选)