python3 网络编程

注:网络编程并非是python独有的

一、网络编程

    1.网络的功能:数据的传输

    2.iso:国际标准化组织,非盈利公益机构,制定了osi七层模型

        作用:使网络通信工作流程标准化。


        osi七层模型:

        应用层:提供用户服务,具体功能由应用程序实现。一般用python写的小程序都是应用层程序,在主板上的叫罗版开发,在主板之上的叫操作系统开发,操作系统之上的就是操作驱动开发,操作系统之上的是应用开发。

        表示层:数据的压缩、优化、加密。比如QQ发消息,一般是发送一个包,里面包含你的头像、昵称、发送的信息、时间等等,且一般发送的包一般会有加密来保证安全。

        会话层:建立用户级的连接,选择适当的传输服务。(应用于应用之间的连接)应对不同的传输需求来选择不同的传输服务。

        传输层:提供传输服务。UDP和TCP。

        网络层:做路由选择,网络互联。路由选择:网络消息传输需要有一定的介质,比如无线、有线网线,消息传输出去需要经过一个个的路由节点,主要是选择路由节点路径。比如现在发消息会从网卡发送出来经过本地的路由网关,然后再经过一个个路由节点送到目标主机上。

        链路层:进行数据交换,控制具体数据的发送。所有的数据都要转换为01二进制发送,这就是链路层的作用,发送时是以数据帧为单位。

        物理层:提供数据传输的硬件保证,如网卡、接口、传输介质。

        作为python工程师一般是涉及使用前四层即应用层、表示层、会话层、传输层。网络运维工程师会涉及到网络层、链路层。
        对外的网络传输都在用这个七层模型,但是对内网络,有些公司可能会制定自己的网络模型。

        优点:
        1.建立了统一的工作流程
        2.分部清晰,各司其职,每个步骤分工明确。
        3.降低了各个模块之间的耦合度,便于开发。编程讲究高内聚,低耦合。

        注:
        高内聚:功能的单一性,即模块的功能尽可能单一,不相互掺杂。
        低耦合:模块之间尽可能少的相互影响,好处:修改一个模块时不需要再修改其他模块。
        封装:将一个功能的代码封装为一个模块,提高代码的复用性。

        TCP/IP四层模型:

        实际工作当中是简化为四层模型,即TCP/IP四层模型,五层模型是将物理链路层分为物理层和链路层两部分。
        背景:实际工作中工程师无法按照七层模型要求操作,逐渐演化为更符合实际情况的四层模型

        应用层:集中了应用、表示、会话的功能。

        传输层:

        网络层:

        物理链路层:因为链路层依托于(离不开)硬件设备,于是就合并了。

        我们写的程序主要是应用层、传输层主要是操作系统,网络层和物理链路层有相应的网络工程师负责。

    3.数据传输过程
        应用层发送信息并添加一个应用层首部信息打包,然后发送给传输层;传输层会将这个消息添加传输层头部信息,然后传给网络层;网络层将接受到信息添加一个头部信息,然后发送给物理链路层;物理链路层接受后会添加一个包含IP之类的头部信息并打包;物理链路层发送这个信息给路由器,然后通过层层的交换机路由器节点,每个节点读取头部信息来确定下一个节点,最后到目标主机;目标主机接收到后,会根据物理链路层、网络层、传输层、应用层顺序进行层层解包,获得传输的信息。
        传输过程中节点越少,包头部信息解析的越少,传输的也就越快。

        【1】发送端由应用程序发送消息,逐层添加首部信息,最终在物理层发送消息包。
        【2】发送的消息经过多个节点(交换机,路由器)传输,最终到达目标主机。
        【3】目标主机由物理层逐层解析首部消息包,最终到应用程序呈现消息。

    4.网络协议
        网络协议:在网络数据传输过程中,双方或大家都遵守的一个规定,包括建立什么样的数据结构,什么样的特殊标志等。
        每一层都有自己的协议(除了表示层和会话层),每一层的首部信息都是由协议来规定的。

                                 TCP/IP协议族                    
        应用层                   TFTP  HTTP  SNMP(自检协议)  FTP  SMTP  DNS(域名解析) ftp  Telnet  
        传输层                   TCP  UDP
        网络层                   IP ICMP RIP OSPF BGP

    5.网络概念

        【1】网络主机(host)

            功能:标识一台主机在网络中的位置(地址)。

            主机本地地址:'localhost'或'127.0.0.1'

            主机网络地址:linux使用ifconfig查看主机网络地址(inet地址),windows使用ipconfig来查看主机网络地址(以太网适配地址/无线地址),这个是路由器分配的,百度IP显示的是由运营商分配的。

            自动获取地址:'0.0.0.0'自动匹配当前主机合适的网卡地址,比如同一台主机上有AB两个程序,B的地址为0.0.0.0,A可以用本地主机地址或外网地址访问B,其他主机也可以通过外网访问,根据不同的访问地址进行自动更改。
        

        【2】IP地址
        
            功能:确定一台主机的网络路由位置。

            IP唯一:公网IP唯一,一个局域网内IP不重复,各个局域网都有上一级网段,根据上一级网段IP和局域网IP寻找目标主机。

            结构:
            IPV4 点分十进制表示 用三个.将IP地址分为四个部分,每个点取值范围是0-255,一个IPV4地址占32位,总共有2的32次方个IP地址储量。
            IPV6 占128位,以十六进制来表示

            特殊IP:
            127.0.0.1       本机测试IP
            0.0.0.0         自动获取本机网卡地址
            xxx.xxx.xxx.0     通常表示一个网段(同一个局域网内表示一个网段)
            xxx.xxx.xxx.1     通常表示一个网关(网关一个局域网内交换机的地址)
            xxx.xxx.xxx.255   通常用作广播地址 


        【3】域名:

            定义:给网络服务器地址起的名字

            作用:方便记忆,表达一定的含义

            * ping [ip]:测试和某个主机是否联通

            DNS:是个应用层协议,虽然是通过域名访问服务器,实际上域名需要先转换成地址,这个其实在应用层就完成了,每一台主机都会有一个DNS地址,然后访问DNS服务器,DNS会将域名和IP先注册相对应,然后返回相应的内容
    

        【4】端口号(port):
            
            作用:端口是网络地址的一部分,用于区分主机上不同的网络应用程序。每个应用程序会监听一个端口,来进行数据的接受。

            特点:一个系统中的应用监听端口不能重复。
            
            取值范围:1 —— 65535
                     1 —— 1023 一般是系统应用或者大众程序监听端口
                     1024 —— 65535 自用端口,建议使用一万以上的端口

二、传输层服务:

    面向连接的传输服务(TCP)
        1.传输特征:提供了可靠的数据传输,可靠性指数据传输过程中无丢失,无失序,无差错,无重复。

        2.实现手段:在通信前建立数据连接(三次握手),通信结束要正常断开连接(四次挥手)。
         
            【1】三次握手(建立连接):
            client(客户端)                          sever(服务端)
            1.客户端向服务器发送消息报文请求连接;
            2.服务器收到请求后,回复报文确定可以连接;
            3.客户端收到回复后,发送最终报文连接建立。


            【2】四次挥手(断开连接):                                   

                1.主动方发送报文请求断开连接;
                2.被动方收到请求后,立即回复,表示准备断开;
                3.被动方准备就绪,再次发送报文表示可以断开了;
                4.主动方收到确定,发送最终报文完成断开。


        3.适用情况:对数据传输准确性有明确要求,传输文件较大,需要确保可靠性的情况。比如:网页获,文件下载,邮件收发。


    面向无连接的传输服务(UDP):

        1.传输特点:不保证传输的可靠性,传输过程没有连接和断开,数据收发自由随意,数据传输效率较高。

        2.适用情况:网络较差,对传输可靠性要求不高,如网络视频、群聊,广播。

  

三、socket(套接字编程)
 
    1.套接字 基于TCP或UDP协议的编程方案,实现网络编程进行数据传输的一种技术手段。

    2.python去实现套接字编程,只需要import socket,这个socket是python标准模块,不需要另外安装。

    3.套接字分类
        流式套接字(SOCK_STREAM):特征是以字节流方式传输数据,实现tcp网络传输方案。

        数据报套接字(SOCKET_DGRAM):以数据报形式传输数据,实现udp网络传输方案。

        面向连接 —— TCP协议 —— 可靠的 —— 流式套接字 —— 字节流形式
        无连接 —— udp协议 —— 不可靠 —— 数据报套接字 —— 数据报形式

cookie:
dir结果中,全大写的可以认为是常量,全都小写的一般是属性变量或者是属性方法(函数),双下则是特殊方法
函数三要素:功能、参数、返回值。设计或了解一个函数从三要素入手。
__init__对象的初始化函数

    4.tcp套接字编程:
        【1】服务端流程:
            服务端是等待被访问的,一个服务端可以同时连接多个客户端。

            1.创建套接字

                sockfd = socket.socket(socket_family = AF_INET,socket_type = SOCK_STREAM,proto = 0)   #socket模块下面还有一个socket类,并不是函数
                功能:创建套接字
                参数:
                    socket_family    网络地址类型   默认值AF_INET表示IPV4   AF_INET6表示IPV6    AF_UNIX表示本地套接字
                    socket_type      套接字类型     默认值SOCK_STREAM表示流式套接字      SOCK_DGRAM表示数据报套接字
                    proto            筛选子协议     通常为0 因为TCP、UDP协议都没有子协议

                返回值:套接字对象 或者说是实例化一个套接字对象


            2.绑定地址

                sockfd.bind(addr)
                功能:绑定本机网络地址
                参数:二元元祖(ip,port) 元祖格式  ('localhost',8888) ('127.0.0.1',8888) ('xxx.xxx.xxx.xxx',8888) ('0.0.0.0',8888)  IP必须为str格式
                没有返回值


            3.设置监听

            sockfd.listen(n)
            功能:将套接字设置为监听套接字,确定监听队列大小  (一个监听套接字可以连接多个客户端,但是连接的过程需要一个一个来,队列就是连接过程有些延迟,让其他想连接但未连接的先等待,linux系统下不管用,因为linux自动设置了队列值,windows下和mac下可以正常使用)
            参数:监听队列大小,必须为整数


            4.等待处理客户端连接请求

            connfd,addr = sockfd.accept()
            功能:阻塞等待处理客户端请求
            返回值:返回了有两个值的元祖
                connfd 客户端连接套接字
                addr 连接的客户端地址

            sockfd 负责连接客户端   connfd负责和客户端通信

            *阻塞函数:程序运行过程中遇到阻塞函数则暂停执行,直到达成某种条件后继续运行


            5.消息收发
            data = connfd.recv(buffersize)
            功能:接受客户端消息,bytes格式
            参数:每次最多接受消息的大小,即多少个字节,是一个整数
            返回值:接收到的内容

            n = connfd.send(data)
            功能:发送消息
            参数:要发送的内容 ,bytes格式
            返回值:发送的字节数

            *
            str >>> bytes   string.encode()
            bytes >>> str    bytes.decode()

            6.关闭套接字
            socket.close()
            功能:关闭套接字

import socket

#创建套接字
sockfd = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定地址
sockfd.bind(('0.0.0.0',9999))
#设置监听
sockfd.listen(3)
#等待处理客户端连接
print('waitting for connect...')
connfd,addr = sockfd.accept()#操作系统帮我们自动完成三次握手
print('connect from:',addr)#打印客户端地址
print('cilenct socket:',connfd)#客户端连接套接字
#收发消息
data = connfd.recv(10240)   #最多接受10240个字节的消息   #如果没有消息接受到,recv也会阻塞
print('Receive messages:',data.decode())#打印接受的消息
mass = input('>>')
n = connfd.send(mass.encode())  #英文也可以在前面加一个b,中文不可以
print('send %d bytes'%n)
#关闭套接字
connfd.close()  #和客户端连接断开,操作系统帮我们完成四次挥手
sockfd.close()

 

 

      【2】客户端流程
            1.创建套接字
                必须创建和服务端相同类型的套接字

            2.请求连接
                sockfd.connet(server_addr)
                功能:连接服务器
                参数:元组 服务器地址

            3.收发消息
                注意防止两端阻塞,recv send要配合使用,一方先recv再send,一方先send再recv。

            4.关闭套接字

import socket
#创建套接字
sockfd = socket.socket()
#请求连接
server_addr = (('127.0.0.1',9999))
sockfd.connect(server_addr)
#收发消息
data = input('please input:\n>>>')
sockfd.send(data.encode())
if data == 'exit':
socket.close()
data = sockfd.recv(10240)
print('from server:',data.decode())
#关闭套接字

将以上两行代码放到一台主机上,通过使用两个终端窗口即可访问。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值