网络编程
架构
架构
单机软件:只有c
C/S架构:c表示client,客户端,s表示server,服务端
B/S:b表示browser,浏览器服务端,s,server,服务端
B/S本质也是C/S,只不过客户端换成了浏览器
学习网络编程为了写CS架构软件
C端---网络---S端
S端:有固定的ip,稳定,支持并发,
网络协议
网络:网络连接介质+网络协议(osi七层协议)
七层:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
五层:应用层,传输层,网络层,数据链路层,物理层
四层:应用层,传输层,网络层,网络接口层
'''
'''
网络协议:今天学的为五层(应传网数物),所有网络传输必须遵循
物理层:一堆电信号,二进制(0101110101),携带数据
数据链路层:
遵循Ethernet,以太网协议,对物理层的电信号进行分组,
一组电信号叫做一个数据报或者数据帧,每组数据分两部分,报头(发送者地址,
6个字节,接受者地址:6个字节,数据类型,6个字节,报头固定18字节),数据部分
(data,最少46字节,最多1500字节)
mac地址;发送者接受者的地址就是mac地址,每个网卡都会有唯一mac地址,mac地址(
前六位厂商编号,后六位流水线号)
广播:同一个局域网内通信,所有人都能收到,会出现广播风暴
网络层:
ip:ipv4通过32位2进制数表示,点分十进制,从0.0.0.0到255.255.255.255
范围是有限的,不能表示所有网络设备,所以出现了ipv6,ip地址分为两部分,
子网掩码:通过子网掩码和ip判断两个ip是否处在同一个网段,通过ip地址,子网掩码,做
ip地址: 172.16.10.1: 10101100.00010000.00001010.000000001
子网掩码:255.255.255.0: 11111111.11111111.11111111.000000000
按位与运算:172.16.10.0 10101100.00010000.00001010.000000000
172.16.10.10/24 包含了ip地址和子网掩码
按位与运算(将ip地址,子网掩码用二进制表示,上下两个都为1为1,其余都为0)
ip与mac有转换关系:ARP协议,通过广播发送数据包,获取目标mac地址,同一个网络下
带着源mac,目标mac(未知),源ip,目标ip,数据,局域网内每个人都发一次
mac地址学习:mac地址和ip地址的映射表,在第一次接受到就会在表中添加一条数据(相
当于字典,一个mac地址对应一个ip地址)
任何一种协议都有头和数据部分
传输层:
tcp协议(好人协议):tcp连接是可靠的,三次握手(建立双向通路),四次挥手(断开双向通路)
双向通路:C端给S端发送数据,S端也给C端发送数据
tcp可靠原因:因为传输过程中CS必须回执,确保收到消息
服务端如果大量看到syn_rcvd的状态,可能遭受攻击了
dos攻击和ddos攻击:拒绝服务攻击,分布式拒绝服务攻击
端口号:0-65535,系统占用端口:0-1023
通过ip+子网掩码唯一确定一台设备
通过ip+子网掩码+端口号唯一确定一个软件
半连接池:建立双向通路的请求放到半连接池中,队列,先进先出,通过软件(连接池大小不是控制
的链接数,而是链接在中间状态的连接数)
控制,有内存来放,所以dos攻击无法防范,
(udp):不可靠传输,不需要相应
socket(抽象层,在应用层与其他层之间,抽象tcp,ip写成简单的接口)
在python中通过socket写一个CS架构的软件
应用层:
根据应用程序
http协议
ftp协议
邮件协议
上网流程分析
上网流程分析:
浏览器输入地址,
会去DNS服务器,通过域名解析成ip地址加端口号
向ip+端口号这个地址发送请求,底层基于socket
三次握手
四次挥手
socket
# 简单通信客户端
import socket
# 先导入模块
# 想想买手机打电话,SOCK_STREAM.tcp链接,udp链接用SOCK_DGRAM
soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 相同机器通讯:AF_UNIX 不同机器通讯:AF_INET
# 插卡,传ip地址,端口号
soc.bind(('192.168.11.209',8080))
# 如果写本机ip,外部可以访问,127.0.0.1只能自己访问
# 开机,监听
soc.listen(5) # 5是半连接池大小
conn,addr = soc.accept() # 等别人给打电话
data = conn.recv(1024)
print(data)
# conn就是通路,
# conn.send发送数据,数据必须是二进制格式
conn.send(b'nihao')
# 挂断电话
conn.close()
# 销毁手机
soc.close()
# import socket
# # 创建soc对象
# soc = socket.socket()
# # 链接服务端地址
# soc.connect(('192.168.11.209',8080))
# # 发送消息
# soc.send(b'hellosir')
# data = soc.recv(1024)
# print('shoudao',data)
# soc.close()