TCP/IP协议

跨网络的主机间通讯

在建立通信连接的每一端,进程间的传输要有两个标志:
IP地址和端口号,合称为套接字地址 socket address
客户机套接字地址定义了一个唯一的客户进程
服务器套接字地址定义了一个唯一的服务器进程

SOCKET套接字

  1. Socket:套接字,进程间通信IPC的一种实现,允许位于不同主机(或同一主机)上不同进程之间进行通信和数据交换,SocketAPI出现于1983年,4.2 BSD实现
  2. Socket API:封装了内核中所提供的socket通信相关的系统调用
  3. Socket Domain:根据其所使用的地址
    AF_INET:Address Family,IPv4
    AF_INET6:IPv6
    AF_UNIX:同一主机上不同进程之间通信时使用
  4. Socket Type:根据使用的传输层协议
    SOCK_STREAM:流,tcp套接字,可靠地传递、面向连接
    SOCK_DGRAM:数据报,udp套接字,不可靠地传递、无连接
    SOCK_RAW: 裸套接字,无须tcp或udp,APP直接通过IP包通信

客户/服务器程序的套接字函数

套接字相关的系统调用:

socket(): 创建一个套接字
bind(): 绑定IP和端口
listen(): 监听
accept(): 接收请求
connect(): 请求连接建立
write(): 发送
read(): 接收
close(): 关闭连接

Socket通信示例部分1:服务器端Server-tcpserver.py

import socket            :引用socekt的模块API,类似shell中source
HOST='192.168.36.6'
PORT=9527
BUFFER=4096
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind((HOST,PORT))
sock.listen(3)
print('tcpServer listen at: %s:%s\n\r' %(HOST,PORT))
while True:
client_sock,client_addr=sock.accept()
print('%s:%s connect' %client_addr)
while True:
recv=client_sock.recv(BUFFER)
if not recv:
client_sock.close()
break
print('[Client %s:%s said]:%s' %(client_addr[0],client_addr[1],recv))
client_sock.send(‘I am tcpServer and has received your message')
sock.close()

Socket通信示例部分2:客户端Client-tcpserver.py

import socket
HOST='192.168.32.6'
PORT=9527
BUFFER=4096
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((HOST,PORT))
sock.send(‘hello, tcpServer!,I am TcpClient')
recv=sock.recv(BUFFER)
print('[tcpServer said]: %s' % recv)
sock.close()

Socket通信示例部分3:linux下操作步骤

直接先在服务器端上python Server-tcpserver.py命令开启服务器端,然后在客户端上python Client-tcpserver.py命令开启客户端即可测试通信效果。

HTTP服务通信过程

HTTP相关术语

  1. http: Hyper Text Transfer Protocol, 80/tcp (超文本传输协议)
  2. html: Hyper Text Markup Language 超文本标记语言,编程语言
    示例:把下面的代码直接复制并创建一个html后缀文件打开即可,浏览器打开的时候会自动渲染显示效果


html语言测试



你好

我的博客欢迎你

  1. CSS: Cascading Style Sheet 层叠样式表
  2. js: javascript
  3. MIME: Multipurpose Internet Mail Extensions 多用途互联网邮件扩展
    /etc/mime.types
    • 格式:major/minor
      text/plain
      text/html
      text/css
      image/jpeg
      image/png
      video/mp4
      application/javascript
    • 参考:http://www.w3school.com.cn/media/media_mimeref.asp

HTTP协议

  1. http/0.9:
    • 1991,原型版本,功能简陋,只有一个命令GET。
    • GET/index.html ,服务器只能回应HTML格式字符串,不能回应别的格式
  2. http/1.0:
    • 1996年5月,支持cache, MIME, method
    • 每个TCP连接只能发送一个请求,发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接
    • 引入了POST命令和HEAD命令
    • 头信息是 ASCII 码,后面数据可为任何格式。服务器回应时会告诉客户端,数据是什么格式,即Content-Type字段的作用。这些数据类型总称为MIME 多用途互联网邮件扩展,每个值包括一级类型和二级类型,预定义的类型,也可自定义类型, 常见Content-Type值:text/xml image/jpeg audio/mp3
  3. http/1.1:1997年1月
    • 引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。对于同一个域名,大多数浏览器允许同时建立6个持久连接
    • 引入了管道机制(pipelining),即在同一个TCP连接里,客户端可以同时发送多个请求,进一步改进了HTTP协议的效率
    • 新增方法:PUT、 PATCH、 OPTIONS、 DELETE
    • 同一个TCP连接里,所有的数据通信是按次序进行的。服务器只能顺序处理回应,前面的回应慢,会有许多请求排队,造成"队头堵塞"(Head-of-line blocking)
    • 为避免上述问题,两种方法:一是减少请求数,二是同时多开持久连接。网页优化技巧,如合并脚本和样式表、将图片嵌入CSS代码、域名分片(domain sharding)等
    • HTTP 协议不带有状态,每次请求都必须附上所有信息。请求的很多字段都是重复的,浪费带宽,影响速度

HTTP1.0和HTTP1.1的区别

  1. 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match,If-None-Match等更多可供选择的缓存头来控制缓存策略
    • 1.0的缓存机制的利用过期时间问题在于假如客户端和服务器端的时间不一致导致问题。
  2. 带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),方便了开发者自由的选择以便于充分利用带宽和连接
    • 1.1中的比如说网页图片的略缩图,或者说淘宝的图片放大功能等,这些图片传过来的其实都是原图片的部分资源。
  3. 错误通知的管理,在HTTP1.1中新增24个状态响应码,如409(Conflict)表示请求的资源与资源当前状态冲突;410(Gone)表示服务器上的某个资源被永久性的删除
  4. Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。 HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)
  5. 长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection:keep-alive,弥补了HTTP1.0每次请求都要创建连接的缺点

HTTP1.0和1.1现存的问题

  1. HTTP1.x在传输数据时,每次都需要重新建立连接,无疑增加了大量的延迟时间,特别是在移动端更为突出
  2. HTTP1.x在传输数据时,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份,无法保证数据的安全性
  3. HTTP1.x在使用时,header里携带的内容过大,增加了传输的成本,并且每次请求header基本不怎么变化,尤其在移动端增加用户流量
  4. 虽然HTTP1.x支持了keep-alive,来弥补多次创建连接产生的延迟,但是keepalive使用多了同样会给服务端带来大量的性能压力,并且对于单个文件被不断请求的服务(例如图片存放网站),keep-alive可能会极大的影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间

改进http1.X

HTTPS

  1. 为解决安全问题,网景在1994年创建了HTTPS,并应用在网景导航者浏览器中。最初,HTTPS是与SSL一起使用的;在SSL逐渐演变到TLS时(其实两个是一个东西,只是名字不同而已),最新的HTTPS也由在2000年五月公布的RFC2818正式确定下来。 HTTPS就是安全版的HTTP,目前大型网站基本实现全站HTTPS
  2. HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费
  3. HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的
  4. HTTP和HTTPS使用的是不同的连接方式,端口不同,前者是80,后者是443
  5. HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题
  6. HTTPS 中的SSL握手等过程降低用户访问速度,但是只要经过合理优化和部署,HTTPS 对速度的影响完全可以接受

SPDY

SPDY:2009年,谷歌研发,综合HTTPS和HTTP两者有点于一体的传输协议,主要特点:

  • 降低延迟,针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)。多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率
  • 请求优先级(request prioritization)。多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。 SPDY允许给每个request设置优先级,重要的请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,可以保证用户能第一时间看到网页内容
  • header压缩。 HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量
  • 基于HTTPS的加密协议传输,大大提高了传输数据的可靠性
  • 服务端推送(server push),采用了SPDY的网页,例如网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了

HTTP2

http/2.0:2015年

  • HTTP2.0是SPDY的升级版
  • 头信息和数据体都是二进制,称为头信息帧和数据帧
  • 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,避免了“队头堵塞“,此双向的实时通信称为多工(Multiplexing)
  • 引入头信息压缩机制(header compression),头信息使用gzip或compress压缩后再发送;客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,不发送同样字段,只发送索引号,提高速度
  • HTTP/2 允许服务器未经请求,主动向客户端发送资源,即服务器推送(server push)
    HTTP2.0和SPDY区别:
  • HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS
  • HTTP2.0 消息头的压缩算法采用 HPACK,而非 SPDY 采用的 DEFLATE

注意点1(http协议简介)

  1. https的建立安全加密的连接通道的过程和SSH基本上相同(交换双方公钥以及生成随机数对称密钥的过程),它俩都是应用层的用于网路传输安全的协议,只不过利用下层的TCP协议传输数据(https是http加了SSL协议在应用层和传输层之间,不过现在一般把直接和应用层和在一起单独看做一个协议)。还有mysql,dns,telnet等协议都是应用层协议。
    • 判断是不是应用层协议的就是看看是不是拥有客户端利用了自己的通信规则,比如手机上的软件,微信支付宝等等都有自己的加密通信协议,都属于应用层协议。
  2. 套接字地址是用主机的IP和应用的端口号来组成的,用于应用之间跨网络通信。
    • linux中的socekt的API相关接口系统调用可用man (2) socket查看,可用于基于socket的网络通信的软件开发的调用,这个API使用C编写的。
    • 只要是基于网络通信的应用协议,下面都可利用到socket进行通讯,而不仅仅包括http协议。
    • 上面关于套接字的图中简单描述了两个应用利用socket进行网络通讯的过程。其中建立一个连接就需要打开一个socket,还有专门用于负责监听的socket.
  3. 特别注意的复习知识点:注意,linux下的1-1024端口号只能用于系统管理员root使用,不能用于普通用户使用,普通用户使用的时候会被拒绝权限。
    • 比如上面python的例子中就利用的是大于1024的端口因此普通用户也可以开启此socket.再比如myslq的3306端口因为大于1024,因此就可用mysql这个普通用户开启使用。
    • 但是有些服务比如SSH和http服务想要用普通开启端口,因为它默认的端口是22和80,小于1024,它们的开启服务的逻辑是先用root身份开启服务的主进程,然后再在这个主进程的基础上用各自的普通用户(比如http的apache用户)开启其他的端口(小于或者大于1024都可以了),因为它是被主进程开启的子进程的端口,相当于还是利用root身份开启的,只不过用普通用户来使用。,实际上mysql的子一个进程也是root身份开启的,后面的子进程才用的普通用户身份。
  4. html语句是主要用于静态页面(动态页面需要软件开发和调用),CSS是为了将不同的各种页面和设置效果进行统一标准,类似于函数,需要哪种页面格式(比如标题,大小,颜色等) 直接调用CSS中的格式即可,这样就可以简化页面,不需要每一个页面都要单独编辑设置。
    • html,css,javascript都是前端必须掌握的工具
    • MIME最初用于邮件中想要支持传输更多类型的文件,后来也被拿来用于http协议中了,它的支持格式可在/etc/mime.types中查看,linux中可以yum provides /etc/mime.types查看,并安装mailcap-2.1.41-2.el7.noarch包
    • MIME其中格式的类别写法为 '大类/小类'
    • 注意MIME和CSS(html)的区别,CSS也只是一个纯文本的格式而已,它属于mime中的text大类中的一个小类,只不过它标准化了文本格式,用起来方便。
  5. http1.0中增加了:
    • POST:用于上传文件到服务器端(各种类型文件)
    • head:只抓取http的报文头部信息,get的简化版命令,不抓取全部信息
  6. http1.1中又增加了长连接功能(非持久连接的概念就是每次(TCP三次握手)连接之后处理请求完毕之后就断开,这样可以减少服务器的资源占用,同时能够支持更多用户连接,每次连接仅下载完数据执行结果之后就断开,但是这样下次连接需要重新建立TCO的三次握手),长连接就是非持久连接的过程中,一次连接可以支持多个请求,而并非之前的一次连接只能支持一个请求。但终究还是非持久连接,如若没有请求和数据传输的话,过一会儿还是会断开的。

附加:在windows中的浏览器打开调试模式重新刷新就可以看到一个页面的各个资源来自的不同的服务器,同时还可以看到其他的一些信息。

HTTP工作机制

  1. 工作机制:
    http请求:http request
    http响应:http response
    一次http事务:请求<-->响应
  2. Web资源:web resource
    一个网页由多个资源构成,打开一个页面,会有多个资源展示出来,但是每个资源都要单独请求。因此,一个“Web 页面”通常并不是单个资源,而是一组资源的集合
    • 静态文件:无需服务端做出额外处理
      文件后缀:.html, .txt, .jpg, .js, .css, .mp3, .avi
    • 动态文件:服务端执行程序,返回执行的结果
      文件后缀:.php, .jsp ,.asp
  3. 提高HTTP连接性能
    • 并行连接:通过多条TCP连接发起并发的HTTP请求
    • 持久连接:keep-alive,长连接,重用TCP连接,以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接
    • 管道化连接:通过共享TCP连接发起并发的HTTP请求
    • 复用的连接:交替传送请求和响应报文(实验阶段)

HTTP连接请求

串行和并行连接

串行,持久连接和管道

URI

URI: Uniform Resource Identifier 统一资源标识,分为URL和URN

  1. URN: Uniform Resource Naming,统一资源命名
    示例: P2P下载使用的磁力链接是URN的一种实现
    magnet:?xt=urn:btih:660557A6890EF888666
  2. URL: Uniform Resorce Locator,统一资源定位符,用于描述某服务器某特定资源位置
  • 两者区别:URN如同一个人的名称,而URL代表一个人的住址。换言之,URN定义某事物的身份,而URL提供查找该事物的方法。 URN仅用于命名,而不指定地址

URL组成

://:@:/;?#ag>

scheme:方案,访问服务器以获取资源时要使用哪种协议
user:用户,某些方案访问资源时需要的用户名
password:密码,用户对应的密码,中间用:分隔
Host:主机,资源宿主服务器的主机名(用到DNS)或IP地址
port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号
path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔
params:参数,指定输入的参数,参数为名/值对,多个参数,用;分隔
query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔
frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔

URL示例:

1. rtsp://videoserver/video_demo/
 Real Time Streaming Protocol
2. https://list.jd.com/list.html?cat=670,671,672&ev=149_2992&sort=sort_totalsales15_desc&trans=1   :搜索
3. http://apache.org/index.html#projects-list   :片段

网站访问量

  1. IP(独立IP):即Internet Protocol,指独立IP数。一天内来自相同客户机IP地址只计算一次,记录远程客户机IP地址的计算机访问网站的次数,是衡量网站流量的重要指标
  2. PV(访问量): 即Page View, 页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并不是页面的来访者数量,而是网站被访问的页面数量
  3. UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过来访电脑的cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的
  • 注意不同的浏览器或者同一个浏览器但是不同的用户名密码(针对同一个网站,因为会造成cookie不同),都是会被看做不同的UV的,但此时IP相同(假如没有重新拨号)

网站统计:http://www.alexa.cn/rank/

  1. QPS:request per second,每秒请求数
    PV,QPS,并发连接数换算公式:
    • QPS= PV* 页⾯衍⽣连接次数(页面内的二次连接请求的小文件等)/ 统计时间(86400)
    • 并发连接数 =QPS * http平均响应时间
  2. 峰值时间:每天80%的访问集中在20%的时间里,这20%时间为峰值时间
    峰值时间每秒请求数(QPS)=( 总PV数 页⾯衍⽣连接次数)80% ) / ( 每天秒数* 20% )

Web服务请求处理步骤

Web访问响应模型

一次完整的http请求处理过程

  1. 建立连接:接收或拒绝连接请求
  2. 接收请求:接收客户端请求报文中对某资源的一次请求的过程

其中的Web访问响应模型(Web I/O)

  • 单进程I/O模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
  • 多进程I/O模型:并行启动多个进程,每个进程响应一个连接请求复用I/O结构:启动一个进程,同时响应N个连接请求
    实现方法:多线程模型和事件驱动
    1. 多线程模型:一个进程生成N个线程,每线程响应一个连接请求
    2. 事件驱动:一个进程处理N个请求,可以是不同用户的请求,分时间片进行处理请求并返还数据即可实现(比如利用CPU功能强大而IO速度慢,中间的多余时间用于CPU处理更多的请求)
  • 复用的多进程I/O模型:启动M个进程,每个进程响应N个连接请求,同时接收M*N个请求
  1. 处理请求:服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理元数据:请求报文首部

    HEADERS 格式 name:value

    示例:
    Host: https://blog.51cto.com/14228129 请求的主机名称
    Server: Apache/2.4.7

HTTP常用请求方式,Method
GET、 POST、 HEAD、 PUT、 DELETE、 TRACE、 OPTIONS

  1. 访问资源:
    服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源资源放置于本地文件系统特定的路径:DocRoot
    DocRoot 默认: /var/www/html
    /var/www/html/images/logo.jpg
    https://blog.51cto.com/14228129/images/logo.jpg

web服务器资源路径映射方式:
(a) docroot
(b) alias
(c) 虚拟主机docroot
(d) 用户家目录docroot

  1. 构建响应报文:
    一旦Web服务器识别除了资源,就执行请求方法中描述的动作,并返回响应报文。响应报文中 包含有响应状态码、响应首部,如果生成了响应主体的话,还包括响应主体
    1)响应实体:如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。响应报文中通常包括:
    描述了响应主体MIME类型的Content-Type首部
    描述了响应主体长度的Content-Length
    实际报文的主体内容
    2)URL重定向:web服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径
    永久重定向:http://www.360buy.com
    临时重定向:http://www.taobao.com
    3)MIME类型:
    Web服务器要负责确定响应主体的MIME类型。多种配置服务器的方法可将MIME类型与资源管理起来
    魔法分类:Apache web服务器可以扫描每个资源的内容,并将其与一个已知模式表(被称为魔法文件)进行匹配,以决定每个文件的MIME类型。这样做可能比较慢,但很方便,尤其是文件没有标准扩展名时
    显式分类:可以对Web服务器进行配置,使其不考虑文件的扩展名或内容,强制特定文件或目录内容拥有某个MIME类型
    类型协商: 有些Web服务器经过配置,可以以多种文档格式来存储资源。在这种情况下,可以配置Web服务器,使其可以通过与用户的协商来决定使用哪种格式(及相关的MIME类型)"最好"
  2. 送响应报文
    Web服务器通过连接发送数据时也会面临与接收数据一样的问题。服务器可能有很多条到各个客户端的连接,有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。服务器要记录连接的状态,还要特别注意对持久连接的处理。对非持久连接而言,服务器应该在发送了整条报文之后,关闭自己这一端的连接。对持久连接来说,连接可能仍保持打开状态,在这种情况下,服务器要正确地计算Content-Length首部,不然客户端就无法知道响应什么时候结束了
  3. 记录日志
    最后,当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务

注意点2(HTTP协议具体过程):

  1. http打开页面的具体过程:
    • 首先打开页面输入域名之后(或者说电击一个按钮跳转页面),本地的DNS服务器会将其解析成IP地址(这个过程是DNS的过程了),得知IP之后,就会先进行TCP的三次握手建立双方的可信的相互连接。
    • 建立了TCP的通道连接之后就会经过上面的7个步骤,注意七大步(还有那一张图示中的)说的第一步的建立连接指的是http的请求连接,不是TCP的通道连接。
    • 服务器接受请求之后(这个过程没那么简单,因为多个用户并发连接这一台服务器等其它问题,不单单只有一个用户),对请求中的要求进行处理(比如get请求等等),然后继续按图中走下一步。
    • 构建响应的时候要把用户请求的数据进行http的报文头部封装,比如http(index.html),这里的http报文头部其实就是应用层的报文头部,然后经过下一层的TCP头部,后面的过程就不再赘述了,最终客户端解封装得到数据。
  2. 在1中这个下载资源的过程中有许多种方法(串行,并行,持久,管道化等),注意在上面的图示中演示的服务器并不仅仅指的是同一台服务器
    • 串行就是每次发起请求前,先进行TCP三次握手建立通讯连接,然后发起一个请求,得到结果数据,TCP四次挥手断开;然后进行第二次TCP三次握手...
    • 并行下载就是比如说在获取了index主页面之后,里面有其他的多个图片或者资源文件,此时要下载他们并非是上面串行的方式一个接着一个,而是同时并行发起请求(注意这里的同时发起请求指的是同时对不同的服务器进行TCP的3次握手(也就是同时打开本机的多个http请求的端口),然后请求数据,然后TCP四次挥手这样的过程,这里的串行和并行并没有考虑同一台服务器的多个不同资源的问题,假设同一台服务器有多个数据资源需要获取它也是每一个资源都进行一次这样的过程,也就是每一次都只下载一个资源),同时下载并显示出来。
    • 同一台服务器串行连接:类似上面的串行,不过是针对同一台服务器的不同资源,建立多次TCP连接,每次下载同一台服务器的一个资源,直到最后下载完毕。
    • 同一台服务器持久(长)连接:同一台服务器只建立一次TCP连接过程,在这长连接的时间段之内串行地把数据全部下载完毕之后再断开TCP连接。
    • 同一台服务器管道化持久(长)连接:同一台服务器只建立一次TCP连接,然后再这长连接的时间段之内并行地把数据全部下载完毕之后再断开TCP连接
    • 注意上面的前两个的串行和并行是同一个级别,后面3个的是同一个级别;前面指的是获取资源的服务器建立链接方式,后面指的是对单台服务器内资源下载的具体行为过程方式。后者是在前者的基础上进行的。
  3. Apache和nginx的服务器接收响应的时候,前者默认是多进程IO模型,后者默认是复用的多进程IO模型。因此后者性能更好(因为进程占用资源多),但前者更稳定。