Python网络编程 -- TCPIP

Python014

Python网络编程 -- TCPIP,第1张

首先放出一个 TCP/IP 的程序,这里是单线程服务器与客户端,在多线程一节会放上多线程的TCP/IP服务程序。

这里将服务端和客户端放到同一个程序当中,方便对比服务端与客户端的不同。

TCP/IP是因特网的通信协议,其参考OSI模型,也采用了分层的方式,对每一层制定了相应的标准。

网际协议(IP)是为全世界通过互联网连接的计算机赋予统一地址系统的机制,它使得数据包能够从互联网的一端发送至另一端,如 130.207.244.244,为了便于记忆,常用主机名代替IP地址,例如 baidu.com。

UDP (User Datagram Protocol,用户数据报协议) 解决了上述第一个问题,通过端口号来实现了多路复用(用不同的端口区分不同的应用程序)但是使用UDP协议的网络程序需要自己处理丢包、重包和包的乱序问题。

TCP (Transmission Control Protocol,传输控制协议) 解决了上述两个问题,同样使用端口号实现了复用。

TCP 实现可靠连接的方法:

socket通信模型及 TCP 通信过程如下两张图。

[图片上传失败...(image-6d947d-1610703914730)]

[图片上传失败...(image-30b472-1610703914730)]

socket.getaddrinfo(host, port, family, socktype, proto, flags)

返回: [(family, socktype, proto, cannonname, sockaddr), ] 由元组组成的列表。

family:表示socket使用的协议簇, AF_UNIX : 1, AF_INET: 2, AF_INET6 : 10。 0 表示不指定。

socktype: socket 的类型, SOCK_STREAM : 1, SOCK_DGRAM : 2, SOCK_RAW : 3

proto: 协议, 套接字所用的协议,如果不指定, 则为 0。 IPPROTO_TCP : 6, IPPRTOTO_UDP : 17

flags:标记,限制返回内容。 AI_ADDRCONFIG 把计算机无法连接的所有地址都过滤掉(如果一个机构既有IPv4,又有IPv6,而主机只有IPv4,则会把 IPv6过滤掉)

AI _V4MAPPED, 如果本机只有IPv6,服务却只有IPv4,这个标记会将 IPv4地址重新编码为可实际使用的IPv6地址。

AI_CANONNAME,返回规范主机名:cannonname。

getaddrinfo(None, 'smtp', 0, socket.SOCK_STREAM, 0, socket.AP_PASSIVE)

getaddrinfo('ftp.kernel.org', 'ftp', 0, 'socket.SOCK_STREAM, 0, socket.AI_ADDRCONFIG | socket.AI_V4MAPPED)

利用已经通信的套接字名提供给getaddrinfo

mysock = server_sock.accept()

addr, port = mysock.getpeername()

getaddrinfo(addr, port, mysock.family, mysock.type, mysock.proto, socket.AI_CANONNAME)

TCP 数据发送模式:

由于 TCP 是发送流式数据,并且会自动分割发送的数据包,而且在 recv 的时候会阻塞进程,直到接收到数据为止,因此会出现死锁现象,及通信双方都在等待接收数据导致无法响应,或者都在发送数据导致缓存区溢出。所以就有了封帧(framing)的问题,即如何分割消息,使得接收方能够识别消息的开始与结束。

关于封帧,需要考虑的问题是, 接收方何时最终停止调用recv才是安全的?整个消息或数据何时才能完整无缺的传达?何时才能将接收到的消息作为一个整体来解析或处理。

适用UDP的场景:

由于TCP每次连接与断开都需要有三次握手,若有大量连接,则会产生大量的开销,在客户端与服务器之间不存在长时间连接的情况下,适用UDP更为合适,尤其是客户端太多的时候。

第二种情况: 当丢包现象发生时,如果应用程序有比简单地重传数据聪明得多的方法的话,那么就不适用TCP了。例如,如果正在进行音频通话,如果有1s的数据由于丢包而丢失了,那么只是简单地不断重新发送这1s的数据直至其成功传达是无济于事的。反之,客户端应该从传达的数据包中任意选择一些组合成一段音频(为了解决这一问题,一个智能的音频协议会用前一段音频的高度压缩版本作为数据包的开始部分,同样将其后继音频压缩,作为数据包的结束部分),然后继续进行后续操作,就好像没有发生丢包一样。如果使用TCP,那么这是不可能的,因为TCP会固执地重传丢失的信息,即使这些信息早已过时无用也不例外。UDP数据报通常是互联网实时多媒体流的基础。

参考资料:

  简单网络管理协议SNMP(Simple Network Management Protocol)用于网络设备的管理。SNMP作为广泛应用于TCP/IP网络的网络管理标准协议,提供了统一的接口,从而实现了不同种类和厂商的网络设备之间的统一管理。

  SNMP协议分为三个版本:SNMPv1、SNMPv2c和SNMPv3。

  SNMP系统由网络管理系统NMS(Network Management System)、SNMP Agent、被管对象Management object和管理信息库MIB(Management Information Base)四部分组成。

  SNMP查询是指NMS主动向SNMP Agent发送查询请求,如图1-3所示。SNMP Agent接收到查询请求后,通过MIB表完成相应指令,并将结果反馈给NMS。SNMP查询操作有三种:Get、GetNext和GetBulk。SNMPv1版本不支持GetBulk操作。

  不同版本的SNMP查询操作的工作原理基本一致,唯一的区别是SNMPv3版本增加了身份验证和加密处理。下面以SNMPv2c版本的Get操作为例介绍SNMP查询操作的工作原理。假定NMS想要获取被管理设备MIB节点sysContact的值,使用可读团体名为public,过程如下所示:

  SNMP设置是指NMS主动向SNMP Agent发送对设备进行Set操作的请求,如下图示。SNMP Agent接收到Set请求后,通过MIB表完成相应指令,并将结果反馈给NMS。

  不同版本的SNMP Set操作的工作原理基本一致,唯一的区别是SNMPv3版本增加了身份验证和加密处理。下面以SNMPv3版本的Set操作为例介绍SNMP Set操作的工作原理。

假定NMS想要设置被管理设备MIB节点sysName的值为HUAWEI,过程如下所示:

  SNMPv1和SNMPv2c的Set操作报文格式如下图所示。一般情况下,SNMPv3的Set操作信息是经过加密封装在SNMP PDU中,其格式与SNMPv2c的Set操作报文格式一致。

  SNMP Traps是指SNMP Agent主动将设备产生的告警或事件上报给NMS,以便网络管理员及时了解设备当前运行的状态。

  SNMP Agent上报SNMP Traps有两种方式:Trap和Inform。SNMPv1版本不支持Inform。Trap和Inform的区别在于,SNMP Agent通过Inform向NMS发送告警或事件后,NMS需要回复InformResponse进行确认。

  在Ensp中搭建网络环境,在R2上启用SNMP作为SNMP agent,Linux主机作为NMS;为方便观察SNMP报文格式,在R2使用SNMP的版本为v2c。

通过下面的Python脚本获取R2的系统信息与当前的主机名

运行结果如下

  在R2接口上抓包结果如下,Linux主机向R2的161端口发送SNMP get-request报文,可以看到SNMP使用的版本为v2c,设置的团体名为public,随机生成了一个request-id,变量绑定列表(Variable bindings),即要查询的OID,但Value为空;值得注意的是这些信息都是明文传输的,为了安全在实际环境中应使用SNMPv3。

通过下面的Python脚本获取R2的接口信息。

运行结果如下:

在R2接口抓包结果如下,getBuikRequest相比get-request设置了一个max-repetitions字段,表明最多执行get操作的次数。Variable bindings中请求的OID条目只有一条。

下面Python脚本用于设置R2的主机名为SNMPv2R2。

运行结果如下

在路由器上可以看到主机名有R2变为了SNMPv2R2。

get-response数据包内容与set-request中无异。

下面Python脚本用于接收,R2发送的Trap,并做简单解析。

先运行该脚本,之后再R2上手动将一个接口shutdown,结果如下:

接口上抓包结果如下,此时团体名用的是public,data部分表明是trap。

由于Ensp中的通用路由器认证算法只支持des56,而pysnmp不支持该算法,因此使用AR路由器配置SNMPv3。

使用下面Python脚本发送snmpv3 get报文获取设备系统信息。

抓包结果如下,首先发送get-resques进行SNMPv3认证请求,随机生成一个msgID,认证模式为USM,msgflgs中Reportable置1要求对方发送report,其他为置0,表示不进行加密与鉴权;另外安全参数,认证参数、加密参数都为空,此时不携带get请求数据。

路由器给NMS回复report,msgID与resquest一致,Msgflgs中各位都置0,同时回复使用的安全引擎,认证与加密参数为空,不进行认证与加密,因此能看到data中的数据。

AR1收到请求后进行回复,数据包中msgflags标志位中除reportable外其他位都置1,表示不需要回复,同时进行加密与鉴权。同样也可以看到认证用户为testuser,认证参数与加密参数都有填充,data部分也是同样加密。

参考:

什么是SNMP - 华为 (huawei.com)

AR100-S V300R003 MIB参考 - 华为 (huawei.com)

SNMP library for Python — SNMP library for Python 4.4 documentation (pysnmp.readthedocs.io)

python编程是啥

python编程是啥,Python是一种代表简单主义思想的语言,Python崛起更加符合开发者的习惯和口味。下面我给大家分享一下关于python编程是啥的相关信息。

python编程是啥1

编程语言领域Python成为了一个耀眼的新星,Python崛起的原因与其本身特点有关,也许它是更加符合开发者的习惯和口味。现在有一种声音说Python将会超越Java成全球最流行编程语言。

这些年,编程语言的发展进程很快,在商业公司、开源社区两股力量的共同推动下,涌现出诸如Go、Swift这类后起之秀,其中最为耀眼的是Python。

知名开发者网站Stackoverflow撰文指出,从2012至2017年编程语言Python成为开发者使用增长最快的主流编程语言,其中2017年增长率达到了27%,一举超过包括Java、C#、PHP、C++在内的所有同类。另据高盛集团发布的一份《2017调查报告》针对全球数千名高校实习生的调查中,当问到你认为“哪个语言在未来会更重要”时,被调查的80、90后优秀年轻开发者中72%选了Python。

语言的使用者是一直被誉为业界上游“源头活水”的开发者,其重要程度从各大科技巨头公司每年例行召开的开发者大会上可见一斑。对于开发者群体而言最重要的事物有两个,一是平台,二就是编程语言。编程语言Python为什么能够获得全球众多开发者的青睐?它的崛起给开发者世界带来了什么变化?

成功的一半源于好的开始

在主流编程语言当中,Python并不是一个“新人”,它的历史超过25年,但真正风靡之时却是最近几年,所以“后起之秀”的称呼实至名归。Python的起源是19 89年,其发明者荷兰人程序员吉多范罗苏姆受ABC语言的启发计划开发一个新的脚本解释器,由此迈出了Python项目的起点。

Python能够真正风靡的原因之一是有一个好的起点。它的起步很稳,避开了版权纠纷,且搭上了开源运动的顺风车。在那个年代,商业版权一直是热门 事件,业界史上第一个软件领域重大官司AT&T和伯克利BSD的Unix版权案打得天昏地暗,该案的结局直接促成了BSD的开源分支、Linux的诞生以及震惊世界的自由软件运动。

Python最初的版权归属是CWI(阿姆斯特丹的国家数学与计算机科研学会),这与吉多早年在该机构工作有关,后来吉多受雇于CNRI(维吉尼亚州的国家创新研究公司),Python权属转移至此。那时自由软件运动已经开始,在CNRI期间发布的1.6至2.1多个版本的`Python许可证是一种与GPL并不兼容且类似于BSD的开源许可,CNRI因受到自由软件基金会的压力释放了Python的原许可证,吉多由此掌握了主导权并起草了新的许可证。他改变了原许可证与GPL的不兼容,此举获得了自由软件基金会颁发的自由软件进步奖。再后来吉多和他的团队成立了Python软件基金会,将版权与许可证置于其下。

创始人吉多范罗苏姆的心思缜密与灵活处事为Python最初的发展营造了良好的环境,包括几次权属的转移、起草新的许可证、机智地与自由软件阵营斡旋,最后安全融入开源的大潮。这一切为Python此后十多年里逐渐成长为主流编程语言赢得了契机。

“人生苦短,我用Python”并非一句戏言

Python崛起的原因之二与其本身特点有关,或者说,其长期维护演进形成的独特风格迎合了大多数开发者的口味。在开发者社群流行着一句玩笑“人生苦短,我用Python”(原话为” Life is short, you need Python”),这句看似戏言的话实际上恰恰反映了Python的语言特性与其在开发者心里的价值分量。

除了包涵大多数主流编程语言的优点(面向对象、语法丰富)之外,Python的直观特点是简明优雅、易于开发,用尽量少的代码完成更多工作。尽管Python是一种解释型语言,与传统的编译型语言相比降低了机器执行效率,但是处理器的处理速率与环境速率(比如网络环境)的差异在大多数场景中完全抵消了上述代价牺牲部分运行效率带来的好处则是提升了开发效率,在跨平台的时候无需移植和重新编译。 所以Python的显著优点在于速成,对于时间短、变化快的需求而言尤为胜任。

Python最强大的地方体现在它的两个外号上,一个叫“内置电池”,另一个是“胶水语言”。前者的意思是,Python官方本身提供了非常完善的标准代码库,包括针对网络编程、输入输出、文件系统、图形处理、数据库、文本处理等等。代码库相当于已经编写完成打包供开发者使用的代码集合,程序员只需通过加载、调用等操作手段即可实现对库中函数、功能的利用,从而省去了自己编写大量代码的过程,让编程工作看起来更像是在“搭积木”。除了内置库,开源社区和独立开发者长期为Python贡献了丰富大量的第三方库,其数量远超其他主流编程语言,可见Python的语言生态已然相当壮大。

“胶水语言”是Python的另一个亮点。Python本身被设计成具有可扩展性,它提供了丰富的API和工具,以便开发者能够轻松使用包括C、C++等主流编程语言编写的模块来扩充程序。就像使用胶水一样把用其他编程语言编写的模块粘合过来,让整个程序同时兼备其他语言的优点,起到了黏合剂的作用。正是这种多面手的角色让Python近几年在开发者世界中名声鹊起,因为互联网与移动互联时代的需求量急速倍增,大量开发者亟需一种极速、敏捷的工具来助其处理与日俱增的工作,Python发展至今的形态正好满足了他们的愿望。

Python的影响

从两个著名编程语言排行网站TIOBE和PYPL的最新数据来看,Java与Python的排名分别位于第1和第5、第1和第2。关于两个网站的排行机制我们不得而知,但从开发者社群的相关评论中可以认为PYPL更能反映编程语言在开发者群体中的流行程度。不论如何,Python的崛起已是毋庸置疑的事实,而它上面的前辈则是常年占据榜单第1,互联网与移动时代的娇子Java。从Stackoverflow和多个开源社区公开的数据来看,Python的用户数量增长很快,在今后两年超过Java成为全球最流行编程语言的可能性非常之高。

值得一提的是,那些颇有影响力的主流编程语言,其背后一般都站着科技巨头公司,比如Java之于甲骨文、C#之于微软、ObjecTIve-C之于苹果。Java之所以常年第一是因为其同时还几乎是安卓平台的御用语言,以及受益于Sun时代影响力的眷顾。Python虽曾一度为谷歌使用,但Go语言问世后随着时间推移或将遇冷。也就是说,Python成了没有巨头站队的主流编程语言,那么它的影响力是如何维系的?为什么还能够保持高速成长并形成赶超Java之势?

我们认为这与Python多年来实现较好案例与范用性有关。使用Python开发的知名案例中,包括豆瓣、果壳、知乎、Dropbox、EVE(星战前夜)每一个都是重量级产品,这说明Python语言本身的发展已日臻完善,有着极高的稳定与可靠性保证。第二是Python的应用范围,除了日常工具和脚本之外,还适用于Web程序、GUI开发、操作系统中间件、服务端运维等等,这些年Python的一些第三方库在机器学习、神经网络方面活跃非凡,这也为语言本身的推广和流行加分不少。

最后需要指出的是,Python编程思想包含强烈的黑箱思维,这意味着开发者将愈加重视模块化和流水线式的编程工作,事实上这也是未来主流编程语言的发展趋向。随着计算机语言的演化和开发工具集成功能日趋强大,未来的编程工作将大幅简化。从某种角度看,Python更像是已经“迈入未来”的编程语言,其对开发者群体结构变化,以及新进开发者数量的激增,这些影响都将是深远的。

python编程是啥2

python的作用:

1、系统编程:提供API(ApplicationProgramming

Interface应用程序编程接口),能方便进行系统维护和管理,Linux下标志性语言之一,是很多系统管理员理想的编程工具。

2、图形处理:有PIL、Tkinter等图形库支持,能方便进行图形处理。

3、数学处理:NumPy扩展提供大量与许多标准数学库的接口。

4、文本处理:python提供的re模块能支持正则表达式,还提供SGML,XML分析模块,许多程序员利用python进行XML程序的开发。

5、数据库编程:程序员可通过遵循PythonDB-API(数据库应用程序编程接口)规范的模块与MicrosoftSQL Server,Oracle,Sybase,DB2,MySQL、SQLite等数据库通信。python自带有一个Gadfly模块,提供了一个完整的SQL环境。

扩展资料:

python中文就是蟒蛇的意思。在计算机中,它是一种编程语言。Python(英语发音:/paθn/),是一种面向对象、解释型计算机程序设计语言,由GuidovanRossum于19 89年底发明,第一个公开发行版发行于1991年。Python语法简洁而清晰,具有丰富和强大的类库。

它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写。

比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C++重写。1发展历程编辑自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程。Python已经成为最受欢迎的程序设计语言之一。

python编程是啥3

零基础学python 要花多长时间?

答案:两天!别不信,听我细细道来

如何两天学会python 编程入门基础课程?

月31-9月1日,艾威培训再次走进知名电子公司—明导国际,为其展开2天的Python入门课程。

明导国际(MentorGraphics)是一家从事电子设计自动化的跨国公司。于1981年创立。其总部位于美国俄勒冈州的威尔森维尔(Wilsonville)。

艾威国际培训(Avtech Institute of Technology),源于美国,始于1998.专业从事企业级在职人员技能提升项目管理、IT管理、IT技术、云计算大数据、需求管理、信息安全与审计,产品管理、python编程入门等培训与各类国际认证考试提供商。进入中国16年来,已成为众多500强企业(惠普、华为、惠普、戴尔、IBM、中兴、飞利浦等)指定的培训供应商。

Python编程入门课程非常适合零基础的学生,不受行业限制,属于python认证的初级阶段课程。

艾威培训根据明导电子的需求定制了两天的python培训课程。其主要内容包括语法基础、Python程序流程控制、Python数据结构、Python函数等初级阶段的内容。

艾威培训python 5年以上资深讲师用课堂理论+实验的方式为明导国际培训员工的python初级技能。比如说利用python处理电影列表、创建自己的分类树模块等。

学以致用、以学生为中心一直是艾威培训的服务特色。除此以外,艾威培训还提供考试报名、准考证、复习备考培训、拿证一条龙服务。

通过python编程入门课程的培训,学生们能够掌握python编程语言的基础知识,能够看懂python语言编写的应用程序,能够编写简单的功能性程序,了解python语言可以应用的领域以及局限性。

入门很重要,老师教的好,基础扎实了,才能一步步向数据挖掘与分析高阶课程迈进,一步步成为数据分析领域的大牛!