PythonNet(一)
一、网络编程
1、网络功能:数据传输
2、ISO(国际标准化组织)
3、OSI七层模型 ——>网络通信工作流程的标准化
应用层:提供用户服务,具体功能由特定的程序而定
表示层:数据的压缩优化,加密
会话层:建立应用级的连接,选择传输服务
传输层:提供不同的传输服务,流量控制
网络层:路由选择,网络互连
链路层:进行数据转换,具体消息的发送,链路连接
物理层:物理硬件,接口设定,网卡路由交换机等
1、cookie(扩展):
高内聚:模块功能尽可能单一,不要掺杂
低耦合:模块之间尽可能减少关联和影响
2、OSI七层模型优点:
1、将工作流程标准化
2、降低了模块间的耦合度,使每一部分可以单独开发,单独工作。
4、四层模型
应用型:应用层-表示层-会话层
传输层 网络层 物理链路层
5、五层模型(IPC/IP模型)
应用型:应用层-表示层-会话层
传输层 网络层 链路层 物理层
6、数据传输流程:
1、发送端由信息层到物理层逐层添加信息头部(首部),最终在物理层发送。
2、中间经过节点(交换机,路由器)转发,发送到接收端。
3、在接收端根据发送端的每个信息头进行解析,最终在应用层展示给用户。
7、网络协议:
在网络通信中协议各方必须遵守的规定。包括建立什么样的网络结构,消息结构,表示代表什么等。
1、应用层 : TFTP HTTP DNS SMTP
2、传输层 : TCP UDP
3、网络层 : IP
4、物理层 : IEEE
2、网络相关概念
1、网络主机:在网络中标识一台计算机 HOST
1、本地使用:'localhost' 或 '127.0.0.1'
2、网络使用:'0.0.0.0' Linux查询IP: ifconfig Windows下查询IP: ipconfig
如: '192.168.207.129'
3、ifconfig : 查看IP信息
2、获取计算机名
ipython3
import socket
socket.gethostname()
通过计算机名获取地址
socket.gethostbyname("")
如: ipython3
In [1]: import socket
In [2]: socket.gethostname()
Out[2]: 'tedu'
In [3]: socket.gethostbyname("tedu")
Out[3]: '127.0.1.1'
3、IP地址
1、网络上确定一台主机网络位置的地址
IPv4: 点分十进制 比如 192.168.1.2 0--255 (32位)
IPv6: 128位
2、ping ip:测试和某台网络主机是否联通
4、特殊IP地址
127.0.0.1 本地测试IP
0.0.0.0 自动使用本地可用网卡IP
192.168.1.0 代表当前网段IP
192.168.1.1 通常为网关IP
192.168.1.255 广播地址
5、通过地址获取主机网络信息
In [2]: socket.gethostbyaddr('www.baidu.com')
Out[2]: ('127.0.0.1', [], ['119.75.213.61'])
主机 别名 IP地址
1、点分十进制地址转换为二进制
In : socket.inet_aton('192.168.1.2')
Out: b'\xc0\xa8\x01\x02'
2、二进制地址转换为点分十进制
In : socket.inet_ntoa(b'\xc0\xa8\x01\x02')
Out: '192.168.1.2'
6、域名:网络服务器地址的名称
1、方便记忆
2、名称表达一定的含义
7、网络端口号
端口号是网络地址的一部分,用去区分一个网络主机上的网络应用
* 注意:在一个操作系统中不同的网络应用监听不同的端口号,以获取对应端口传递的信息
1、取值范围:1----65535
1--255 一些众所周知的通用端口,程序占用
256 --1023 系统应用端口
1024 -- 65535 自用端口 建议使用>10000
2、获取一个应用的端口信息
In [12] : socket.getservbyname("mysql")
Out[12]: 3306
3、网络字节序:数据在网络中的传输格式
三、传输层服务:
1、面向连接的传输服务
1、基于tcp协议的数据传输
2、传输特征:提供可靠的数据传输,可靠性指数据传输过程中无丢失,无失序,无差错,无重复。
3、实现手段:数据传输断开前都需要进行传输和断开的确认
4、三次握手:tcp传输在数据前建立连接的过程
1、客户端向服务器发送连接请求
2、服务器接受到请求后,回复确认消息,表示允许连接
3、客户端收到服务器回复,进行最终标志发送确认连接
5、四次挥手:tcp传输在连接断开前进行断开确认的过程
1、主动方发送报文,告知被动方要断开连接
2、被动方收到请求后立即返回报文,告知已经准备断开
3、被动方准备就绪后,再次发送报文,告知可以断开
4、主动发发送消息,确认最终离开
6、应用情况:适用于传输较大的文件,网络情况良好,需要保证传输可靠行的情况。
比如:网页的获取,文件的下载,邮件的传输,登录注册
2、面向无连接的传输服务
1、基于udp协议的数据传输
2、传输特点:不保证传输的可靠性,传输过程没有连接和断开的过程,数据的收发比较自由。
3、使用情况:网络情况较差,对传输可靠性要求不高,需要提升传输效率。不便连接,需要灵活收发消息。
比如:网络视频, 群聊,广播发送等
四、socket 套接字编程
1、目标:根据socket模块提供的接口函数,进行组合使用完成基于tcp或者udp的网络编程。
2、套接字(socket):完成上述目标的一种编程手段,编程方案
3、套接字分类:
1、流式套接字(SOCK_STREAM):传输层基于tcp协议的套接字编程方案。
2、数据报套接字(SOCK_DGRAM):传输层基于udp协议的套接字编程方案。
3、底层套接字 (SOCK_RAM): 访问底层协议的套接字编程。
* 面向连接的传输——tcp协议——可靠的——流式套接字
* 面向无连接传输——udp协议——不可靠—— 数据报套接字
五、tcp(流式)套接字服务端编程
import socket
1、创建套接字
sockfd = socket.socket(socket_family = AF_INET,socket_type = SOCK_STREAM,proto = 0)
功能:创建套接字
参数:socket_family:选择地址族类型 AF_INET
socket_type:套接字类型 SOCK_STREAM 流式
SOCK_DGRAM 数据报
proto:选择子协议类型 通常为0
返回值:返回套接字对象
2、绑定服务端地址
sockfd.bind(addr)
功能:绑定IP地址
参数:元组 (ip,port) port为端口
localhost 可以被本机用 127.0.0.1
127.0.0.1 同上
192.168.205.127(本机) 可以被所有人用192.168.205.127访问
0.0.0.0 可以被别人用192.168.205.127访问, 也可以被自己用127.0.0.1访问
3、设置监听套接字
sockfd.listen(n)
功能:将套接字设置为监听套接字,创建监听队列
参数:n 表示监听队列大小(等待处理的进入连接的个数)
* 一个监听套接字可以连接多个客户端套接字
4、等待处理客户端连接请求
conndf,addr = sockfd.accept()
功能:connfd 客户端连接套接字
addr 连接客户端地址
* 阻塞函数:程序运行过程中遇到阻塞函数则暂停运行,直到某种阻塞条件达成再继续运行。
5、消息收发
1、connfd.recv(buffersize)
功能:接收对应客户端消息
参数:一次最多接收多少字节
返回值:接收的内容
* 如果没有消息则会阻塞
* decode()字节转字符串,encode()字符串转字节
2、n = connfd.send(data)
功能 : 发送消息给对应客户端
参数 : 要发送的内容 ,必须是bytes格式
返回值 : 返回实际发送消息的大小(字节数)
6、关闭套接字
sockfd.close()
功能 :关闭套接字
六、tcp(流式)客户端
1、创建套接字
* 必须相同类型的套接字才能通信,sockfd = socket.socket()默认为流式tcp套接字
2、连接建立
sockfd.connect(servr_addr)
功能 : 建立连接
参数 : 元组, 服务端地址
3、消息收发
*消息收发要和服务端配合,避免两边都出现recv阻塞(服务器先收后发,客户端先发后收)。recv中只有数据,recvfrom中有数据和谁发过来的信息。
decode() 字节 –> 字符串,encode() 字符串 –> 字节。
recv解阻塞2种方式:1、客户端发过来数据,2、客户端调用close,导致recv解阻塞。
4、 关闭套接字
sockfd.close()
要求:(要求都重点,面试问题)
1、osi七层模型介绍一下,tcp/ip 模型呢?
2、tcp服务和udp服务有什么区别
3、三次握手和四次挥手是什么意思,过程是怎样的
七、tcp传输注意事项
1、tcp套接字传输注意事项
1、监听套接字存在客户端即可发起连接,但是最终连接的处理需要accept进行处理
2、如果连接的另外一端退出,则revc会立即返回空字符串
3、当连接的另一端退出时,在试图send发送就会产生BrokenPipeError异常。
2、网络收发缓存区
缓冲区作用:协调收发(处理)速度,减少交互次数
send和recv实际上是缓冲区进行交互,发送缓冲期满时就无法发送,接受缓冲区满时recv才阻塞
3、TCP粘包
1、产生原因: tcp套接字以字节流方式传输,消息之间没有边界,发送和接收并不能保证每次发送都及时的被接受
2、影响:如果每次发送内容表达一个独立的含义,此时可能需要处理粘包防止发生歧义
3、处理方法:
1、每次发送的消息添加结尾标志(人为增加消息边界)
2、发送数据结构体
3、协调收发速度,每次发送后都预留接收时间
总结:
1. osi七层模型是什么?
2. 三次握手和四次挥手?
3. tcp和udp区别
网络概念 : 主机 端口 IP 域名
套接字 : 网络编程方式
流式套接字: tcp
数据报套接字:udp
tcp服务端流程:
socket() ---> bind() ---> listen() ---> accept()--->
recv/send ---> close()
客户端
socket() ---> connect() ---> send/recv --->close()
posted on 2018-10-11 19:28 破天荒的谎言、谈敷衍 阅读(455) 评论(0) 收藏 举报
浙公网安备 33010602011771号