HTTP解析(3)------连接管理(1)

TCP连接

        TCP/IP是全球计算机及网络设备都在使用的一种常用的分组交换网络分层协议集。客户端应用程序可以打开一条TCP / IP 连接,连接到可能运行在世界任何地方的服务器应用程序。一旦连接建立起来,在客户端和服务器的的计算机之间交互的报文就永远不会丢失、受损和失序。

        一、TCP的可靠数据管道
                 TCP为HTTP提供了一条可靠的比特传输管道。从TCP连接一端填入的字节会从另一端以原有的顺序、正确的传送过来。

HTTP解析(3)------连接管理(1)_第1张图片
Web浏览器通过TCP连接与Web服务器进行交互

        二、TCP流是分段的,由IP分组传送     
                TCP的数据是通过名为IP分组的小数据块来发送的      

HTTP解析(3)------连接管理(1)_第2张图片
HTTP和HTTPS网络协议栈

                HTTP要传送一条报文时,会以流的形式将报文数据的内容通过一条打开的TCP连接按序传输。TCP收到数据流之后,会将数据流砍成被称作段的小数据块,并将段封装在IP分组中,通过因特网进行传输。每个IP分组包括(1、IP分组首部【包含了源和目的IP地址、长度和其他标记】。2、TCP段首部【包含了TCP端口号、TCP控制标记、以及用于数据排序和完整性检查的数字值】。3、TCP数据块)。

        三、保持TCP连接的正确运行
                TCP是通过端口号来保持所有这些连接的正确运行。TCP连接是通过4个值来识别的: <源IP地址、源端口号、目的IP地址、目的端口号>这四个值一起唯一地定义了一条连接,两条不同的TCP连接不能拥有4个完全相同的地址组件值

HTTP解析(3)------连接管理(1)_第3张图片
承载TCP段的IP分组,它承载了TCP数据流中的小块数据

        四、用TCP套接字编程

HTTP解析(3)------连接管理(1)_第4张图片
对TCP连接进行编程所需的常见套接字接口函数

                套接字API允许用户创建端点的数据结构将这些端点与远程服务器的TCP端点进行连接并对数据流进行读写。

HTTP解析(3)------连接管理(1)_第5张图片
TCP客户端与服务器是如何通过TCP套接字接口进行通讯的

TCP性能的考虑

        HTTP紧挨着TCP,位于TCP的上层,所以HTTP事务的性能在很大程度上取决于底层TCP通道的性能。

        一、HTTP事务的时延

HTTP解析(3)------连接管理(1)_第6张图片
HTTP事务主要的连接、传输以及处理时延

        HTTP的时延有一下几种原因:(1)、客户端首先需要根据URI确定Web服务器的IP地址和端口号。(2)、接下来,客户端会向服务器发送一条TCP连接请求,并等待服务器回送一个请求接受应答。(3)、一旦连接建立起来了,客户端就会通过新建立的TCP管道来发送HTTP请求。数据到达时,Web服务器会从TCP连接中读取请求报文,并对请求进行处理。(4)、然后,Web服务器会回应HTTP响应。        
        【这些TCP网络延时取决于硬件速度,网络或者服务器的负载,请求响应报文的尺寸,客户端与服务器距离,TCP技术的复杂性】

        二、性能聚焦区域
                最长见的TCP时延:(1)TCP连接建立握手;(2)TCP慢启动拥塞控制;(3)数据聚集的Nagle算法;(4)用于捎带确认的TCP延迟确认算法;(5)TIME_WAIT时延和端口耗尽。

        三、TCP连接的握手的时延

HTTP解析(3)------连接管理(1)_第7张图片
一条新的TCP连接在发送数据前,TCP要传送两个IP分组来建立连接

        TCP连接握手的步骤:
                (1)请求新的TCP连接时,客户端要向服务器发送一个小的TCP分组(通常40~60字节)。这个分组中设置了一个SYN标记,说明这是一个连接请求。
                (2)如果服务器接受了连接,就会对一些连接参数进行计算,并向客户端发送一个TCP分组,这个分组中的SYN和ACK标记都被置位,说明连接请求已被接受。            
                (3)最后,客户端向服务器回送一条确认消息,通知它连接已成功建立。现代的TCP栈都允许客户端在这个确认分组中发送数据。

        四、延迟确认
                每个TCP段都有一个序列号和数据完整性校验和。每个段的接受者收到完好的段时,都会向发送者回送小的确认分组。如果发送者没有在指定的窗口时间内收到确认信息,发送者就认为分组已经被破坏或损毁,并重发数据。由于确认报文很小,所以允许TCP相同方向输出数据分组中对其进行“捎带”,TCP返回的确认信息与输出的数据分组结合在一起,更有效利用网络,为增加确认报文找到同向传输数据分组的可能性,TCP栈实现一种延时确认算法。
        延时确认算法会在一个特定的窗口内将输出确认放在缓冲区,以寻找能够捎带它的输出数据分组。如果在哪个时间段内没有输出数据分组,就将确认信息放在单独的分组中传送。

        五、TCP慢启动
                TCP数据传输的性能还取决于TCP连接的试用期。TCP连接会随着时间进行自我“调谐”,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐被称为TCP慢启动,用于防止因特网的突然过载和拥塞。
                TCP慢启动限制了一个TCP端点在任意时刻可以传输的分组数。如果每个HTTP事务由大量数据发送,要先发送一个分组,确认后在发送两个分组,并且每个分组都要进行确认,这种方式称为“打开拥塞窗口”。

        六、Nagle算法与TCP_NODELAY
                Nagle算法试图在发送一个分组之前,将大量TCP数据绑定在一起,以提高网络效率。Nagle算法鼓励发送全尺寸的段。只有当所有其他分组都被确认之后,Nagle算法才允许发送非全尺寸的分组。如果其他分组仍然在传输过程中,就将那部分数据缓存起来。只有当挂起分组被确认,或者缓存中基类了足够发送一个全尺寸分组的数据时,才会将缓存的数据发送出去。
                HTTP应用程序常常会在自己的栈中设置参数TCP_NODELAY,禁用Nagle算法,提高性能。

        七、TIME_WAIT累积与端口耗尽
                当某个TCP端点关闭TCP连接时,会在内存中维护一个小的控制块,用来记录最近所关闭连接的IP地址和端口号。                
                 在只有一个客户端和一台Web服务器的异常情况下,构建一条TCP连接的4个值
                        
                其中的三个都是固定的----只有源端口号可以随意改变
                          
                   客户端每次连接到服务器上去时,都会获得一个新的源端口,以实现连接的唯一性。即使没有遇到端口耗尽问题,也要特别小心有大量连接处于打开状态的情况,或为处于等待状态的连接分配了大量控制块的情况。再有大量打开连接或控制块的情况下,有些操作系统的速度会严重减缓。

你可能感兴趣的:(HTTP解析(3)------连接管理(1))