今日回顾
网络编程: C(client) / S(server) | B(browers)/S(server)
网络通信:计算机间的数据传输,传输需要统一的协议
OSI:开放系统互联参考模型
应用层 | 表示层 | 会话层 | 传输层 | 网络层 | 数据链路层 | 物理层
数据链路层:以太网协议 每一个链接网路的设备必须有一个网卡(世界上独一无二的MAC地址);
每一组数据需【head:固定长度18个字节(6源地址,6个目标地址,2个数据类型),date(最短46字节,最长1500字节)】
数据链路层通过广播的方式来查找某一台计算机【通过交换机,在一个局域网】, 某一个mac响应后, 交换机会自主学习将保存mac与网口的映射关系
问题:广播风暴,且没有可以链接所有设备的交换机
网络层:方要是IP协议
1.每台设备必须有一个IP地址:四段三位点分十进制【其中前三段是网络号(常规情况), 最后一段是主机号】 000.000.000.000 --255.255.255.255
2. ip数据包 【以太帧head [ip head | date] 】
3.子网掩码 :用于标示IP中哪些是网络号,哪些是言主机号
255.255.255.0
11111111.11111111.11111111.00000000
1表示网络号 0标示主机号
将IP转为二进制,子网掩码转为二进制
使用AND来计算两个IP是否处于同一局域网
11011111.00001111.10101010.00001
11111111.11111111.11111111.0000000
结果: 11011111.00001111.10101010.00000
例如2号ip 转换的结果如下
11011111.00001111.10101010.00010
11111111.11111111.11111111.0000000
结果: 11011111.00001111.10101010.00000
4.ARP Address Resolution Protocol
该协议用于将IP转为MAC地址
1.先比对子网掩码 判断两个IP是否处于同一子网中
2.1如果是 则直接在当前局域网中进行广播
2.2如果不是同一局域网,则将数据包发送对方的网关
2.3对方网关收到数据包后回复自己的MAC地址
2.4发送的交换机收到数据包在发送给 发送者同时存储对方网关与MAC的对应关系
2.5 发送已经明确对方网关的MAC以及对方的IP
3. 发送数据 【我的MAC 对方网关的MAC【我的IP 对方的IP】】
5. 路由协议:找到一条最佳的路径
到此可以使用IP来定位到全球的某一个明着说网中的某一台计算机
传输层
1.端口号:每个应用程序都必须绑定一个端口号,用于标识你是谁,是QQ,还是Pycharm
端口号不能重复,为一个整形数字 取值范围 0-65535 0-1023为系统保留
3. 传输层主要的传输协议
TCP【传输控制协议】--可靠协议:三次握手建立链接,其目的是为了确认传输路径可用
传输过程中 每一个数据包都需要确认信息
四次挥手断开链接 是为了保障双方数据都已经传输完毕
传输效率较低
UDP 【用户数据报协议】不关心数据是否传输成功,甚至不关心是否存在,传输效率高
应用层: 数据已经通过下面这种协议传入应用程序
应用程序可以自己定义自己的协议,只要客户端程序与服务端程序能看懂就行:如 HTTP/HTTPS SMTP FTP
今日内容 socket 【套接字】
socket: 一套编程接口,内部封装了一堆底层协议,隐藏了内部复杂的实现细节,提供了简单的使用接口---- 即一个位于TCP/UDP间的接口模块
socket的发展史:
最开始socket使用来完成进程间通讯的,并不是用来网络通讯,那时候还没有网络
后来有了网络之后 .基于之前的socket来进行了更新 使其可以支持网络通讯
所以socket分为两种类型
AF_UNIX : 进程间通讯
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.bind(('127.0.0.1', 9000))
phone.listen()
count = 1
while True:
print('第%s个客户来了'% count)
client, addr = phone.accept()
while True:
try:
date = client.recv(1024)
if not date:
print('windows 中的第%s个客户正常退出或收到linux 中的空值'% count)
client.close()
count +=1
break
client.send(date.upper())
except ConnectionResetError as e:
client.close()
print('第%s个客户非正常断开' % count)
count += 1
break
服务端:
import socket
phone1 = socket.socket()
phone1.connect(('127.0.0.1', 9000))
while True:
cmd = input('cmd:').strip()
if cmd == 'q':break
if not cmd:continue
phone1.send(cmd.encode('utf-8'))
date = phone1.recv(1024)
print(date)
phone1.close()