HTTP权威指南------连接管理
连接管理
HTTP是使用TCP连接的,HTTPS是在HTTP与TCP之间插入一层SSL的加密层保证传输安全,最后还是以TCP进行下层的传输。
TCP连接
TCP为HTTP提供可靠的比特传输,并且保证传输的有序性和正确性。
TCP流分段与IP分组传输
显然TCP还需要更下层的IP协议进行协助传输数据,TCP将HTTP报文的内容以流的形式进行有序传输,并将其划分为更小的TCP段,装到IP分组中交由IP协议进行传输,这些操作都是对上层透明的。
与HTTP报文类似,IP分组和TCP段也是含有首部的,于是一个IP分组中包含三个部分,IP分组与TCP段的首部,还有一个TCP数据块。其中TCP段首部与TCP数据块构成IP分组的数据部分。
IP分组的首部包含源与目的地址的IP,还有整个分组的相关信息,TCP首部则包含了相应的端口号,TCP控制标记等信息。
TCP连接识别
使用端口号来对同一时间内多个TCP连接进行区分,并以此保证其正确运行。相应的连接的表示以IP地址+端口号的组合来进行标记,一条连接对应一个源IP地址+端口号和一个目的IP地址+端口号。
相应的连接之间可以使用相同的目的端口号,或者使用相同的源IP地址,但不存在两个连接使用的四个部分完全相同。
TCP套接字与编程
通过系统中的相关API(如UNIX中的套接字API),可以实现对于TCP连接的编程,而相应的API都隐藏了TCP与IP的细节(包括底层协议的握手细节,TCP流与IP分组间分段重装的细节);其允许操作进行TCP端点数据结构的创建,并与远程的服务器TCP端点连接与数据流的读写。
建立连接是需要时间的,从服务器监听开始等待连接,到建立TCP连接完成,其时间花费不仅取决于传输的距离,还有服务器的负载,网络的拥挤程度等。
TCP的性能
由于TCP于HTTP在协议栈中的位置精密相连,所以TCP的性能会直接影响HTTP事务的性能。
HTTP事务延迟
显然HTTP处理事务的时间在整个过程中的占比是极小的,除非服务器内部出现长时间的等待,否则HTTP的时延主要由TCP时延构成。
- URL到IP+端口需要通过DNS服务器解析,相应的时间会有花费。
- 客户端与服务器间建立TCP连接会有时间消耗(三次握手),如果有多个HTTP连接的话,就会有多个TCP的连接过程,对应的时间延迟会更大。
- 连接建立后相应的请求发送也需要时间,请求到达后Web服务器会对其处理,相应的响应返回也需要时间。
总的来说时延的原因是复杂的,有硬件的因素,网络与服务器的负载,请求与响应报文的大小,传输距离等等,与TCP协议的复杂程度也有很大关系。
TCP的相关延迟大致可以包含以下几个因素:
- TCP连接的握手延时
- TCP慢启动拥塞控制
- 数据聚集的Nagle算法
- 用于捎带确认的TCP确认算法
- TIME_WAIT时延与端口耗尽
TCP连接的握手延时
TCP通过一系列的IP分组来进行参数沟通,连接有关的参数会在这些交互中确定,如果传输的数据量过小,对应的有效传输率就会很低,HTTP性能就会下降。
- 第一次握手:报文的SYN字段被置为1,客户端选取一个起始序号放到报文中一并发过去。连接的一方向对方说明自己的存在。
- 第二次握手:服务器收到了数据包,从中提取SYN字段,并且进行相应的处理,发送一个数据包告知客户端。数据报中的确认字段为客户端传来的序号加一,同时服务器会选一个自己的起始序号放入报文序号段处,并将SYN字段置1。
- 第三次握手:客户端收到服务端的报文后时,进行相应的处理,并发送第三次的握手包,其中的序号字段为之前的加一,确认字段为接受到的序号加一。在最后一个握手包中就可以进行相应的数据捎带传输了。
这些握手分组对上层都是透明的,上层只能察觉相应的时延,HTTP事务中的数据一般都不多,相应的用于数据传输的只有第三次握手