python3网络编程01

网络编程
网络目的 : 数据传输
ISO(国际标准化组织)
OSI七层模型 ----》 网络通信的标准化流程
应用层 : 提供用户服务, 具体的内容由特定的程序规定
表示层 : 提供数据的加密和压缩优化
会话层 : 确定建立应用级的连接,选择传输服务
传输层 : 提供不同的数据传输服务,进行流量控制
网络层 : 路由选择,网络互联
链路层 : 提供链路交换,具体消息的发送
物理层 : 物理硬件,接口,网卡的规定

四层模型

应用层
传输层
网络层
物理链路层

五层模型(TCP/IP模型)

应用层 (应用层 表示层 会话层)
传输层
网络层
链路层
物理层

OSI模型优点 : 将功能分开,降低网络传输中的耦合度。使开发流程更加清晰,每部分各司其职

高内聚 : 每个模块功能尽量单一,不会多个功能掺杂
低耦合 : 尽量降低每个模块之间的关联性

要求 : 能够顺序说出七层模型 五层模型
知道每一层干什么事情
理解消息传输流程
数据传输流程
1 发送端由应用层到物理层逐级添加信息头(首部),最终在物理层发送
2中间经过节点(交换机,路由器)转发发送到接收端
3 在接受端根据发送端的每个信息头进行解析,最终消息到应用层展示给用户

网络协议:在网络通信中协议各方必须遵守的规定。如建立什么连接,消息结构如何解析等

应用层 : TFTP HTTP DNS SMTP
传输层 : TCP UDP
网络层 : IP
物理层 : IEEE

网络相关概念

网络主机 : 在网络上确定一台主机 Host
本地使用 : ‘localhost’ 127.0.0.1
网络地址 : ‘0.0.0.0’ ‘172.60.50.54’ (本机网络IP)
查看本机IP地址:ifconfig (linux)
ipconfig (windows)

ipython3 进入交互模式

通过计算机名获取匹配的IP
In [5]: socket.gethostbyname(‘tedu’)
Out[5]: ‘127.0.1.1’

In [6]: socket.gethostbyname(‘localhost’)
Out[6]: ‘127.0.0.1’

获取本机的计算机名
In [7]: socket.gethostname()
Out[7]: ‘tedu’

IP地址
网络上确定一台主机的地址
IPv4: 点分十进制 比如 192.168.1.3 0–255
IPv6 128位

网络连接测试
ping 172.60.50.180

特殊IP
127.0.0.1 本地测试IP
0.0.0.0 自动使用本地可用网卡IP
192.168.1.0 代表当前网段
192.168.1.1 通常为网关地址
192.168.1.255 广播地址

通过地址获取主机网络信息
In [2]: socket.gethostbyaddr(‘www.baidu.com’)
Out[2]: (‘127.0.0.1’, [], [‘119.75.213.61’])
主机 别名 IP地址

IP地址转换为十六进制表达
In [4]: socket.inet_aton(‘192.168.1.2’)
Out[4]: b’\xc0\xa8\x01\x02’

In [5]: socket.inet_ntoa( b’\xc0\xa8\x01\x02’)
Out[5]: ‘192.168.1.2’
域名:网络服务器地址在网络上的名称
端口号: 端口号是网络地址的一部分,用于区分一个网络主机上的网络应用
*在一个系统中每个网络应用监听不同的端口,以获取对应端口传递的信息
取值范围 : 1----65535
1-255 一些通用端口 (众所周知的程序占用)
256 --1023 系统端口
1024 – 65535 自用端口 >10000
获取应用程序端口
In [2]: socket.getservbyname(‘mysql’)
Out[2]: 3306
网络字节序:数据在网络中的传输格式
传输层服务
面向连接的传输服务
基于tcp协议的数据传输
传输特征:可靠的数据传输
可靠性 : 数据在传输中,无失序 无差错 无丢失 无重复
实现手段:在数据传输前和传输结束后需要建立连接和断开连接
三次握手 : 在面向连接的传输服务中建立连接的过程

  1. 客户端向服务器发送连接请求
  2. 服务器接受到请求进行确认,返回确认报文
  3. 客户端收到服务器回复最终确认连接
    四次挥手 : 在面向连接的传输服务站断开连接的过程
  4. 主动方发送报文,告知被动方要断开连接
  5. 被动方回复报文,表示已经接收到请求,准备断开
  6. 被动方再次发送报文,表示准备处理就绪,可以断开
  7. 主动发发送确认报文,断开连接
    应用情况 : 适用于传输较大的内容或文件,网络良好,需要保证传输可靠性的情况
    e.g. 聊天信息 文件的上传下载, 邮件处理
    网页获取
    面向无连接的传输服务----udp协议
    传输特点:
    不保证传输的可靠性
    没有连接和断开的过程
    数据的收发比较自由
    适用情况 : 网络情况可能产生丢包,对传输可靠性要求低
    e.g. : 网络视频, 群聊,广播等
    要求:
  8. 理解三次握手和四次挥手,能够描述过程
  9. 知道tcp传输和udp传输的区别
    3,七层模型osi

socket 套接字编程
目的 : 通过编程语言提供的套接字编程接口,可以更简单的完成基于tcp和udp的编程
套接字 : 完成上述目标的一种编程手段
套接字类别
流式套接字(SOCK_STREAM):传输层基于tcp的协议通信
面向连接可靠的传输 tcp的传输 流式套接字
数据报套接字(SOCK_DGRAM): 传输层基于udp协议传输
面向无连接不可靠的传输 udp的传输 数据报套接字
底层套接字 (SOCK_RAM): 访问底层协议套接字
TCP的服务端
import socket

  1. 创建套接字
    socket.socket(sock_family = AF_INET,
    sock_type = SOCK_STREAM,
    proto = 0)
    功能 : 创建套接字
    参数 : sock_family 地址族类型 AF_INET ipv4网络通信
    sock_type 套接字类型 SOCK_STREAM 流式
    SOCK_DGRAM 数据报
    proto 通常为0 选定子协议类型
    返回值 :返回套接字对象
  2. 绑定地址
    sockfd.bind(addr)
    功能 : 绑定地址
    参数 : addr —》 元组 (ip,port) (‘0.0.0.0’,1234)
  3. 设置监听套接字
    sockfd.listen(n)
    功能: 将套接字设置为监听套接字,创建监听队列
    参数: 监听队列大小
  • 一个监听套接字可以连接多个客户端
  1. 等待接受客户端连接
    connfd,addr = sockfd.accept()
    功能 : 阻塞等待处理客户端连接
    返回值 : connfd 新的套接字,用于和客户端通信
    addr 连接的客户端的地址 (ip,port)
  • 阻塞函数 : 当程序运行到阻塞函数位置,如果某种条件没有达成则暂停程序运行,知道条件达成结束阻塞
  1. 消息的收发
    data = connfd.recv(buffersize)
    功能 : 接受消息
    参数 : 一次接受消息的大小字节
    返回值 : 返回接受到的内容
    n = connfd.send(data)
    功能 : 发送消息给对应客户端
    参数 : 要发送的内容,(bytes格式)
    返回值 : 返回实际发送的字节数
  2. 关闭套接字
    sockfd.close()
  • telnet ip port
    客户端
  1. 创建套接字 (和服务端套接字类型相同)
  2. 发起连接
    connect(addr)
    功能 : 向服务端发起连接
    参数 : 服务端地址 元组
  3. 消息收发
  4. 关闭套接字
    ocket函数 描述
    服务端socket函数
    s.bind(address) 将套接字绑定到地址, 在AF_INET下,以元组(host,port)的形式表示地址.
    s.listen(backlog) 开始监听TCP传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
    s.accept() 接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
    客户端socket函数
    s.connect(address) 连接到address处的套接字。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
    s.connect_ex(adddress) 功能与connect(address)相同,但是成功返回0,失败返回errno的值。
    公共socket函数
    s.recv(bufsize[,flag]) 接受TCP套接字的数据。数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
    s.send(string[,flag]) 发送TCP数据。将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
    s.sendall(string[,flag]) 完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
    s.recvfrom(bufsize[.flag]) 接受UDP套接字的数据。与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
    s.sendto(string[,flag],address) 发送UDP数据。将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。
    s.close() 关闭套接字。
    s.getpeername() 返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
    s.getsockname() 返回套接字自己的地址。通常是一个元组(ipaddr,port)
    s.setsockopt(level,optname,value) 设置给定套接字选项的值。
    s.getsockopt(level,optname[.buflen]) 返回套接字选项的值。
    s.settimeout(timeout) 设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect())
    s.gettimeout() 返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None。
    s.fileno() 返回套接字的文件描述符。
    s.setblocking(flag) 如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。
    s.makefile() 创建一个与该套接字相关连的文件

猜你喜欢

转载自blog.csdn.net/qq_34237321/article/details/84110389
今日推荐