目录
网络编程
一、C/S和B/S架构
1.1 两个架构的概念
c:client s:server 客户端 服务端,例如电脑上装的qq、微信
b:browser s:server 浏览器 服务端,例如京东、天猫
b/s架构本质也是c/s架构
现在学习网络编程就是为了写一个c/s架构的软件
1.2 c端------------网络---------------s端
s端(服务器端):
- 有固定ip
- 稳定一直运行,支持并发
网络:网络连接介质+网络协议(osi七层)
二、网络协议的五层模型
网络协议:又称OSI七层协议,分为应用层(应用层,表示层,会话层)、传输层、网络层、数据链路层、物理层。
第一层:物理层
主要接受01010001等电信号
第二层:数据链接层
将物理层的电信号分组。
- 每一组叫一个数据报(数据帧),都有报头和数据部分 (头:固定18个字节,6:发送者地址 6:接收者地址 6:数据类型)
- mac地址:发送者,接收者地址,就是mac地址
- 每块网卡都有一个唯一mac地址:12位16进制数表示(前六位是厂商编号,后六位是流水线号)
- 广播:同一个局域网内通信,会出现广播风暴
第三层:网络层
已有自己的mac地址,访问对象,发送自己的IP和目标IP,通过arp协议广播发送,目标用户确认IP后发送mac地址,获取对方mac地址填入mac地址。
-
ip
ipv4:32位2进制表示:点分十进制表示 从0.0.0.0到255.255.255.255,范围是有限的,不能表示出所有的网络设备,于是出现了ipv6
-
子网掩码:通过子网掩码和ip判断两个ip是否处于同一个网段,通过ip地址和子网掩码做按位与运算
1. ip地址: 172.16.10.1: 10101100.00010000.00001010.000000001 2. 子网掩码:255.255.255.0: 11111111.11111111.11111111.000000000 3. 按位与运算:172.16.10.0 10101100.00010000.00001010.000000000 -172.16.10.10/24 包含了ip地址和子网掩码
-
ip跟mac有转换关系
1. 主机172.16.10.10/24访问172.16.10.11/24 2. ARP协议:广播的方式发送数据包,获取目标主机的mac地址 3. mac地址学习:mac地址和ip地址的映射表 第一次接收到就会在ip/mac映射表中添加一条数据{’172.16.10.11“:ddsadfgegsdgsdg}
-
任何一种协议都有头和内容
第四层:传输层
端口与端口连接
-
tcp协议
发送请求,等待响应,建立连接,信息交互。因为发送过程中需要回执,因此tcp连接可靠。
- 三次握手,建立连接
- 四次挥手,断开连接
- 连接如何建立,发数据如何保证可靠,断开如何断开,在建立连接过程中有状态
- 服务如果看到大量的syn_rcvd状态,表明正在遭受攻击
- dos和ddos攻击,拒绝服务攻击和分布式拒绝服务攻击
- 端口号:端口范围0-65535,0-1023为系统占用端口
-
udp协议
只发送请求,不需要对方响应,因此数据不可靠(例如看视频)
-
端口
1. 通过ip+子网掩码唯一确定一台设备 2. 通过ip+子网掩码唯+端口号唯一确定一个软件
-
半连接池
第五层:应用层
进入进程服务
三、写一个客户端和服务端的例子
写一个客户端,实现给服务端发送hello world字符串,写一个服务端,将客户端发送的数据变成大写后返回
# 客户端
import socket
# 创建一个socket对象
soc=socket.socket()
# 连接服务端
soc.connect(('192.168.11.176',24))
# 发送消息
soc.send(b'hello world')
# 接收1024个字节
data=soc.recv(1024)
print('我收到服务端返回的',data)
# 关闭连接
soc.close()
# 服务端
# 导入一个socket模块
import socket
# socket.SOCK_STREAM表示建立tcp连接,socket.SOCK_DGRAM表示udp连接
soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定ip地址,传元组:(ip,端口号)
soc.bind(('192.168.11.176',24)) # 如果写本机ip,局域网外部可以访问
# 如果ip写127.0.0.1,只能自己访问
# 开机,监听,这个5是半连接池的大小
soc.listen(5)
# 等待接收别人的请求
conn,addr = soc.accept()
# conn就是通路-
data = conn.recv(1024).upper() # 接收1024字节
print('服务器接收到客户端发的',data)
# conn.send发送数据,数据必须是bytes格式
conn.send(b'what can i help you?')
# 关闭通路
conn.close()
# 关闭连接
soc.close()
必须先把服务器文件运行着,客户端文件才能运行,连接到服务端