网络基础
网络基础
C/S和B/S架构
c:client s:server 客户端,服务端,电脑上装的qq,微信
b:browser s:server 浏览器 服务端,京东,天猫
bs架构本质也是cs
s端:
1 有固定ip
2 稳定一直在运行,支持并发
osi七层协议
互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层
tcp/ip五层模型讲解
我们将应用层,表示层,会话层并作应用层,从tcp/ip五层协议的角度来阐述每层的由来与功能,搞清楚每层的主要协议就理解了整个互联网通信的原理。
首先,用户感知到的只是最上面一层应用层,自上而下每层都依赖于下一层,所以我们从最下一层开始切入,比较好理解
物理层:
010101电信号
数据链路层:
把物理层的电信号分组,每一组叫一个数据报/数据帧,每一数据帧分成:报头head和数据data两部分
-每一个数据报,都由报头和数据部分
-头:固定18个字节,6:发送者地址/6:接收者地址/6:数据类型
-mac地址 :发送者,接收者地址,就是mac地址
-每块网卡都有一个唯一mac地址:12位16进制数表示(前六位是厂商编号,后六位是流水线号)
-广播:同一个局域网内通信 ,会出现广播风暴
网络层 :
-ip :ipv4:32位2进制表示:点分十进制表示 从0.0.0.0到255.255.255.255,范围是有限的,不能表示出所有的网络设备,于是出现了ipv6
-子网掩码:通过子网掩码和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跟mac有转换关系
-主机172.16.10.10/24访问172.16.10.11/24
- ARP协议:广播的方式发送数据包,获取目标主机的mac地址
-mac地址学习:mac地址和ip地址的映射表
-第一次接收到就会在ip/mac映射表中添加一条数据{’172.16.10.11“:ddsadfgegsdgsdg}
-任何一种协议都有头和内容
传输层:
tcp协议:
-三次握手,四次挥手(重点,看图),连接如何建立,发数据如何保证可靠,断开如何断开,在建立连接过程中有状态
-服务的如果看到大量的syn_rcvd状态
-dos和ddos攻击:拒绝服务攻击,分布式的拒绝服务攻击
-端口号:端口范围0-65535,0-1023为系统占用端口
-udp协议:
-发送,不需要要响应,所以数据不可以靠,(看视频)
-端口
-通过ip+子网掩码唯一确定一台设备
-通过ip+子网掩码唯+端口号唯一确定一个软件
-半连接池
应用层:
-应用层由来:用户使用的都是应用程序,均工作于应用层,互联网是开发的,大家都可以开发自己的应用程序,数据多种多样,必须规定好数据的组织形式
-应用层功能:规定应用程序的数据格式。
上网流程分析:
-在浏览器输入www.baidu.com
-会取dns服务器通过域名解析成ip地址
-向ip+端口号这个地址发送请求,就会访问到百度的服务器
socket
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。
socket工作流程
先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束
scoket编程小实例
# server
import socket
sk = socket.socket() # 创建socket对象
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 为了关闭server端不报错
sk.bind(('127.0.0.1',8080)) # 绑定server端ip和端口号
sk.listen(5) # 监听
conn,addr = sk.accept() # 拿到连接和地址
while True:
ret = conn.recv(1024).decode('utf8') # 接收client端传输的数据
print(ret)
res = conn.send(bytes(ret.upper(),encoding='utf8')) # 向client端发送数据
conn.close() # 关闭资源
sk.close() # 关闭资源
# client
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
while True:
info = input('>>>>>>')
sk.send(bytes(info, encoding='utf8'))
ret = sk.recv(1024).decode('utf8')
print(ret)
sk.close() # 关闭资源