简述计算机网络
一、c/s架构和b/s架构
c/s架构:客户端和服务器 eg:QQ、微信
c端-----------------------网络---------------------s端
c端:就是客户端
s端:有固定IP,并且稳定一直在运行,支持高并发
b/s架构:浏览器和服务器 eg:京东、天猫
其实b/s架构的本质也是c/s架构
二、网络协议
什么是网络?
网络就是网络连接介质+网络协议
网络协议
OSI七层协议:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
OSI五层协议:物理层、数据链路层、网络层、传输层、应用层
2.1 物理层
主要是010101的高低压电信号
2.2 数据链路层
通过etherner协议(以太网协议,,定义了以太网的分组方式)把物理层的电信号分组,每一组叫一个数据报/数据帧。
- 每一数据帧分成报头head和数据data两部分。
| 报头(18字节) | data(46-1500) |
报头(固定18字节):发送者占6位,接收者占6位,数据类型占6位
mac地址 :发送者,接收者地址,就是mac地址,每个网卡都有一个唯一的mac地址,总长度为48位2进制,12位16进制数表示(前六位是厂商编号,后六位是流水线号)
广播:同一个局域网内通信,会出现广播风暴
2.3 网络层
IP:主要有IPV4和IPV6
IPV4:32位2进制,用点分十进制表示 范围为0.0.0.0到255.255.255.255
IPV6:64位2进制
子网掩码:通过子网掩码和IP地址判断两个IP是否处于同一个网段,通过IP地址和子网掩码做按位与运算
IP地址: 172.16.10.1:
10101100.00010000.00001010.000000001
子网掩码: 255.255.255.0:11111111.11111111.11111111.000000000
按位与运算: 172.16.10.010101100.00010000.00001010.000000000
172.16.10.10/24 包含了ip地址和子网掩码
IP地址与mac地址的转换关系
应用arp协议,通过广播发送数据包,获取目标地址的mac地址
mac地址学习:mac地址和ip地址的映射表
-第一次接收到就会在ip/mac映射表中添加一条数据{’172.16.10.11“:ddsadfgegsdgsdg}任何一种包都由数据头和数据组成
2.4 传输层
TCP协议:面向连接的,可靠地
发送数据,需要响应,所以数据可靠
- 三次握手
- 四次挥手
UDP协议:面向非连接的,不可靠地
发送数据,不需要响应,所以数据不可靠
- 端口
-通过ip+子网掩码确定唯一一台设备
-通过ip+子网掩码唯+端口号确定唯一一个软件 - 半连接池:实质上是一个队列,先进先出,半连接池不是控制连接数,而是控制连接在中间状态的连接数
2.5应用层
上网流程分析(以访问百度为例):
-在浏览器输入www.baidu.com
-会取DNS服务器通过域名解析成IP地址
-向IP端口号这个地址发送请求,就会访问到百度的服务器socket
在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信,调用socket就可以直接操作传输层和网络层
三、需求
写一个客户端,实现给服务端发送hello word
字符串,写一个服务端,将客户端发送的数据变为大写后返回
#服务器
import socket #导入模块
#SOCK_STREAM表示TCP连接,SOCK_DGRAM表示UDP连接,如果不写参数,默认TCP连接
soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
soc.bind(('192.168.11.195',8080)) #括号里面是一个元组
soc.listen(5) #处于监听状态,5为半连接池的大小
conn,addr = soc.accept() #等待接收数据,conn就是通路
data = conn.recv(1024) #接收数据,最多1024个字节,1024还可以是其他数字
#发送数据,数据必须是bytes格式 把客户端发来的消息处理好再发送给客户端,,upper()将数据变大写
conn.send(data.upper())
#把客户端发来的消息处理好打印出来,给自己看(客户端发来的消息 b'hello world')
print('客户端发来的消息',data)
conn.close() #断开连接
soc.close() #关闭连接
#客户端
import socket
soc = socket.socket() #创建一个socket对象
soc.connect(('192.168.11.195',8080)) #连接服务端
soc.send(b'hello world') #给服务器发送数据,数据必须是bytes格式
data = soc.recv(1024) #接收数据,最大1024字节
#把客户端发来的消息处理好打印出来,给自己看(服务器发来的消息 b'HELLO WORLD')
print('服务器发来的消息',data)
soc.close() #关闭连接