1946 冯诺.依曼
网络的目的:数据的传输
iso(国际标准化组织)
osi七层模型 网络通信的标准化流程
应用层-表示层-会话层-传输层-网络层-链路层-物理层
工作模式 模式 每一层大概做什么的
应用层:提供用户服务,具体的内容由特定的程序规定,纯面向用户,手机上的软件是应用层qq wechat (提供交流的工具)
表示层:提供数据的加密和压缩优化(hello world - 加密 hello world)
会话层:确定建立应用连接,选择传输服务(确定对方是否有软件并开启)
传输层:提供数据传输服务,进行流量控制(根据应用层选择合适的传输服务)
网络层:路由选择,网络互联(从一台电脑发送消息对方怎样接受 ip)
链路层:提供链路交换,具体消息的发送(转化成高低电平信号,转换成可以向物理层传输的信号)
物理层:物理硬件,接口,网卡的规定
应表会传网链物
7层逐渐演变为5层模型(tcp/ip模型)
4层模型:应用层 传输层 网络层 物理链路层
5层模型:应用层 传输层 网络层 链路层 物理层
osi模型优点:将功能分开,降低网络传输中的耦合度。使开发流程更加清晰,每部分各司其职。
高内聚低耦合
高内聚:每个模块功能尽量单一,不会多个功能掺杂(便于调用)
低耦合:尽量降低每个模块的关联性
接口化开发
要求:能够顺序说出七层模型 五层模型 知道每一层干什么事情,理解消息传输流程
网络协议:在网络通信中各方必须遵守的规定 如建立什么连接,消息结构如何解析
协议:指导每一层该怎么干 干什么
实际编程就是按照协议去做
应用层:TFTP HTTP DNS SMTP
传输层:TCP UDP
网络层:IP
物理层:IEEE
网络相关概念
网络主机:在网络上确定一台主机(可以在网络上进行传输)
本地使用:'localhost' 127.0.0.1 只能在当前计算机上操作
网络地址:'0.0.0.0' '172.60.50.54'(本地网络IP)
ipython3 进入交互模式
import socket
socket.gethostname() 获取本机的计算机名
socket.gethostbyname('tedu') 获取本机的IP 以127开头的都是本地ip
IP地址:网络上确定一台主句的地址
IPv4:点分十进制 比如192.168.1.3 0--255 32位
IPv6:128位
供应商提供的IP 公网
网络连接测试
ping 172.60.50.180
特殊IP
127.0.0.1 本地测试IP
0.0.0.0 自动使用本地可用网卡IP
192.168.1.0 代表当前网段 192.168.1当前网段 0代表具体哪一台机子
192.168.1.1 通常为网关地址
192.168.1.255 广播地址
socket.gethostbyaddr('localhost')
('localhost', [], ['127.0.0.1'])
第一个:访问的主机
第二个:访问的主机的别名
第三个:访问的主机IP地址
socket.inet_aton('192.168.1.2')
b'\xc0\xa8\x01\x02'
socket.inet_ntoa(b'\xc0\xa8\x01\x02'')
'192.168.1.2'
域名:网络服务器的地址在网络上的名称(也可以通过IP访问)
访问网站实际是访问主机的IP
DNS 把输入的网站(www.baidu.com)解析为IP
端口号:端口号是地址的一部分,在一个系统中每个网络应用监听不同的端口,以获取对应端口传递的信息 区分主机中的应用
取值范围:1-65535
1-255 一些通用端口(众所周知的程序占用)
256-1023 系统端口
1024-65535 自用端口 >10000
如何获取应用程序的端口
socket.getservbyname('mysql')
3306
传输层服务:面向连接的传输服务,面向无连接的传输服务
面向连接的传输服务:tcp协议
传输特征:提供可靠的数据传输
可靠性:数据在传输中,无失序 无差错 无丢失 无重复
内容不会出现偏差
内容不会重复传输
为保证可靠性:在数据传输前和传输结束后需要建立连接和断开连接
建立连接(三次握手):在面向连接的传输服务中建立连接的过程
1.客户端向服务端发送连接请求
2.服务器接受到请求进行确认,返回确认报文
3.客户端收到服务器回复最终确认连接
断开连接(四次挥手):在面向连接的传输服务中断开连接的过程
1.主动方发送报文,告知被动方要断开连接
2.被动方发回复报文,表示已经接收到请求,准备断开
3.被动方再次发送报文,表示准备处理就绪,可以断开
4.主动方发送确认报文,断开连接
应用情况:适用于传输较大的内容或文件,网络良好,需要保证传输可靠性的情况
eg: 聊天信息 文件的上传下载 邮件处理 网页获取
无连接的传输服务(udp协议)
传输特点:
不保证传输的可靠性
没有连接和断开的过程
数据的首发比较自由
应用情况:网络情况肯能产生丢包,对传输可靠性要求低
eg:网络视频 群聊 广播
要求:
1.要理解三次握手和四次挥手,能够描述过程
2.知道tcp和udp传输的区别
socket套接字编程
目的:通过编程语言提供的套接字编程接口,可以更简单的完成基于tcp和udp的编程
套接字:完成上述目标的一种编程手段
套接字种类:
流式套接字(sock_stream):传输层基于tcp的协议通信
面向连接的可靠传输 tcp传输
字 这三者应绑定在一起记忆
数据报套接字(sock_dgram):传输层基于udp协议传输
面向无连接的不可靠传输 udp传输 数据报套接字 这三者应绑定在一起记忆
底层套接字(sock_ram):访问底层协议套接字
#系统分层:纯硬件 汇编语言 系统层 驱动开发 应用层开发
tcp的服务端编程
sockfd=socket.socket()(sock_family=af_inet,sock_type=sock_stream,proto=0)
函数的分析:功能 参数 返回值
功能:创建套接字对象
参数:sock_family=af_inet,sock_type=sock_stream,proto=0
返回值:返回套接字对象
af_inet(地址族,确定网络通信方式) ipv4的类型(最常用)
sock_type(套接字类型) sock_stream sock_dgram
proto 通常为0(表示选定子协议类型)(应用层没有子协议)
绑定地址
sockfd.bind(addr)
功能:绑定地址
参数:addr=元组(ip,port) ('192.168.1.2',3306) 一定是一个二元元组
设置监听套接字
sockfd.listen(n)
功能:将套接字设置为监听套接字,创建监听队列(相当于设置器属性,方便连接客户端)
参数:监听队列大小,n为整数
*一个监听套接字可以连接多个客户端
等待客户端连接
connfd,addr=sockfd.accept() 每一个客户端进来都会创建一个新的套接字
功能:阻塞等待处理客户端连接
返回值:
connfd(新的套接字,用于和客户端通信)
addr(连接的客户端的地址)(ip,port)
*阻塞函数:当程序运行到阻塞函数位置,如果某种条件没有达成则暂停程序运行,知道条件达成结束阻塞 eg:input sleep
消息的收发
data=connfd.recv(buddersize)
功能:接受消息
参数:一次接受消息的大小 字节
返回值:返回接受到的内容
n=confd.send(data)
功能:发送消息
参数:要发送的内容(bytes格式)
返回值:返回实际发送的字节数
关闭套接字
sockfd.close() 防止误操作 节省空间
telnet 127.0.0.1 8888
0.0.0.0
127.0.0.1
172.
客服端(需保持与服务端相同的套接字类型)
1.创建套接字(和服务端套接字类型相同)
2.发起连接
connect(addr)
功能:向服务端发起连接
参数:服务端地址(元组)
3.消息收发(一边收一边发,不能都收)
4.关闭套接字