问题背景

介绍两个经典的网络问题,

问题1: 访问位于Azure Application Gateway之后的nodejs server, 偶尔会触发502

问题2: 请求一个Azure App Service, 如果在230s之内请求没有返回,必定timeout

问题1分析

首先来分析问题1,初步看502,那么很自然的认为是后台服务down了,但是检查server状态很正常,并且测试反馈只是偶尔某个请求502,再次刷新立马就恢复正常。由于重现概率很低,尝试去抓网络包,没抓到有用的信息,只能进行猜测。出现502既然不是server的状态有问题,那么就是server端即upstream意外的close了tcp connection。这种情况可能有多种原因比如Server端的资源紧张,比如Server端的keep-alive设置,已经检查过服务器状态正常,那么可能是这个keep-alive的设置导致。

什么是HTTP keep-alive

HTTP Keep-Alive,也称为HTTP persistent connection(持久连接),它允许在一个TCP连接上发送和接收多个HTTP请求和响应,而不需要为每一个新的请求/响应对重新建立和关闭连接。在HTTP/1.0中,默认不使用Keep-Alive,每一次请求/响应结束后,连接就会被关闭。为了启用Keep-Alive功能,客户端必须在请求头中包含Connection: keep-alive。在HTTP/1.1中,Keep-Alive是默认启用的,但是客户端和服务器都可以通过发送一个Connection: close的消息头来请求关闭连接。

那么默认的nodejs keepalive是多长时间,查阅官方资料,为5s。https://nodejs.org/docs/latest/api/http.html#serverkeepAliveTimeout

写段代码简单的试验下:

const express = require('express');
const http = require('http');
const server = http.createServer(app);
app.get('/', async (req, res) => {
await res.send("Hello World!");
});
server.listen(3000, () => {
console.log("start server");
});

查看response header:

抓取网络包并分析:

从图中可以看到,正常情况下,当收到最后一个ACK 5s之后, 由Server端(port 3000)会发送FIN Flag,开始关闭连接。这证明了Server端会主动的close connection, 而某些情况下会发生如下情况:

这个是网上截取的图,但是情况类似,某些情况,TCP Conenction没有正常的断开连接,而是直接Reset, 此时就会发生502。

解决方案

那么解决方案也很明了,只要Server端保证比Client端也就是Application Gateway的Keep-Alive 长,Server端不会在Client端认为可用的时候发送消息,就不会发生此类问题,查阅官方资料,Azure Applicaiton Gateway的HttpAlive v1为120s, v2为75s, 我们用的是V2, 设置为了120s > 75s, 此问题改动之后不再发生。但是需要声明的是用的相同的配置和代码的另外一个产品则从来没发生过此类问题。网络世界很复杂,也许不是这个原因,咱们这里只是拿这个问题来重点介绍HTTP Keep-Alive。

问题2分析

问题2的描述是在230s之内请求没有返回, 那么也就是说230s之内TCP connection一直没有流量传输,那么大概率是触发了TCP Idle Timeout。

什么是TCP Keep-Alive和TCP Idle Timeout

TCP Idle Timeout 是指TCP连接在无数据交换时可以保持空闲状态的最大时间。在这段时间后,如果没有任何数据包(例如TCP段)在连接上发送,连接就可能被认为是不再需要的,并且会被网络设备或操作系统自动关闭。这样做的目的是为了回收不再使用的资源,避免无用连接。

TCP Keep-Alive 是一种网络协议的机制,设计用于在TCP(传输控制协议)连接中检测对方是否已停止响应。TCP 是一种面向连接的协议,用于在计算机网络中的应用程序之间可靠地传输数据。在长时间的空闲期间,一个端点可能在没有任何通知的情况下不再可用,例如电脑可能已经崩溃或网络故障。Keep-Alive 机制可以帮助检测这些情况,确保连接仍然是活跃的,或允许应用程序在连接被对方关闭时采取适当的行动。

注意网络设备和应用程序可以调整TCP Keep-Alive的参数比如时间间隔和重试次数

注意不要把TCP Keep-Alive和Http Keep-Alive混淆。

在Azure中, Azure Load Balancer有个默认的4分钟的TCP Idle timeout, 这也就导致了如果app service一直没返回,则client端大概在230s(windows是230s, linux是240s)抛出timeout异常。

解决方案

那解决方案也比较清晰,由于Azure Load Balancer的设置在AppService里的服务中是不可配置的,那么只能改为异步方式,对于请求来说,可以先返回一个Id,然后循环查询Id对应的状态,而不是一直等待。

欢迎扫码关注我的公众号

计算机网络-Keep Alive的更多相关文章

  1. 计算机网络知识(TCP连接,TCP/UDP区别,HTTP与HTTPS,Socket原理等等)

    1.网络七层协议包含,物理层.数据链路层.网络层(ip协议).传输层(TCP传输控制协议.UDP用户数据报协议).会话层.表示层.应用层(http协议).是一个提供的概念架构协议. 2.TCP/IP协 ...

  2. [计算机网络]简易http server程序

    好久没输出了,知识还是要写下总结才能让思路更加清晰.最近在学习计算机网络相关的知识,来聊聊如何编写一个建议的HTTP服务器. 这个http server的实现源代码我放在了我的github上,有兴趣的 ...

  3. SQL Server 2012故障转移的looksalive check和is alive check

    什么是looksalive check和is alive check SQL Server故障转移集群是建立在windows集群服务上的一种热备的高可用方案.在集群运行过程中,windows集群服务定 ...

  4. [Network] 计算机网络基础知识总结

    计算机网络学习的核心内容就是网络协议的学习.网络协议是为计算机网络中进行数据交换而建立的规则.标准或者说是约定的集合.因为不同用户的数据终端可能采取的字符集是不同的,两者需要进行通信,必须要在一定的标 ...

  5. 计算机网络中的帧封装(C实现)

    这段时间开始复习计算机网络,看到帧封装这一节,结合以前的课程设计,就用C写了个帧封装的程序,说实话C学的确实不怎么样,实现的时候对于文件操作那部分查了好多资料,下面说说帧封装是啥情况. 学过计算机网络 ...

  6. Keeping Async Methods Alive

    Consider a type that will print out a message when it’s finalized, and that has a Dispose method whi ...

  7. 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结 转载

    基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...

  8. 计算机网络(7)-----TCP协议概述

    传输控制协议(Transmission Control Protocol) 概念 一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机网络OSI模型中,它 ...

  9. 【转】牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

    基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...

  10. 计算机网络: IP地址,子网掩码,默认网关,DNS服务器详解

    楔子: 以Windows系统中IP地址设置界面为参考(如图1), IP地址, 子网掩码, 默认网关 和 DNS服务器, 这些都是什么意思呢? 学习IP地址的相关知识时还会遇到网络地址,广播地址,子网等 ...

随机推荐

  1. NC22494 选点

    题目链接 题目 题目描述 有一棵n个节点的二叉树,1为根节点,每个节点有一个值wi.现在要选出尽量多的点. 对于任意一棵子树,都要满足: 如果选了根节点的话,在这棵子树内选的其他的点都要比根节点的值大 ...

  2. MQTT-QoS与协议流程

    QoS的报文收发流程 QoS 0 最多交付一次,消息有可能丢失,最低的QoS等级,没有任何的机制,不需要等待确认和重传,只要保证消息发送,也可能到达不了接收端 QoS0消息发送流程: 发送端调用API ...

  3. ELK查询和汇总

    查询表明细: ELK的KQL样例,显示时间请选择最近15天: 样例1:查询ol_lc 表增删改查,不是jy2_rw的账号明细 KQL:(ol_lc or oc.ol_lc) and (select o ...

  4. Java并发编程实例--9.使用本地线程变量

    并发程序一个重要方面就是共享数据. 这一点在继承了Thread类或实现了Runnable接口的对象中有着特殊的重要性. 如果你创建了一个实现了Runnable接口的类对象并且用这个对象开启了N个线程对 ...

  5. python3调用nmap封装

    python3调用nmap封装; 外部处理好参数后直接调用; #!/usr/bin/env python # -*- coding: utf-8 -*- """ 代码修改 ...

  6. 无 dmp 文件的情况下使用 windbg

    项目线上出现了闪退问题,查看日志发现是 sentry 模块出问题了 因为用户电脑上没有 pdb 文件,所以无法加载具体函数的调用位置,只能手动去计算 具体步骤是:在 windbg.exe 中加载 se ...

  7. etcd实现分布式锁分析

    3篇关于分布式锁的文章,可以结合看: consul实现分布式锁:https://www.cnblogs.com/jiujuan/p/10527786.html redis实现分布式锁:https:// ...

  8. Ansible Ad-hoc,命令执行模块

    目录 Ad-hoc Ad-hoc简介 Ad-hoc命令说明 Ad-hoc示例 命令执行模块 1. command模块 2. shell模块 3. raw模块 4. script模块 Ad-hoc Ad ...

  9. 机器学习策略篇:详解正交化(Orthogonalization)

    正交化 这是一张老式电视图片,有很多旋钮可以用来调整图像的各种性质,所以对于这些旧式电视,可能有一个旋钮用来调图像垂直方向的高度,另外有一个旋钮用来调图像宽度,也许还有一个旋钮用来调梯形角度,还有一个 ...

  10. 【Azure 存储服务】存储在Azure Storage Table中的数据,如何按照条件进行删除呢?

    问题描述 如何按条件删除 Storage Table 中的数据,如果Table中有大量的条记录需要删除,Java代码如何按条件删除 Table中的数据(Entity)? (通过Azure Storag ...