32 网络编程 (一)
一.架构
定义:程序员开发的一种模式.
分类:
C/S 架构 C/S即:Client与Server , 客户端/ 服务器模式 . 缺点 : 冗余
B/S 架构 Browser与Server, 浏览器 /服务器模式 . 优势 : 统一了应用的接口
二.网络通信编程
1.网卡 : mac地址,电脑的物理地址(真实存在的),mac地址要求全球唯一.
2.IP协议 : 规定网络地址的协议叫IP协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示
范围0.0.0.0-255.255.255.255
IP协议的作用:
(1).一个是为每一台计算机分配IP地址.
(2).另一个是确定哪些地址在同一个子网络.
3.IP地址 : 是指互联网协议地址(Internet Protocol Address 网际协议地址),是IP Address的缩写
是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异
4.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).
5.端口 : 是英文port的意译.操作系统为每一个应用程序分配一个端口号,IP+端口号唯一确定某一程序. (是一个程序唯一的标识)
6.mac地址:
每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)
7.arp协议 (通过目标IP获取目标mac地址)
服务器 1 找到服务器 2 的mac地址步骤: (补充 组播:给一组服务器发消息.)
(1)服务器1发送请求帧给交换机;
(2)交换机以广播方式找寻服务器2:
(3)服务器2接收到请求返回给交换机;
(4)交换机以单播方式返回给服务器1.
整个过程服务器 1 通过服务器 2 的IP地址,借助交换机的功能找到服务器 2 的mac地址.
8.局域网:
局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组;局域网是封闭型的,
可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。
9.子网掩码:
所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,
IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
9.用网段来确定一个IP是否在当前局域网内
网段 = IP地址 & 子网掩码 ( 两个数位都为1,运算结果为1,否则为0 )
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 同一个局域网内.
10.广域网 : 全是通用的网络.
11.路由器 : 路由器(Router),是连接因特网中各局域网、广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号,
路由器是互联网络的枢纽,"交通警察".
12 路由器与交换机的区别:
路由和交换机之间的主要区别就是交换机发生在OSI参考模型第二层(数据链路层),而路由发生在第三层,即网络层。
这一区别决定了路由和交换机在移动信息的过程中需使用不同的控制信息,所以说两者实现各自功能的方式是不同的。
13.路由器(Router)又称网关设备(Gateway)
是用于连接多个逻辑上分开的网络,所谓逻辑网络是代表一个单独的网络或者一个子网。当数据从一个子网传输到另一个子网时,
可通过路由器的路由功能来完成。因此,路由器具有判断网络地址和选择IP路径的功能,它能在多网络互联环境中,建立灵活的连接,
可用完全不同的数据分组和介质访问方法连接各种子网,路由器只接受源站或其他路由器的信息,属网络层的一种互联设备.
14.TCP协议(通信协议一): 安全可靠的通信方式,如果发生错误会返回错误,让用于重发.
TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)
面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序
TCP编程(服务器和客户端)
服务器:
import socket
sk=socket.socket(type=socket.SOCKET_STREAM) 默认tcp协议 (类似买手机)
sk.bind(("127.0.0.1",端口号)) 端口号0 - 65535 ; 0-1023 不能用; 8000-10000 常用时刻 (类似买手机卡)
sk.listen() (类似于告诉朋友手机号)
conn,addr=sk.accept() (类似于等电话)
msg=conn.recv(1024) (类似于聊天)
print((msg) 可以有参数 decode("utf-8") addr
conn.close() (类似于挂点电话)
sk.close() (类似于关机)
客户端:
import socket
sk=socket.socket()
sk.connect(("127.0.0.1",端口号)) (类似于给手机打电话)
sk.send(b'hello') 必须是字节
sk.close()
15.UDP协议(通信协议二): 不安全,不可靠的通信方式 速度快.
UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、
面向报文,尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。 (常用于视频会议)
16.回环地址:
127.0.0.1 是一个回环地址,无论什么时候都可代表本机的IP地址(仅限在本机使用)
17.命令:
在cmd中输入命令ipconfig_all 查看ip 的相关设置
18.什么是协议
由多人制定的一种规则.
19.socket
用socket去操作tcp udp 协议
面试题:
三次握手: 必须是客户端先发起.
(1).客户端发送请求给服务器;
(2)服务器回复客户端;
(3)客户端回复服务器.
四次挥手: 谁发起都可以 其中一端连续发两条.
(1).客户端发断开请求给服务器:
(2).服务器回复确认收到请求;
(3).服务器给客户端发送准备断开;
(4).客户端断开吧.
三.互联网协议与osi模型.
1.互联网协议按照功能不同分为osi五层.
2.OSI 五层模型:
应用层 (.py文件 ,http,ftp, tftp)
传输层 (tcp , udp)
网络层 (IP协议 路由器)
数据链路层 (arp协议 ,网卡)
物理层 (网线 , 光纤 ,集线器)
必背:
arp协议
tcp udp 的区别
tcp 三次握手 四次挥手
什么是协议
tcp协议编码的流程
作业:写一个聊天程序可支持一个服务器与多个客户端通信
一个服务器多个客户端
#服务器:
# import socket
# sk=socket.socket()
# sk.bind(("127.0.0.1",8802))
# sk.listen()
# while 1:
# conn,addr=sk.accept()
# while 1:
# msg=conn.recv(1024).decode("utf-8")
# print(msg)
# if msg=="q":
# break
# content=input(">>>").encode("utf-8")
# conn.send(content)
# if content=="q":
# break
# conn.close()
# sk.close()
#客户端
# import socket
# sk=socket.socket()
# sk.connect(("127.0.0.1",8802))
# while 1:
# content=input(">>>")
# sk.send(content.encode("utf-8"))
# if content=="q":
# break
# msg=sk.recv(1024).decode("utf-8")
# print(msg)
# if msg=="q":
# break
# sk.close()
tcp协议 输出带颜色的信息
#服务器:.
import socket
sk=socket.socket()
sk.bind(("127.0.0.1",8803))
sk.listen()
dic={"alex":"\033[0;35;42m","太白":"\033[0;33;40m"}
while 1:
conn,addr=sk.accept()
while 1:
msg=conn.recv(1024).decode("utf-8")
# print(msg)
name=msg.split(":")[0].strip()
# content=msg.split(":")[-1]
color=dic.get(name,"")
print(content)
print("%s%s\033[0m" % (color,msg))
if content=="q":
break
content=input(">>>")
conn.send(content.encode("utf-8"))
if content=="q":
break
conn.close()
sk.close()
#客户端
import socket
sk=socket.socket()
sk.connect(("127.0.0.1",8803))
name=input("姓名:")
while 1:
content=input('>>>')
content1=name+":"+content
sk.send(content1.encode("utf-8"))
if content=="q":
break
mag=sk.recv(1024)
print(mag.decode("utf-8"))
if mag=="q":
break
sk.close()