【python web开发知识点整理7】- 网络编程基础

网络协议

(1)TCP/IP协议

TCP/IP是分层协议,如层次图所示:从底层到应用层,分别是物理层,链路层,网络层,传输层,应用层。数据是层层封装,封装的方式一般都是在原有数据的前面加一个数据控制头。

(2)Telnet协议

Telnet是TCP/IP中的一种应用协议,可以为终端仿真提供支持。可使用户连接到主机上,使主机响应起来就像它直接连接在终端上一样。Telnet在发送端和接收端使用TCP的23号端口以进行专用的通信。

(3)FTP协议

FTP协议使用TCP20号和21号端口,20号端口用于数据交换,21号端口用于建立连接,允许目录和文件访问,上传下载,不能远程执行文件。
TFTP是简单文件传输协议(Trivial File Transfer Protocol,TFTP),TFTP是无连接的,使用UDP的69号端口,用于当数据传输错误无关紧要而且无须安全性时的小型文件的传输。

(4)SMTP协议

SMTP是简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)是为网络系统间的电子邮件交换而设计的。使用 25 端口。SMTP只需要在接收端的一个电子邮件地址即可发送邮件。POP3 协议用来接收邮件.使用110端口

(5)DNS服务

DNS是域名解析服务(Domain Name Service, DNS),作用是将域名转换为IP地址,或将IP地址转换为域名,用于解析完全合格域名(FQDN)。使用53号端口。

(6)DHCP服务

DHCP是动态主机配置协议(DHCP),服务器可以提供的信息有:
1、IP地址
2、子网掩码(subnet mask)
3、域名(domain name)
4、默认网关(default gateway)
5、DNS

SNMP协议

SNMP是简单的网络管理协议,它不是一个软件,而是用于网络管理的一套规则。利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。

但话又说回来,为什么要使用SNMP协议?

因为网络设备可能来自不同的厂商,如果每个厂商提供一套独立的管理接口,将使网络管理变得越来越复杂,若想对网络中来自不同厂商的设备监控,用基于SNMP开发的软件进行管理最方便的,因为大部分的设备都支持SNMP协议。

那么SNMP有哪些技术有点?
(1)基于TCP/IP互联网的标准协议,传输层协议一般用UDP
(2)自动化网络管理。网络管理员可以利用SNMP平台在网络上的节点检索信息、修改信息、发现故障、完成故障诊断、进行容量规划和生成报告
(3)屏蔽不同设备的物理差异,实现对不同厂商产品的自动化管理。SNMP只提供最基本得功能集,使得管理任务与被管理设备的物理特征和实际网络类型相对独立,从而实现对不同厂商设备的管理
(4)简单的请求-应答方式和主动通告方式相结合,并有超时和重传机制
(5)报文种类少,报文格式简单,方便解析,易于实现
(6)SNMPv3版本提供了认证和加密安全机制,以及基于用户和视图的访问控制功能,增强了安全性

二、SNMP的网络架构

SNMP网络架构由三部分组成:NMS(网络管理站)、Agent(代理)、MIB(管理信息库)

1、NMS(网络管理站)

NMS是网络中的管理者,是一个利用SNMP协议对网络设备进行管理和监视的系统。可以是一台专门用来进行网络管理的服务器,也可以指某个设备中之中管理功能的一个应用程序。

NMS可以向Agent发出请求,查询或修改一个或多个具体的参数值。同时,NMS可以接收Agent主动发送的Trap信息,以获知被管理设备当前的状态

2、Agent

Agent是网络设备中的一个应用模块,用于维护被管理设备的信息数据,并响应NMS的请求,把管理数据汇报给发送请求的NMS。

Aent接收到NMS的请求信息后,完成查询或修改操作,并把操作结果发送给NMS,完成响应。同时,当设备发生故障或者其他事件的时候,Agent会主动发送Trap信息给NMS,通知设备当前的状态变化。
3、MIB

任何一个被管理的资源都表示成一个对象,称为被管理的对象。MIB就是被管理对象的集合。它定义了被管理对象的一系列的属性:对象的名称、对象的访问权限和对象的数据

类型等。每个Agent都有自己的MIB。MIB也可以看做是NMS和Agent之间的一个接口,通过这个接口,NMS可以对Agent中的每一个被管理对象进行读/写操作,从而达到管理和监控设备的目的。
在这里插入图片描述
NMS、Agent和MIB之间的关系如图所示:

MIB的结构:

MIB是以树状结构进行存储的,树的节点表示被管理对象,它可以用从根开始的一条路径唯一地识别,这条路径就称为OID。

如图所示,管理对象system可以用一串数字{1.3.6.1.2.1.1}唯一标识,这串数字就是system的OID。
在这里插入图片描述
三、SNMP的操作
在这里插入图片描述

后续的文章我们会通过抓包工具来抓取报文,来具体的分析SNMP报文的格式,以及SNMPv1、v2c、v3版本的相同与区别,以及v3所用的基于用户和基于视图的安全措施,认证和加密的过程!

长连接、短连接

在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。但从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:
Connection:keep-alive
  在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

Http请求的过程与原理

1.关于网络领域的知识(掌握和了解)

a) 协议:tcp、udp、multicast
b) IO (BIO、NIO、AIO)
c) Socket
d) NIO(Netty/Mima)
e) 序列化和反序列化
  1. 一个http请求,在整个网络中的请求过程

    TCP 总共有四层模型:传输层、网络层、数据链路层、物理层

    当应用程序用TCP传输数据时,数据被送入协议栈中,通过逐步分层,最终以一串比特流传送网络。其中每层都需要增加头部的信息。

    传输层:表示当前的协议头。使用的是TCP协议传输

    网络层:增加ip头,IP地址是一个网卡在网络中的通讯地址

    数据链路层:增加MAC头,表示这个数据包要发送到网卡地址;MAC地址是全局唯一的。

    物理层:转化为比特流进行传输

在这里插入图片描述

为什么有了MAC层还要继续走IP层

我们都知道MAC是全局唯一,就类似于人的身份证号一样,虽然人的身份证号是和户口地、出生时间有关,但是人是移动的,不能通过身份证号就能找到这个人再什么地方,mac地址类似,知道mac地址,并不能在网络中将数据发送给它,除非它和发送方在同一个网络内。所以要实现机器之间的通信,不仅仅需要mac地址,也必须需要ip地址。IP地址代表的是,当前机器在网络中的位置,通过ip层的寻找,就可以实现任意两台Internet上的机器之间的传输数据。

什么是IP协议

TCP 和UDP 是两种著名的传输层的协议,它们都是使用IP作为网络层协议。IP协议提供了一组数据报文服务,每组分组报文都是由网络独立处理和分发。

TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送。

UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。

a) TCP/IP

TCP协议能够检测和恢复IP层提供的主机到主机的通信中可能发生的报文丢失、重复及其他错误。TCP提供了一个可信赖的字节流通道,这样应用程序就不需要考虑这些问题。同时,TCP协议是一种面向连接的协议,在使用TCP进行通信之前,两个应用程序之间需要建立一个TCP连接,而这个连接有涉及到两台电脑需要完成握手消息的交换。

b) UDP/IP

UDP协议不会对IP层产生的错误进行修复,而是简单的扩展了IP协议的数据报文服务,使它能够在应用程序之间工作,而不是在主机之间工作,因此使用UDP协议必须要考虑到报文丢失,顺序混乱的问题

5.TCP如何做到可靠传输?

a)建立可靠的连接

由于TCP协议是一个种可信的传输协议,所以在传输之前,需要通过三次握手建立一个连接,所谓的三次握手,就是在建立TCP链接时,需要客户端和服务端总共发送3个包来确认连接的建立

b) 断开连接(TCP四次挥手协议)

四次挥手表示TCP断开连接的时候,需要客户端和服务端总共发送4个包来确认连接的断开;客户端和服务器均可主动发起挥手动作(TCP是一个全双工协议),在socket编程中,任何一方执行close()操作既可产生挥手操作。

c)为什么连接三次握手、关闭四次挥手

三次握手是因为当Server端收到Client端SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答,SYN报文是用来同步的,第三次发送的时候,客户发送一个确认包,告诉服务端已经建立连接。但是关闭连接是,当Server端接收到FIN报文时,很可能并不会立即关闭SOCKET(因为还有消息没有处理完),所以只能先回复一个ACK报文,告诉CLient端,“你发的FIN报文我收到了”。只有等到我Server端所有报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次握手。

6.滑动窗口协议

当建立可靠连接以后,就开始进行数据传输,在通信过程中,最重要的就是数据包,也就是协议传输的数据。如果数据的传送方和接收方出现来不及接收的情况,就会出现数据的丢失。因此利用滑动窗口机制,很有效的在TCP连接上实现对发送发流量控制。TCP的窗口单位是字节,不是报文段,发送方的的发送窗口不能超过接收方给出的窗口。

三次握手与四次挥手?

通过HTTP网络请求过程中的TCP协议
TCP连接的特点
相较于UDP来说,更加安全可靠,是面向连接,传输的话是以流的形式传输
TCP连接如何保证安全可靠的
为什么TCP连接需要三次握手,两次不可以吗,为什么
不可以两次握手只能一方确认自己的收发没有问题,而另一方的收没问题,发可能存在问题

在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:

同步/异步主要针对C端:

同步:

所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。

例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事

异步:

异步的概念和同步相对。当c端一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

例如 ajax请求(异步): 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

阻塞/非阻塞主要针对S端:

阻塞

阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。

有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。 例如,我们在socket中调用recv函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。

快递的例子:比如到你某个时候到A楼一层(假如是内核缓冲区)取快递,但是你不知道快递什么时候过来,你又不能干别的事,只能死等着。但你可以睡觉(进程处于休眠状态),因为你知道快递把货送来时一定会给你打个电话(假定一定能叫醒你)。

非阻塞

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

还是等快递的例子:如果用忙轮询的方法,每隔5分钟到A楼一层(内核缓冲区)去看快递来了没有。如果没来,立即返回。而快递来了,就放在A楼一层,等你去取。

对象的阻塞模式和阻塞函数调用
对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但是并不是一一对应的。阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的API去轮询状 态,在适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用特殊的函数也可以进入阻塞调用。函数select就是这样的一个例子。

总结

同步,就是我客户端(c端调用者)调用一个功能,该功能没有结束前,我(c端调用者)死等结果。
异步,就是我(c端调用者)调用一个功能,不需要知道该功能结果,该功能有结果后通知我(c端调用者)即回调通知。
同步/异步主要针对C端, 但是跟S端不是完全没有关系,同步/异步机制必须S端配合才能实现.同步/异步是由c端自己控制,但是S端是否阻塞/非阻塞, C端完全不需要关心。
阻塞, 就是调用我(s端被调用者,函数),我(s端被调用者,函数)没有接收完数据或者没有得到结果之前,我不会返回。
非阻塞, 就是调用我(s端被调用者,函数),我(s端被调用者,函数)立即返回,通过select通知调用者
同步IO和异步IO的区别就在于:数据访问的时候进程是否阻塞!
阻塞IO和非阻塞IO的区别就在于:应用程序的调用是否立即返回!

同步和异步都只针对于本机SOCKET而言的。

同步和异步,阻塞和非阻塞,有些混用,其实它们完全不是一回事,而且它们修饰的对象也不相同。
阻塞和非阻塞是指当server端的进程访问的数据如果尚未就绪,进程是否需要等待,简单说这相当于函数内部的实现区别,也就是未就绪时是直接返回还是等待就绪;
而同步和异步是指client端访问数据的机制,同步一般指主动请求并等待I/O操作完毕的方式,当数据就绪后在读写的时候必须阻塞(区别就绪与读写二个阶段,同步的读写必须阻塞),异步则指主动请求数据后便可以继续处理其它任务,随后等待I/O,操作完毕的通知,这可以使进程在数据读写时也不阻塞。(等待"通知")

网络编程模型

阻塞I/O模型:

简介:进程会一直阻塞,直到数据拷贝完成

非阻塞I/O模型:

简介:非阻塞IO通过进程反复调用IO函数(多次系统调用,并马上返回);在数据拷贝的过程中,进程是阻塞的;

IO复用模型:

简介:主要是select和epoll;对一个IO端口,两次调用,两次返回,比阻塞IO并没有什么优越性;关键是能实现同时对多个IO端口进行监听;

I/O复用模型会用到select、poll、epoll函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。

信号驱动IO

简介:两次调用,两次返回;

首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。

异步IO模型

简介:数据拷贝的时候进程无需阻塞。

当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者的输入输出操作

同步IO引起进程阻塞,直至IO操作完成。
异步IO不会引起进程阻塞。
IO复用是先通过select调用阻塞。

5个I/O模型的比较:

在这里插入图片描述

select、poll、epoll简介

epoll跟select都能提供多路I/O复用的解决方案。在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSIX所规定,一般操作系统均有实现

select:

select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是:

1、 单个进程可监视的fd数量被限制,即能监听端口的大小有限。
一般来说这个数目和系统内存关系很大,具体数目可以cat /proc/sys/fs/file-max察看。32位机默认是1024个。64位机默认是2048.
2、 对socket进行扫描时是线性扫描,即采用轮询的方法,效率较低:
当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间。如果能给套接字注册某个回调函数,当他们活跃时,自动完成相关操作,那就避免了轮询,这正是epoll与kqueue做的。
3、需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大

poll:

poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。

它没有最大连接数的限制,原因是它是基于链表来存储的,但是同样有一个缺点:

1、大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义。
2、poll还有一个特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd。

epoll:

epoll支持水平触发和边缘触发,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会通知一次。还有一个特点是,epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知

epoll的优点:

1、没有最大并发连接的限制,能打开的FD的上限远大于1024(1G的内存上能监听约10万个端口);
2、效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数; 即Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll。
3、 内存拷贝,利用mmap()文件映射内存加速与内核空间的消息传递;即epoll使用mmap减少复制开销。

总结:

综上,在选择select,poll,epoll时要根据具体的使用场合以及这三种方式的自身特点。

1、表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。
2、select低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章