一 五层协议详解:
物理层 电信号:01010101101 a - 97
数据链路层 对电信号 分组 使数字有意义 分组协议 = Ethernet协议 = 以太网协议 -> 网卡 mac地址(唯一的) mac(同一个子网)
head(18字节 = 6 源地址(mac) 6 目标地址(mac) 6 数据的描述) + data mac_head + ip_head + data
以太网的工作模式: 广播 --> 以太网基于mac地址的广播的方式来完成数据的传递 --> 只能在局域网完成 局域网才能找对对方
ARP 协议 把ip地址解析成mac地址
网络层: IPv4 IPv6 head(IP头 源地址+目的地址) + data iphead+data ip(哪一个子网) iphead + heac(tcp/udp) + data
ip + mac 就能找到全世界中唯一的计算机 ip->找到哪一个子网 mac->找到具体哪一台机器
传输层 tcp + udp 格式: head(tcp/udp) + data tcp/udp 基于端口工作的 端口:0 - 65535 一个软件一个端口 0-1024给操作系统使用的
ip+端口 就能找到全世界范围内的唯一一个软件 head(tcp) + head(应用头) + data
服务端最好一直对外提供 服务端的端口和ip要捆绑固定 不能随便变 客户端的端口可随便变
应用层 暴风 qq ... 软件 格式: head(应用头)+data 应用协议:http/ftp..
五层串起来:--->: 应用层产生数据head(固定长度)+data -> 传输层 -> 网络层 - > 数据链路层 -> 物理层
总结:用快递来说明这个列子 一个产品就是物理层, 快递单就是圆通还是中通,也就是tcp和udp协议 发快递必须有快递单 ip头,自己地址和对方地址就是data数据
地区分为上海。。。那就是以太网报头 规定是18个字节,包裹数据就是data数据,物理层就是快递设备
二 传输层详解:
tcp:流式协议: 像流水一样 发数据 管道数据 双向管道 c ----> s c <----- s 没有数据前 ,先建立管道
挖管道:
1. client 发个请求数据包 创建一条管道数据 # tcp = 1
2.server 回应了,也要创建一条数据管道 确认+请求
3.client 回应了,可以 # c ----- s s ------- c 三次握手
tcp: 是可靠传输 s 得到包之后回应收到 c 确认没有收到 就在传一遍 所以叫可靠传输
upd: client 一直发数据,不需要对方回应,不管出现什么情况,都一直发,所以不可靠
总结: tpc 效率低,但是可靠
upd 效率高,但是不可靠 不需要管道, 不需要等待对方回应 64k
三 什么是socket
socket 是什么?
socket 理解就是ip+端口
套接字2种:
1. 基于文件套接字 AF_UNIX
2. 基于网络套接字 AF_INET
套接字流程:
四 基于socket实现简单套接字通信
1.服务端.py
1 import socket 2 3 # 1.买手机 4 # socket.AF_INET 基于网络通信 socket.SOCK_STREAM 基于tcp协议 5 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 6 # print(phone) 7 # 2.绑定手机卡 8 phone.bind(("127.0.0.1", 8081)) # 0-1024给系统使用的 9 10 # 3.开机 11 phone.listen(5) # 监听系统最大链接数为5 12 13 # 4.等电话链接 14 # res = phone.accept() 15 conn, clinet_addr = phone.accept() 16 17 # 5.收发消息 18 data = conn.recv(1024) # bytes 2.1024代表最大接受1024个bytes 19 print("客户端的数据", data) 20 21 conn.send(data.upper()) 22 23 # 6.挂电话 24 conn.close()
2.客户端.py
import socket # 1.买手机 # socket.AF_INET 基于网络通信 socket.SOCK_STREAM 基于tcp协议 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # print(phone) # 2.拨号 phone.connect(("127.0.0.1", 8081)) # 发,收消息 phone.send("hello".encode("utf-8")) data = phone.recv(1024) print("客户端收到服务端的数据:", data) # 关闭 phone.close()
5.在简单的套接字基础上加上通信循环
客户端:
# 发,收消息 while True: msg = input(">>:").strip() phone.send(msg.encode("utf-8")) data = phone.recv(1024) print("客户端收到服务端的数据:", data)
服务端:
# 5.收发消息 while True: data = conn.recv(1024) # bytes 2.1024代表最大接受1024个bytes print("客户端的数据", data) conn.send(data.upper())