java http2长连接_2.1 基础知识:从tcp到http,解析tomcat如何保持长连接

在高并发的项目中经常遇到服务请求无法访问的情况。本文从tomcat源码对keep-alive的实现进行探讨这个问题。

基础知识

http请求的keep-alive

http1.1开始支持长连接。请求的头部会带上

Connection: Keep-Alive

长连接的作用是减少断开连接和重新连接的开销,提高网络请求效率。http只是1个协议规范,具体的实现请见下文。

java的tcp网络通信是通过socket进行。下面是示例代码。

erverSocket serverSocket = new ServerSocket(8080, 1, InetAddress.getByName(“localhost”));

Socket socket = null;

InputStream is = null;

OutputStream os = null;

try {

socket = serverSocket.accept();//1.监听到客户端的连接

is = socket.getInputStream();

os = socket.getOutputStream();

Request request = Util.getRequest(is);//2.从输入流中读取数据,并根据Http协议转换成请求

Response response = Util.service(request);//服务器内部根据请求信息给出响应信息

os.writeResponse(response);//3.将响应信息写到输出流

} catch (Exception e) {

e.printStackTrace();

} finally {//4.关闭输入输出流及连接

if (is != null) {

is.close();

}

if (os != null) {

os.close();

}

socket.close();

}

所以可以发现tcp连接由操作系统底层实现,但http由的实现是由java程序实现。我们浏览器发送的请求为http,java的后端服务是典型的有tomcat。name我们可以看一下tomcat是如何实现http的

按图索骥研究tomcat

linux下tomcat的启动我们只要运行startup.sh

我们研究下这个文件,其中的内容如下,运行startup.sh的实际结果是运行catalina.sh还带了参数start

#略

EXECUTABLE=catalina.sh

#略

exec "$PRGDIR"/"$EXECUTABLE" start "$@"

接着我们看下catalina.sh,可以看到我们运行的java的入口类是org.apache.catalina.startup.Bootstrap,接着我们找Bootstrap源码的main函数,main函数启动项目,开启端口,处于等待状态。main还解析了tomcat的server.xml文件,进行初始化。tomcat的处理http协议的类是Http11Processor。这个类有个service方法。

方法中有个while循环,还有个keepAlive参数。其中有一段对keepalive的赋值改变

if (maxKeepAliveRequests == 1) {

keepAlive = false;

} else if (maxKeepAliveRequests > 0 && socketWrapper.decrementKeepAlive() <= 0) {

keepAlive = false;

}

这里的maxKeepAliveRequests 就是server配置文件里的

connectionTimeout="20000"

redirectPort="8443"

maxKeepAliveRequests = 10000 />

这个参数的意思是最多经过多少个请求之后将Connection有keep-alive改为close的。

当keepAlive设为false以后,会退出循环并返回SocketState.CLOSED给调用者。调用者收到这个状态后会关闭socket。结束连接,tcp会进行4次挥手结束会话。

假设keepAlive一开始就未设置,那么就不会进入循环,直接返回调用者SocketState.CLOSED。

如果keepAlive还没到最大值,会一直在while的循环中,持续处理socket中的内容,直到keepAlive失效,或者连接中断。

了解了原理之后,我们来看看我们的问题。keepAlive开启会一直占用一个连接,直到socket关闭。tomcat有最大连接数参数是maxConnections,这个值表示最多可以有多少个socket连接到tomcat上。BIO模式下默认最大连接数是它的最大线程数(缺省是200),NIO模式下默认是10000,APR模式则是8192(windows上则是低于或等于maxConnections的1024的倍数)。如果设置为-1则表示不限制。当请求过多时,新的请求不会被接受,老的请求受网络io的影响。但老的请求的会话被关闭的可能性还比较小。所以在抢票之类的程序中,先登入服务所在的tomcat还是有优势的。从另一个方面来说关闭keepalive的功能对抢票人来说较公平。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值