zoukankan      html  css  js  c++  java
  • 【计算机网络】TCP通信的细节及TCP连接对HTTP事务处理性能影响

    从三次握手的细节说起

    刚开始尝试使用java等后端语言写IO流,或用套接字(socket)实现简单C/S通信的同学们,常常会接触到的一个概念:就是所谓的“三次握手”,socket作为一个API接口,封装了TCP/IP通信的细节,使我们只需要调用简单的接口而无需关心具体的实现,那么

    Socket三次握手的细节是如何实现的?

    三次握手的过程实际上就是相互抛/接(3次)包的过程

    三次握手的过程:

    1. 客户端抛 --> SYN包(建立连接包) --> 服务器接收
    2. 服务器抛 --> ACK包(确认应答包)和SYN包 --> 客户端接收
    3. 客户端抛 --> ACK包(确认应答包) --> 服务器接收

     

    建立连接后客户端便可从服务器接收数据包进行通信

    注意三次握手时抛/接的包和连接建立后收发的数据包是不同的!前者是只携带有TCP报文和IP报文头部的包,不携带具体的数据内容,而后者除了TCP和IP报文头部还携带了具体的数据

    建立连接后的通信过程:

    l  发送端  -->   数据包  -->  接收端

    l  接收端  -->  ACK确认应答  --> 发送端

    TCP是全双工通信:

    这里的发送端/接收端可以是客户端/服务器,也可以是服务器/客户端,因为TCP通信是全双工通信,所以建立连接后可以同时进行以下两个过程:

    A.   客户端 --> 数据包 --> 服务器 --> ACK应答 --> 客户端

    B.   服务器 --> 数据包 --> 客户端 --> ACK应答 --> 服务器

     

    ACK包/FIN包/SYN包的具体组成:

    如下图三次握手时交换包的具体组成:TCP首部+IP首部(无具体数据内容!)

     

    建立连接后收发数据包的具体组成:

    (TCP首部+IP首部+具体数据)

     

    TCP通信的单位——段

    TCP通信以段为单位,段由TCP数据和TCP首部组成

    如果再将网络层的IP协议考虑进去的话,TCP/IP通信以IP分组为单位

     

    IP分组=TCP段+IP首部=(TCP数据+TCP首部)+IP首部

    注:TCP首部也算是IP数据包的一部分

    TCP的"串行式"连接和"管道式"连接

    A.TCP“串行式”连接

    建立连接后,最简单的TCP通行是串行进行的,单次通信发送端只能发送一个段。只有在接收到接收端发来的ACK应答包前,才能将第二个段发出去,这段时间内发送端只能空等待

     

    B.TCP“管道式”连接

    很显然,串行通信效率很低,所以我们想,能不能在第一个段发送出去后,无需等待ACK应答的返回就发送第二个段呢?这样效率不就提高了吗?基于这个理念人们提出了窗口的概念:

    窗口:无需等待ACK应答的返回就可以连续发送的段的数量的最大值

     

    上图中,窗口大小为4,段的发送就好像管道一般,窗口大小就好比是“管道”的流量

    TCP连接对HTTP事务处理性能的影响

    HTTP作为一种应用层协议,其事务处理要依赖于传输层的TCP协议机制的运作,所以HTTP事务处理的性能瓶颈很大程度上来源于TCP连接,体现在下面几点:

    • TCP连接时间的消耗
    • TCP的慢启动机制
    • TCP采用的Nagle算法

    每次TCP连接带来的时延是HTTP时延的重要来源

     

    解决方法:采用HTTP持久连接技术消除多次连接的时延

     

     TCP的慢启动机制

    TCP慢启动机制体现在两方面:

    a.限制初次启动时发送的段的数量:

    上面提到了TCP窗口的概念,但TCP能不能一开始就发送窗口上限的段呢?答案是不能的,因为这会造成网络拥塞,为了避免这个问题,TCP采用了慢启动机制,一开始发送的段数为1,抛接完成后将段数上升为2,然后是4,再然后是8,段数将以指数形式递增,直到窗口大小的上限

     

    b.设置慢启动阀值

    由上图可以看到,当达到拥堵窗口的大小时,将导致超时重发,这时初次发送的段数又从1开始指数递增,不同的地方是:这时候设置了慢启动阀值(拥堵窗口的一半),发送的段数达到慢启动阀值时,将不再以指数形式上升,而是按一定的比例缓慢得直线上升

     

     解决方法:正是因为单次TCP连接的时延和TCP的慢启动机制,HTTP的持久连接才显得尤为重要

    Nagle算法

    TCP协议本身并没有有规定发送单个段的数据包大小的最小值,那让我们想想,如果我们试图在单个段中发送几个字节的数据包会怎样呢?如果这样,TCP将通过Nagle算法的机制来提高网络利用率,很显然,将包含数据量极小的段都单独发出去将会极大降低网络利用率,所以通过Nagle算法,不直接派发小数据量的段,而是选择将它们绑定在一起,当达到要求尺寸后才派发出去,这造成了时间上的延迟。Nagle算法是一把双刃剑,它提高了网络利用率,但同时造成了TCP的时延

    解决方法:Nagle是可以选择关闭的,当然,前提是你得在TCP通信中写入大块的数据

     

    参考资料:

    《HTTP权威指南》作者古尔利

    《图解TCP/IP》作者竹下隆史

     

  • 相关阅读:
    SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因
    微软BI 之SSIS 系列
    微软BI 之SSIS 系列
    微软BI 之SSIS 系列
    微软BI 之SSIS 系列
    微软BI 之SSIS 系列
    微软BI 之SSAS 系列
    微软BI 之SSRS 系列
    微软BI 之SSRS 系列
    配置 SQL Server Email 发送以及 Job 的 Notification通知功能
  • 原文地址:https://www.cnblogs.com/penghuwan/p/6606343.html
Copyright © 2011-2022 走看看