15

http请求怎样实现TCP长连接、短连接

HTTP连接分为长连接和短连接,而我们现在常用的都是HTTP1.1,因此我们用的都是长连接。

这句话其实只对了一半,我们现如今的HTTP协议,大部分都是1.1的,因此我们平时用的基本上都是长连接。但是前半句是不对的,HTTP协议根本没有长短连接这一说,也正因为误解了这个,导致对于长连接一直不明不白,始终不得其要领,具体下面一段会说到。

网络上很多文章都是误人子弟,根本没有说明白这个概念。这里要强调一下,HTTP协议是基于请求/响应模式的,因此只要服务端给了响应,本次HTTP连接就结束了,或者更准确的说,是本次HTTP请求就结束了,根本没有长连接这一说。那么自然也就没有短连接这一说了。

之所以网络上说HTTP分为长连接和短连接,其实本质上是说的TCP连接。TCP连接是一个双向的通道,它是可以保持一段时间不关闭的,因此TCP连接才有真正的长连接和短连接这一说。

其实知道了以后,会觉得这很好理解。HTTP协议说到底是应用层的协议,而TCP才是真正的传输层协议,只有负责传输的这一层才需要建立连接。 Continue reading

30

HTTP连接管理之并行连接、持久化连接(Keep-Alive、Proxy-Connection)、管道化连接

串行事务处理时延

在介绍连接方式之前,先介绍一下串行事务处理时延

  • 如果只对连接进行简单的管理,TCP 的性能时延可能会叠加起来。比如,假设有一个包含了3个嵌入图片的Web页面。浏览器需要发起 4 个 HTTP 事务来显示此页面: 1 个用于顶层的 HTML页面,3 个用于嵌入的图片。如果每个事务都需要(串行地建立)一条新的连接,那么连接时延和慢启动时延就会叠加起来

watermarktype_ZmFuZ3poZW5naGVpdGkshadow_10text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNDUzMjg1size_16color_FFFFFFt_70

  • 串行加载的另一个缺点:有些浏览器在对象加载完毕之前无法获知对象的尺寸, 而且它们可能需要尺寸信息来决定将对象放在屏幕的什么位置上,所以在加载了足 够多的对象之前,无法在屏幕上显示任何内容。在这种情况下,可能浏览器串行装 载对象的进度很正常,但用户面对的却是一个空白的屏幕,对装载的进度一无所知

一些提高HTTP连接性能的技术:

  • ①并行连接:通过多条 TCP 连接发起并发的 HTTP 请求
  • ②持久连接:重用 TCP 连接,以消除连接及关闭时延
  • ③管道化连接:通过共享的 TCP 连接发起并发的 HTTP 请求
  • ④复用的连接:交替传送请求和响应报文(实验阶段)

Continue reading

12

什么是CPU密集型、IO密集型?

CPU密集型(CPU-bound)

CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。

在多重程序系统中,大部份时间用来做计算、逻辑判断等CPU动作的程序称之CPU bound。例如一个计算圆周率至小数点一千位以下的程序,在执行的过程当中绝大部份时间用在三角函数和开根号的计算,便是属于CPU bound的程序。 Continue reading

12

多进程和多线程的应用场景

多进程模型的优势是CPU,适用于CPU密集型。同时,多进程模型也适用于多机分布式场景中,易于多机扩展。

多线程模型主要优势为线程间切换代价较小,因此适用于I/O密集型的工作场景,因此I/O密集型的工作场景经常会由于I/O阻塞导致频繁的切换线程。同时,多线程模型也适用于单机多核分布式场景。

io 操作不占用CPU(从硬盘、从网络、从内存读数据都算io)
计算占用CPU(如1+1计算) Continue reading

08

并发、并行、同步、异步、多线程之间的关系和区别

并发:同一时间段有几个程序都处于已经启动到运行完毕之间,并且这几个程序都在同一个处理机上运行,并发的两种关系是同步和互斥;

互斥:进程之间访问临界资源时相互排斥的现象;

同步:进程之间存在依赖关系,一个进程结束的输出作为另一个进程的输入。具有同步关系的一组并发进程之间发送的信息称为消息或者事件;

并行:单处理器中进程被交替执行,表现出一种并发的外部特征;在多处理器中,进程可以交替执行,还能重叠执行,实现并行处理,并行就是同事发生的多个并发事件,具有并发的含义,但并发不一定是并行,也就是说事件之间不一定要同一时刻发生;

多线程:多线程是进程中并发运行的一段代码,能够实现线程之间的切换执行;

异步:和同步相对,同步是顺序执行,而异步是彼此独立,在等待某个事件的过程中继续做自己的事,不要等待这一事件完成后再工作。线程是实现异步的一个方式,异步是让调用方法的主线程不需要同步等待另一个线程的完成,从而让主线程干其他事情。

异步和多线程:不是同等关系,异步是目的,多线程只是实现异步的一个手段,实现异步可以采用多线程技术或者交给其他进程来处理。

05

网站选购服务器如何计算理论带宽,服务器带宽的计算公式

网站选购服务器如何计算理论带宽,服务器带宽的计算公式,计算带宽,带宽计算

带宽指单位时间能通过链路的数据量,通常以bps来表示,即每秒可传输之位数。或以 bit/s(比特/秒)表示,而电信,联通,移动等运营商在推广的时候往往忽略了这个单位。

而且,带宽还分为上行带宽(上行速率)和下行带宽(下行速率)。对于服务器,上行带宽是指发送给其它终端的数据传输速率(即:出),下行带宽是指接收其它终端发来的数据传输速率(即:入)。

对服务器而言, 客户端下载资源消耗的是服务器的上行流量,客户端上传资源消耗的是服务器的下行流量。通常买的服务器,比如阿里云,一般买的带宽指的是上行带宽,下行通常是不限的。而且流量的计算一般都是以上行的来计算的。

所以,客户端上传资源,对服务器的带宽基本没有影响,因为服务器的下行基本不限的,跟客户端本身网络的带宽有影响;

而客户端下载资源,除了跟服务器的带宽有影响,跟客户端本身的网络带宽也有影响的。

我们常说的1兆的宽带,就是1Mbit/s(或1Mbps),也可以写成1024bit/s(或1024bps) Continue reading

十一 17

HTTP、TCP/IP、UDP、Socket、Socket长连接、Socket连接池

前言

​ 作为一名开发人员我们经常会听到HTTP协议、TCP/IP协议、UDP协议、Socket、Socket长连接、Socket连接池等字眼,然而它们之间的关系、区别及原理并不是所有人都能理解清楚,这篇文章就从网络协议基础开始到Socket连接池,一步一步解释他们之间的关系。

七层网络模型

​ 首先从网络通信的分层模型讲起:七层模型,亦称OSI(Open System Interconnection)模型。自下往上分为:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。所有有关通信的都离不开它,下面这张图片介绍了各层所对应的一些协议和硬件

119190082-5aba3da90a5aa

通过上图,我知道IP协议对应于网络层,TCP、UDP协议对应于传输层,而HTTP协议对应于应用层,OSI并没有Socket,那什么是Socket,后面我们将结合代码具体详细介绍。 Continue reading

十一 10

从Github上淘来的爬虫框架

Python

python自然不用多说,拥有的爬虫框架数不胜数。

  • scrapy,大名鼎鼎的爬虫框架,功能强大,乃入门学习的必备良药。支持多种多样的配置特性,唯一可惜不支持分布式的特性,于是就诞生了scrapy-redis这个以redis为队列的分布式爬虫框架。
  • pyspider,应该是个华人写的爬虫框架,可支持的配置非常多,同时也支持分布式,只需要配置中间的消息队列就可以。
  • portia,可视化的爬虫框架,对于编程经验少的人来说相当适合学习。
  • xcrawler,轻量级的爬虫框架。个人很简易从读轻量级的爬虫框架的源代码入手,这样能够由浅入深,学地更有意思。
  • cola,也是很强大的分布式爬虫框架,只是可惜不支持python 3以上。
  • fetchman, 国人写的爬虫框架,采用grequests来并发请求。看过源代码,写的容易理解,所以对于新手来说很实用。
  • gain, 使用asyncio`来异步爬取的轻量级爬虫框架。代码很容易理解,利于学习。

Java

Java接触的不是很多,所以知道的爬虫框架不多。

  • webmagic,这个是国人写的爬虫框架,很好用,也很强大。源代码的阅读体验也不错,推荐写java的可以去熟悉熟悉。
  • crawler4j, 比较好的爬虫架构,对于学习和理解爬虫框架很有用。
  • SeimiCrawler, 分布式爬虫框架,也是受到scrapy启发。支持动态渲染的页面爬虫。
  • elves, 轻量级的爬虫框架,国人写的。易于学习和理解。

Node

node接触的更加不多,但是也淘到了不错的几个框架。

  • node-crawler,强大且流行。采用Cheerio这个包解析网页结构。
  • webster,高性能的NodeJs爬虫框架,可爬取动态渲染的内容(通过headless Chrome)。

C#

C#作为笔者除了Python以外比较熟悉的语言了。但是发现其爬虫框架少的可怜。哎,不禁叹息。

  • DotnetSpider,整体架构参照了WebMagicScrapy,是C#中比较强大的存在。目前已经支持.net core 2.0,所以,喜欢C#的可以去玩玩。还是比较不错的支持Entity Framework
  • WebCrawler,国人写的轻量级的爬虫框架。可以去学习学习~~~

Continue reading

十一 09

什么是connect代理?

什么是connect代理?

对于HTTP代理,不少人有认识上的误区,有必要说明一下,不是所有的HTTP代理都只能代理HTTP的,vice versa!

HTTP CONNECT代理服务器是一种能够允许用户建立TCP连接到任何端口的代理服务器,这意味着这种代理不仅可用于HTTP,还包括FTP、IRC、RM流服务等,甚至扫描、攻击。