问题背景

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

问题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. JS 这一次彻底理解选择排序

    壹 ❀ 引 我在 JS 这一次彻底理解冒泡排序 一文中介绍了十大经典排序中的冒泡排序,所谓冒泡排序就是不断比较相邻的两个元素,让较小的往前浮,较大的往后沉,直到所有元素找到自己对应的位置.那么现在我们 ...

  2. Typora关于 插入图片 居中 靠左 靠右设置

    style="float: left;" <img src="C:\Users\mlx\AppData\Roaming\Typora\typora-user-ima ...

  3. Springboot+Bootstrap实现增删改查实战

    说明 最近有朋友问我有没有Springboot+Bootstrap实现增删改查的DEMO,当时没有,现在他来了! 实现效果 代码地址 https://gitee.com/indexman/bootst ...

  4. 解决VMware与win10无法共享目录

    1.安装VMware Tools 这一步适用于多数情况,但对于高版本的VMWare这一步无效,当然了,先试一试总没有坏处. 有看见网上说如果VMware内安装的是高版本的Ubuntu,安装的VMwar ...

  5. 突破Windows的极限

    偶然碰到这类技术博客,甚感欣慰,但奈何技术水平达不到,很多都难以理解,故记录在此,用作日后学习. 国内有类似的中文翻译,比如:突破Windows极限:物理内存 但是外文链接已经失效,看不到原汁原味的英 ...

  6. kafka学习笔记03-消息生产者producer

    kafka学习笔记03-消息生产者producer 发送消息整体流程示意图 消息发送的流程示意图: (From:High-level overview of Kafka producer compon ...

  7. 3dMax建模笔记(一):介绍3dMax和创建第一个模型Hello world

    前言   三维模型,虽然淘宝上一抓一大把,但是三维开发人员最好还是具备一定基础的建模能力.本文用hello world模型描述基本的3dMax建模流程.   3dMax   3D Studio Max ...

  8. APScheduler可能遇到的问题

    uWsgi使用多进程模式启动Django项目,因此我们会有多个进程去执行这个定时任务,导致定时任务被重复执行.解决这个问题的方法,我们直接就会想到采用加锁的方式.第一个拿到锁的进程,执行定时任务,其余 ...

  9. Celery在Django项目中集成

    使用celery第一件要做的最为重要的事情是需要先创建一个Celery实例对象,我们一般叫做celery应用对象,或者更简单直接叫做一个app.app应用对象是我们使用celery所有功能的入口,比如 ...

  10. zookeeper运行时dos窗口一闪而过

    错误:从官网下载zookeeper解压到本地之后,鼠标双击运行zkServer.cmd文件,dos窗口一闪而过,看不到错误原因: 解决方法:通过dos窗口执行zkServer.cmd文件,对应的错误信 ...