HTTP Connection 头(header)说明:keep-alive和closer的区别

98 篇文章 1 订阅
82 篇文章 3 订阅

HTTP Connection 头(header)说明:keep-alive和closer的区别

前言

在http请求时,我们一般会在request header 或 response header 中看到”Connection:Keep-Alive”或 “Connection:close”,这里具体的含义是有关http 请求的是否保持长连接,即链接是否复用,每次请求是复用已建立好的请求,还是重新建立一个新的请求。
而在实际生产环境中,可能会受到ECS/VM 的连接数限制而会对该配置项进行选择调配。例如VM规格只能支持65535个链接,如果链接不复用,都是短连接的话,并发过高的情况下,会直接把VM的连接数打满导致出现问题等,下面来详细说明下这个配置项。

基本释义

Connection 头(header) 决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。
更加官方的说明可见:RFC 2616

https://tools.ietf.org/html/rfc2616#section-8

详细说明

HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。

  • 短连接
    所谓短连接,就是每次请求一个资源就建立连接,请求完成后连接立马关闭。每次请求都经过“创建tcp连接->请求资源->响应资源->释放连接”这样的过程

  • 长连接
    所谓长连接(persistent connection),就是只建立一次连接,多次资源请求都复用该连接,完成后关闭。要请求一个页面上的十张图,只需要建立一次tcp连接,然后依次请求十张图,等待资源响应,释放连接。

  • 并行连接
    所谓并行连接(multiple connections),其实就是并发的短连接。


具体client和server要从短连接到长连接最简单演变需要做如下改进:
client发出的HTTP请求头需要增加Connection:keep-alive字段
Web-Server端要能识别Connection:keep-alive字段,并且在http的response里指定Connection:keep-alive字段,告诉client,我能提供keep-alive服务,并且”应允"client我暂时不会关闭socket连接

在HTTP/1.0里,为了实现client到web-server能支持长连接,必须在HTTP请求头里显示指定

Connection:keep-alive

在HTTP/1.1里,就默认是开启了keep-alive,要关闭keep-alive需要在HTTP请求头里显示指定

Connection:close

现在大多数浏览器都默认是使用HTTP/1.1,所以keep-alive都是默认打开的。一旦client和server达成协议,那么长连接就建立好了。

在http1.1中request和reponse header中都有可能出现一个connection头字段,此header的含义是当client和server通信时对于长链接如何进行处理。

在http1.1中,client和server都是默认对方支持长链接的, 如果client使用http1.1协议,但又不希望使用长链接,则需要在header中指明connection的值为close;如果server方也不想支持长链接,则在response中也需要明确说明connection的值为close.

不论request还是response的header中包含了值为close的connection,都表明当前正在使用的tcp链接在请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了。 HTTP Connection的 close设置允许客户端或服务器中任何一方关闭底层的连接双方都会要求在处理请求后关闭它们的TCP连接。

Nginx keepa-alive配置

具体到Nginx的HTTP层的keepalive配置有

keepalive_timeout

    Syntax: keepalive_timeout timeout [header_timeout];
    Default:    keepalive_timeout 75s;
    Context:    http, server, location

The first parameter sets a timeout during which a keep-alive client connection will stay open on the server side. The zero value disables keep-alive client connections. The optional second parameter sets a value in the “Keep-Alive: timeout=time” response header field. Two parameters may differ.

keepalive_requests

    Syntax: keepalive_requests number;
    Default:    keepalive_requests 100;
    Context:    http, server, location

Sets the maximum number of requests that can be served through one keep-alive connection. After the maximum number of requests are made, the connection is closed.
可以看看Nginx的关于 keepalive_timeout 是实现

./src/http/ngx_http_request.c

static void
ngx_http_finalize_connection(ngx_http_request_t *r){
...
    if (!ngx_terminate
         && !ngx_exiting
         && r->keepalive
         && clcf->keepalive_timeout > 0)
    {
        ngx_http_set_keepalive(r);
        return;
    }
...
}


static void
ngx_http_set_keepalive(ngx_http_request_t *r){

    //如果发现是pipeline请求,判断条件是缓存区里有N和N+1个请求同时存在
    if (b->pos < b->last) {

        /* the pipelined request */
    }
    // 本次请求已经结束,开始释放request对象资源
    r->keepalive = 0;

    ngx_http_free_request(r, 0);

    c->data = hc;

    // 如果尝试读取keep-alive的socket返回值不对,可能是客户端close了。那么就关闭socket
    if (ngx_handle_read_event(rev, 0) != NGX_OK) {
        ngx_http_close_connection(c);
        return;
    }

    //开始正式处理pipeline
    ...

    rev->handler = ngx_http_keepalive_handler;
    ...
    // 设置了一个定时器,触发时间是keepalive_timeout的设置
    ngx_add_timer(rev, clcf->keepalive_timeout);

    ...

}


static void
ngx_http_keepalive_handler(ngx_event_t *rev){

    // 发现超时则关闭socket
    if (rev->timedout || c->close) {
        ngx_http_close_connection(c);
        return;
    }

    // 读取keep-alive设置从socket
    n = c->recv(c, b->last, size);
    if (n == NGX_AGAIN) {
        if (ngx_handle_read_event(rev, 0) != NGX_OK) {
            ngx_http_close_connection(c);
            return;
        }
        ...
    }

    //此处尚有疑惑?
    ngx_reusable_connection(c, 0);

    c->data = ngx_http_create_request(c);
    // 删除定时器
    ngx_del_timer(rev);
    // 重新开始处理请求
    rev->handler = ngx_http_process_request_line;
    ngx_http_process_request_line(rev);
}

参考资料
http://nginx.org/en/docs/http/ngx_http_core_module.html

  • 13
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 如果要在本地配置 Hadoop 的开发环境,你需要安装 Hadoop 并创建一个伪分布式集群。 安装 Hadoop 的方法取决于你使用的操作系统。你可以通过以下两种方式之一来安装 Hadoop: 1. 使用软件包管理器(例如 apt-get 或 yum): - 在 Ubuntu 中,使用以下命令安装 Hadoop: ``` sudo apt-get install hadoop ``` - 在 CentOS 中,使用以下命令安装 Hadoop: ``` sudo yum install hadoop ``` 2. 从源代码安装 Hadoop: - 下载 Hadoop 源代码: ``` wget http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz ``` - 解压缩 Hadoop 源代码: ``` tar -xzvf hadoop-3.3.0.tar.gz ``` 接下来,你需要创建一个伪分布式集群,这意味着你在单个机器上运行 Hadoop,但是其表现得像一个分布式集群。 首先,你需要配置 Hadoop 的配置文件(例如 hadoop-env.sh),然后启动 Hadoop。 在完成这些步骤后,你就可以使用 Hadoop 了! ### 回答2: Hadoop是大数据处理的常用工具之一,其分布式存储和处理数据的特点,使其越来越受到关注。而为了使用Hadoop,我们需要先配置好开发环境,包括Hadoop的安装和伪分布式集群搭建。 Hadoop的安装: Hadoop是基于Java开发的,所以首先需要安装Java。建议安装Java8或以上版本,并确保JAVA_HOME环境变量已经配置好。 接下来,需要下载Hadoop安装包并解压缩。建议使用Apache官方的二进制发行版本,也可以选择Cloudera或Hortonworks等第三方发行版本。解压后,在Hadoop的根目录下,需要进行一些配置。 伪分布式集群搭建: 伪分布式集群是在单台机器上搭建的模拟集群,可以方便地进行Hadoop的学习和开发。要搭建伪分布式集群,需要进行如下配置: 1. 配置Hadoop的配置文件:修改Hadoop的配置文件hadoop-env.sh,并将HADOOP_CONF_DIR、HADOOP_MAPRED_HOME、HADOOP_COMMON_HOME、HADOOP_HDFS_HOME环境变量设置为Hadoop的安装目录。 2. 配置HDFS文件系统:在Hadoop的conf目录下,创建一个新的文件夹hadoop_data,并在该目录下创建三个子目录:namenode、datanode和tmp。其中,namenode和datanode分别是HDFS的主节点和从节点,而tmp目录是用来存放临时文件的。 3. 启动Hadoop:通过执行start-all.sh脚本,可以启动所有的Hadoop进程。如果一切正常,就可以通过http://localhost:50070访问HDFS的文件浏览器,和http://localhost:8088访问资源管理器,查看Hadoop的运行状态。 这样,伪分布式的Hadoop集群就搭建完成了。通过这个集群,可以进行各种Hadoop的开发操作,比如MapReduce程序的编写和执行等。当然,在实际应用中,还需要对Hadoop进行更加严格和复杂的配置和管理。 ### 回答3: Hadoop是一个开源的分布式计算框架,它能够对大规模的数据进行存储和处理,也因此得到了广泛的应用。如今Hadoop已成为大数据生态系统中的一个重要组成部分。为了能够使用Hadoop,我们需要先配置好开发环境。下面就让我们了解一下第二关:配置开发环境 - Hadoop安装与伪分布式集群搭建。 首先,我们需要先下载Hadoop,并安装Java环境。Hadoop支持多个版本,可以根据自己的需要进行选择。安装Java环境的方法也很简单,只需要到官网上下载对应的JDK,然后按照提示进行安装即可。 接下来,我们需要配置Hadoop的环境变量。在Linux系统下,直接在.bashrc文件中添加以下代码即可: export HADOOP_HOME=/path/to/hadoop export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin 其中,/path/to/hadoop改为实际的Hadoop安装路径。 当环境变量配置好后,我们就可以开始配置Hadoop的伪分布式集群。 首先,我们需要编辑hadoop-env.sh文件,将JAVA_HOME设置为我们刚刚安装的JDK路径。 然后,我们需要配置core-site.xml文件。在该文件中,我们需要指定Hadoop所使用的文件系统类型,这里我们使用HDFS。同时,我们还需要指定Hadoop的namenode,即Hadoop的主节点。将以下代码添加到core-site.xml文件中: <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration> 其中,localhost改为实际的主机名。 接下来,我们需要配置hdfs-site.xml文件。该文件用于配置Hadoop分布式文件系统(HDFS)。将以下代码添加到hdfs-site.xml文件中: <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/path/to/hadoop/data/nameNode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/path/to/hadoop/data/dataNode</value> </property> </configuration> 其中,/path/to/hadoop/data/nameNode和/path/to/hadoop/data/dataNode改为实际的数据存储路径。 最后,我们需要配置mapred-site.xml文件。该文件用于配置MapReduce计算框架。将以下代码添加到mapred-site.xml文件中: <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> 以上就是配置Hadoop伪分布式集群的所有步骤。我们可以通过启动命令,启动Hadoop集群。运行$HADOOP_HOME/sbin/start-all.sh即可启动Hadoop伪分布式集群。最后,我们可以通过JPS命令查看Hadoop的各个组件是否启动成功。 总之,配置好Hadoop的开发环境后,我们才能更好地使用Hadoop进行数据处理。通过以上步骤,我们可以轻松搭建Hadoop伪分布式集群,并开始进行数据处理工作。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值