一、TCP连接
过程:
a.浏览器解析出主机名
b.浏览器查询出这个主机名的IP地址
c.浏览器获得端口号
d.浏览器发起到ip:port的连接(TCP连接)
e.浏览器向服务器发送一条HTTP报文
f.浏览器从服务器读取HTTP响应报文
g.浏览器关闭连接
1.TCP的可靠数据管道
从TCP连接一端填入的字节会从另一端以原有的顺序、正确地传送出来
2.TCP流是分段的,由IP分组传送
HTTP会以流的形式将报文数据的内容通过一条打开的TCP连接按序传输,TCP收到数据流之后会把数据流砍成被称作段的小数据块,并将段分装在IP分组中,通过因特网进行传输
3.保持TCP连接的正确运行
通过端口号来保持连接的正确运行
TCP连接的识别:
<源IP地址、源端口号、目标IP地址、目标端口号>
二、对TCP性能的考虑
1.HTTP事务的时延
主要原因:
a.DNS查询
b.TCP连接请求
c.服务器处理http报文
d.服务器回送http响应
3.性能聚焦区域
a.TCP连接的握手延时
i.请求新的连接时,客户端向服务器端发送一个TCP分组,设置SYN标记
ii.服务器接收连接,会对一些连接参数进行计算,并回送一个TCP分组,包含SYN+ACK标记
iii.最后客户端向服务器端回送一条确认信息ACK,通知服务器连接已建立
b.延迟确认
TCP可以将确认信息和输出的数据分组一起发送出去,TCP现将确认信息存放在缓冲区中,利用延迟算法等待输出的数据分组
c.TCP慢启动
起初会限制连接的最大速度,然后数据成功传输,随着时间的推移会提高传输的速度
d.Nagle算法与TCP_NODELAY
.应用程序可以将任意大小的数据放入TCP栈中,但如果TCP将大量小数据放入TCP栈中会严重影响网络性能
.Nagle算法试图在发送数据之前将大量TCP数据绑定在一起
.只有其他分组都确认以后,Nagle算法才会发送非全尺寸的分组
.小的http报文无法填满一个分组,Nagel算法会进行等待那些永远不会到来的额外数据而产生延迟,影响性能
.Nagle算法会阻止数据的发送,直到有数据分组为止
.HTTP应用程序会设置TCP_NODELAY来禁用Nagle算法
e.TIME_WAIT累积与端口耗尽
.TCP会在内存中维护一个小的控制块并且存储最近所关闭的IP地址和端口号,这类信息会维持2秒钟(2MSL),以处理连接关闭4步中的任一步
丢失的情况
.客户端每次连接上服务器时都会获得一个新的源端口,以实现连接的唯一性
三、HTTP连接的处理
1.常被误解的Connection首部
a.Connection首部可以承载3种不同类型的标签
.HTTP首部字段名,列出了只与此连接有关的首部
.任意标签值,用于描述此连接的非标准选项
.值close,说明完成此操作之后需关闭这条持久连接
b.HTTP应用程序收到带有Connection首部的请求时,接收端会解析发送的请求,在转发给下一跳之前删除Connection首部
2.串行事务处理延时
a.并行连接
通过多条TCP连接发起并发的HTTP请求
b.持久连接
重用TCP连接,以消除连接及关闭的延时
c.管道化连接
通过共享的TCP连接发起并发的HTTP请求
d.复用的连接
交替传送请求和响应
四、并发连接
HTTP允许客户端打开多条连接,并行的执行多个HTTP连接(可以在多台服务器上进行连接)
1.并行连接可能会提高页面的加载速度
2.并行连接不一定快
.客户端网络带宽不足
.打开大量连接会消耗很多内存资源,从而引发自身的性能问题
.浏览器会将并发连接数限制为一个较小的值
五、持久连接
.应用程序发起同一台服务器的多次连接
.HTTP11允许HTTP设备在事务处理结束之后仍然保持正在打开的状态
1.持久以及并行连接
a.并行连接缺点
.每个事务都会打开/关闭一条新的连接,会耗费时间和带宽
.由于TCP慢启动的存在,每条新连接的性能都会降低
.可打开的并行连接数量实际上是有限的
b.持久连接的两种类型
HTTP/1.0 + keep-Alive连接
HTTP/1.1 + persistent连接
2. HTTP/1.0 + keep-Alive连接
3.Keep-Alive操作
客户端包含Connection:Keep-Alive首部,如果服务器愿意为下一条连接请求保持打开状态,就在响应中包含相同的首部,如果没有,客户端
会在发送响应报文后关闭连接
4.Keep-Alive选项
.timeout
服务器希望将连接保持在活跃状态的时间
.max
服务器还希望为多少个事务保持此连接的活跃状态
5.持久连接
HTTP1.1默认支持持久连接
要在事务完成后关闭连接可以在首部加入Connection-Close
6.持久连接的限制和规则
.发送了Connection-Close首部后,客户端就无法在那条连接上发送更多请求了
.只有当实体部分的长度和相应的Content-Length一致,或者用分块传输编码连接才能保
持持久连接
.HTTP1.1的代理能够分别管理与客户端和服务器的持久连接,每个持久连接只适合于一
跳传输
.HTTP1.1设备可以在任意时刻关闭连接
.HTTP1.1应用程序必须能够从异步关闭中恢复过来
六、管道化连接
将多条请求放入队列,当第一条请求发送时,第二、三条请求跟着发送
七、关闭连接的奥秘
1.正常关闭连接
a.完全关闭与半关闭
完全关闭:关闭TCP连接的输入输出(close())
半关闭:关闭输入或输出的一边(shutdown)
b.TCP关闭及重置错误
关闭连接的输出信道总是安全的
关闭连接的输入信道不安全,当另一端向其发送数据时,会产生TCP连接重置,并会清空操
作系统缓冲区
c.正常关闭