TCP/IP协议
为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,诞生了互联网协议簇(Internet Protocol Suite)就是通用协议标准。这里面有上百种协议,不过最重要的还是TCP/IP协议。
TCP协议的特点
TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话"。通信连接必须是双向的,有明显的客户端与服务器,只能在完全接收到服务器给的响应后才能发起下一次请求,并且超时之后还有重发机制,在通信过程中不会存在丢包现象,是一种安全的可靠的传输协议。
TCP连接的三次握手四次挥手
TCP协议,客户端与服务器建立连接:三次握手
简单来说就是:
第一次握手:客户端向指定的地址发送连接请求,开启了一个socket,并且
携带了请求的信息;
第二次握手:服务器收到请求,被动开启一个socket准备连接客户端,
同时发送数据告诉客户端“我已经准备好了,让我们交合吧!”;
第三次握手:客户端收到服务器的信息,返回给服务器,正式建立连接。
TCP协议,客户端与服务器断开连接:四次挥手
第一次挥手:客户端发送报文,表示没有请求信息了,准备关闭连接;
第二次挥手:服务器收到信息,首先将还没有传给客户端的信息全部传回去;
第三次挥手:服务器表示收到了关闭连接的信息,告诉客户端我已关闭连接;
第四次挥手:客户端收到信息,关闭连接。
这里的连接断开过程,充分体现了TCP协议的可靠性,和双向性。
网络中的不同计算机进程间通信是通过socket实现的,下面会讲到。
UDP协议
UDP协议的特点
UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
UDP是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的,所以可以用来数据广播。
UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。 UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
socket简介
在之前的多进程里面介绍过,进程间的通信可以通过队列Queue,管道等进行数据的交互通信,或者通过Manager进行数据共享,但是网络中不同计算机之间不同进程的交互就不能做到了。
其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。
这样利用ip地址,协议,端口就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。
socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,socket就像计算机上的插座一样,当有其他计算机的进程要连接时,对应端口的socket就会启动,实现与其他计算机进程的连接。
TCP的长连接与短连接
TCP长连接
建立连接——数据传输...(保持连接)...数据传输——关闭连接
1、client 向 server 发起连接
2、server 接到请求,双方建立连接
3、client 向 server 发送消息
4、server 回应 client
5、一次读写完成,连接不关闭
6、后续读写操作...
7、长时间操作之后client发起关闭请求
TCP短连接
建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接
1、client 向 server 发起连接请求
2、server 接到请求,双方建立连接
3、client 向 server 发送消息
4、server 回应 client
5、一次读写完成,此时双方任何一个都可以发起 close 操作
注意:在第 步骤5中,一般都是 client 先发起 close 操作。当然也不排除有特殊的情况。
从上面的描述看,短连接一般只会在 client/server 间传递一次读写操作!
HTTP协议就是一种典型的TCP短连接协议。
长短连接的优缺点:
◆长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。
◆对于频繁请求资源的客户来说,较适用长连接。
◆随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端
需要采取一些策略:
如关闭一些长时间没有读写事件发生的连接,这样可以 避免一些恶意连接导致
server端服务受损;
如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接
数,这样可以完全避免某个客户端连累后端服务。
◆短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。
◆但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。
TCP长短连接的适用实例
长连接:多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三次握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,再次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
短连接:像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。所以web中的HTTP才使用短连接。
常见网络攻击与防范
SYN洪水攻击,大量发起请求但是却不执行操作,让服务器短时间内建立很多的连接,导致服务器在正常用户访问时,拒绝服务,应对措施:合理设置连接超时时间
Web欺骗,位于客户端和服务器之间,接收客户端的正确请求,转发给服务器,但是缺展示假的页面给客户端,自己获取服务器的真实信息,危害很大,应对措施:对信息进行加密,攻击者无法破解密文,进行后续操作。
CSRF跨域请求伪造:客户端误进入一个有害的网站,其中包含有对另一个域名的服务器敏感信息的操作请求,在解析网页的时候,会执行这个敏感请求。应对措施:服务器在建立连接时发送一段密文,之后继续访问该域名下的其他操作,必须带着域名提交,否则返回403错误,django常用{% csrf_token %}。
XSS脚本植入攻击:恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。防范:输入检查和输出检查,django中常用autoescape标签的参数是on或者off,如果{% autoescape off %}标签中有需要转义的内容,则可以在该标签中嵌套使用{% autoescape on %}
单进程服务器异步非阻塞IO操作的原理
select
1. select 原理
在多路复用的模型中,比较常用的有select模型和epoll模型。这两个都是系统接口,由操作系统提供。当然,Python的select模块进行了更高级的封装。
网络通信被Unix系统抽象为文件的读写,通常是一个设备,由设备驱动程序提供,驱动可以知道自身的数据是否可用。支持阻塞操作的设备驱动通常会实现一组自身的等待队列,如读/写等待队列用于支持上层(用户层)所需的block或non-block操作。设备的文件的资源如果可用(可读或者可写)则会通知进程,反之则会让进程睡眠,等到数据到来可用的时候,再唤醒进程。
这些设备的文件描述符被放在一个数组中,然后select调用的时候遍历这个数组,如果对于的文件描述符可读则会返回改文件描述符。当遍历结束之后,如果仍然没有一个可用设备文件描述符,select让用户进程则会睡眠,直到等待资源可用的时候在唤醒,遍历之前那个监视的数组。每次遍历都是依次进行判断的。
2、select缺陷
select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但是这样也会造成效率的降低。
一般来说这个数目和系统内存关系很大,具体数目可以cat /proc/sys/fs/file-max察看。32位机默认是1024个。64位机默认是2048.
对socket进行扫描时是依次扫描的,即采用轮询的方法,效率较低。
当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间。
epoll
1. epoll的优点:
没有最大并发连接的限制,能打开的FD(指的是文件描述符,通俗的理解就是套接字对应的数字编号)的上限远大于1024
效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数;即epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,epoll的效率就会远远高于select和poll。
2.基于epoll的web服务器
Tornado框架自带的web服务器,就是在linux系统中使用epoll单进程异步非阻塞AIO操作,实现高并发操作,当Tornado中使用多进程操作时,它的性能将会发挥到最大值,在处理高并发的用户量比较大的web项目时,发挥强大的作用。