TCP中的KeepAlive与HTTP中的Keep-Alive
KeepAlive 与 Keep-Alive
前言
昨天被问到了HTTP中Keep-Alive的概念,看名字我只知道是保持连接用的,但是对于他怎么结束连接,为什么要用他这些就不是很清楚了,今天查了一下资料,然后总结一下吧。
然后发现keepalive是有两种的:
- TCP中的KeepAlive
- HTTP中的Keep-Alive
TCP中的KeepAlive概念
都知道TCP建立连接是需要三次握手的,过程如下:
SYN/ACK这些都属于TCP的报文,等连接建立之后才会开始数据的传输,也就是这之后才会涉及到HTTP中的请求和应答的概念。也就是TCP/IP(OSI)模型中涉及到的分层的概念,HTTP属于应用层的东西,TCP是网络层的概念。
那么,假如TCP连接建立之后,如果应用程序一直不发送数据怎么办?或者很久才发一次,服务端该怎么处理呢?为了处理这种情况,TCP协议会过一段时间(可以设置)后去发送一个空报文给对方,若有响应则对方在线,保持连接;若没有反应,则进行重试,达到一定次数之后则认为连接已经丢失,没有必要再保持了。
上面这个过程就是TCP中KeepAlive的概念。
HTTP中的Keep-Alive
一个完整的HTTP事务如下:
事务包括链接建立/请求/响应/断开这几个过程,早期HTTP传输数据主要以文本为主,基本上一次请求就可以返回所有数据了,但是后面数据类型越来越复杂,一个链接可能就不行了,但是每次都重建TCP连接就有些浪费了,所以就有了HTTP中的Keep-Alive了。
HTTP1.0中默认关闭这个特性,需要在HTTP头中加入“Connection:Keep-Alive”开启;HTTP 1.1中默认启用,若加入“Connection:close”可关闭。
那么怎么判断数据是否已经传完呢?这里有2种方式:
- 使用消息首部字段Content-Length,意思就是加上一个长度,内容长度够了,则已经传完
- 没有Content-Length的时候(不容易判断数据大小的时候),可以使用“Transfer-Encoding:chunked”的方式来传输数据;即 chunk编码将数据分块传送,最后用一个长度为0的块表示结束
另外,需要注意:
总结
这些东西都属于在HTTP头部字段可以看到的,以前也看过,但是并没有深入,该反思。
参考
- https://www.byvoid.com/zhs/blog/http-keep-alive-header
- https://www.cnblogs.com/havenshen/p/3850167.html
- https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Keep-Alive
TCP中的KeepAlive与HTTP中的Keep-Alive的更多相关文章
- TCP连接探测中的Keepalive和心跳包
TCP连接探测中的Keepalive和心跳包 tcp keepalive 心跳 保活 Linuxtcp心跳keepalive保活1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 ...
- TCP连接探测中的Keepalive 和心跳包
采用TCP连接的C/S模式软件,连接的双方在连接空闲状态时,如果任意一方意外崩溃.当机.网线断开或路由器故障,另一方无法得知TCP连接已经失效,除非继续在此连接上发送数据导致错误返回.很多时候,这不是 ...
- TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活
1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 2) 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制. 2. 导致TCP断连的因素 如果网络正常 ...
- tcp中的keepalive(转)
理解Keepalive(1) 大家都听过keepalive,但是其实对于keepalive这个词还是很晦涩的,至少我一直都只知道一个大概,直到之前排查线上一些问题,发现keepalive还是有很多玄机 ...
- SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3 而导致此项操作无法完成,浏览器中的Keep-Alive
http://www.cnblogs.com/OpenCoder/p/5089258.html IE中Keep-Alive机制引起的错误 我们知道Http协议是基于TCP/IP连接的,也就是说 ...
- http中的KeepAlive
为什么要使用KeepAlive? 终极的原因就是需要加快客户端和服务端的访问请求速度.KeepAlive就是浏览器和服务端之间保持长连接,这个连接是可以复用的.当客户端发送一次请求,收到相应以后,第二 ...
- TCP/IP协议栈在Linux内核中的运行时序分析
网络程序设计调研报告 TCP/IP协议栈在Linux内核中的运行时序分析 姓名:柴浩宇 学号:SA20225105 班级:软设1班 2021年1月 调研要求 在深入理解Linux内核任务调度(中断处理 ...
- TCP/IP具体解释--UDP数据报中的IP分片
1.UDP首部 2.UDP分片 在第二章,讲链路层是,提到过以太网.刨除数据帧帧头.最多传输的长度为1500.也就是说,假设一个ip数据报,长度大于1500,则须要分片. 分片方法: 在ip头中3位标 ...
- vue中使用keepAlive组件缓存遇到的坑
项目开发中在用户由分类页category进入detail需保存用户状态,查阅了Vue官网后,发现vue2.0提供了一个keep-alive组件. 上一篇讲了keep-alive的基本用法,现在说说遇到 ...
随机推荐
- 素数筛选-hdu2710
题目描述: 题目大意:找出具有最大素数因子的整数.如果有不止一个,则输出在输入文件中出现最早的一个. 解题思路:刚开始时,p数组中的元素全为0,刚开始对于素数 i,p[i]=0,用一个for循环,将是 ...
- POJ 2446 Chessboard【二分图最大匹配】
<题目链接> 题目大意: 给你一个n*m的棋盘,其中有k个洞,现在有1*2大小的纸片,纸片不能覆盖洞,并且每个格子最多只能被覆盖一次.问你除了洞口之外这个棋盘是否能被纸片填满. 解题分析: ...
- iOS 技术篇:渐变色的简单实现方式
实现效果 //渐变设置 UIView *view = [[UIView alloc] initWithFrame:CGRectMake(,, [UIScreen mainScreen].bounds. ...
- 模拟页面获取的php数据(三)
<?php return array( "aData" => [//通勤方式 "trafficType" => [ 0 => [ &qu ...
- 正则表达式(特殊字符)/Xpath语法/CSS选择器
正则表达式(特殊字符) ^ 开头 '^b.*'----以b开头的任意字符 $ 结尾 '^b.*3$'----以b开头,3结尾的任意字符 * 任意长度(次数),≥0 ? 非贪婪模式,非贪婪模式尽可能少的 ...
- Linux下刷新DNS缓存(Ubuntu/CentOS)
现在很多Linux发行版都没有内置DNS本地缓存,Linux不像Windows那样可以使用ipconfig /flushdns来刷新,在Linux下无需刷新,因为本身没有缓存: 当然,如果非要缓存刷新 ...
- Python开源框架、库、软件和资源大集合
A curated list of awesome Python frameworks, libraries, software and resources. Inspired by awesome- ...
- CentOS禁止packagekit离线更新服务的办法
以CentOs7为例,以root身份登录系统,然后执行以下命令: [root@localhost ~]# systemctl disable packagekit-offline-update.ser ...
- 细说ASP.NET Windows身份认证
上篇博客我谈到了一些关于ASP.NET Forms身份认证方面的话题,这次的博客将主要介绍ASP.NET Windows身份认证. Forms身份认证虽然使用广泛,不过,如果是在 Windows Ac ...
- android:AlertDialog控件
AlertDialog 可以在当前的界面弹出一个对话框,这个对话框是置顶于所有界面元素之上 的,能够屏蔽掉其他控件的交互能力,因此一般 AlertDialog 都是用于提示一些非常重要的 内容或者警告 ...