傻傻分不清的TCP keepalive和HTTP keepalive

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了傻傻分不清的TCP keepalive和HTTP keepalive相关的知识,希望对你有一定的参考价值。

参考技术A

TCP keepalive是TCP的保活定时器。通俗地说,就是TCP有一个定时任务做倒计时,超时后会触发任务,内容是发送一个探测报文给对端,用来判断对端是否存活。 (想到一个桥段:“如果2小时后没等到我的消息,你们就快跑”)

正如概念中说的,用于探测对端是否存活,从而防止连接处于“半打开”状态。

所谓半打开,就是网络连接的双端中,有一端已经断开,而另一端仍然处于连接状态。

(图一)TCP keepalive 流程图

建立连接的双端在通信的同时,存在一个定时任务A,每当传输完一个报文,都会重置定时任务A。如果在定时任务的时限 tcp_keepalive_time 内不再有新的报文传输,便会触发定时任务A,向对端发送存活探测报文。根据响应报文的不同情况,有不同的操作分支,如上图所示。

定时任务B会被循环执行,具体逻辑是:定时任务A的探测报文没有得到响应报文,开始执行定时任务B。任务B的内容同样是发送探测报文,但不同的是,B会被执行 tcp_keepalive_probes 次,时间间隔为 tcp_keepalive_intvl 。B的探测报文同样也是在收到响应报文后,重置定时任务A,维持连接状态。

上文提到的三个参数存在于系统文件中,具体路径如下:

通信双端都存在一个文件作为数据缓冲区,对端发送给本地当前端口的数据都会缓冲在这个文件中。上文中讲的“断开连接”就是关闭这个文件,关闭后所有发送到当前端口的数据将无法存储到缓冲区,即数据被丢弃了。

通过指令 lsof -i :8080 ,8080改成你的端口号,便能看到这个缓冲区文件。

HTTP keepalive指的是持久连接,强调复用TCP连接。(类似场景:挂电话之前总会问句,没啥事就先挂了,延长通话时长来确认没有新话题)

延长TCP连接的时长,一次TCP连接从创建到关闭期间能传输更多的数据。

(图二)HTTP keepalive 流程图

通信连接的双端在通信的同时,存在一个HTTP层面的keepalive定时任务。当客户端发起Request,并且接收到Response之后,触发定时任务。定时任务会开始计时,达到keepalive的时间距离后,关闭连接。如果在计时期间,客户端再次发起Request,并且接收到Response,定时任务会被重置,从头计时。

图二用Python的socket库为示例进行说明,在HTTP的“请求-响应”过程中,HTTP keepalive(或者称为HTTP持久连接)在底层是如何作用于连接释放流程,从而延长连接时长的。

为什么不用Python的requests库来举例说明?requests底层也是socket连接管理,不同的是requests支持HTTP协议,可以解析出HTTP各部分信息;socket仅仅是从文件缓冲区读取二进制流。同样地,各种Web框架中的Request和Response对象的内部仍然是socket连接管理,只提socket可以排除很多干扰信息。

服务端HTTP keepalive超时后的数据丢弃的说明。刚入门的同学可能也会像我一样感到疑惑:服务端keepalive超时后再收到数据就会丢弃,那么服务端后续还怎么接收端口的数据?

这就不得不提到服务端的fork模型了:服务端主进程监听端口,当数据到来时便交给子进程来处理,主进程继续循环监听端口。

具体地说,当数据到来时,主进程先创建新的socket连接句柄(本质就是生成了socket文件描述符落在磁盘上,端口数据会存储在该文件中缓冲),随后fork出子进程;主进程关闭新的socket句柄,子进程则维持socket句柄的连接(当一个socket句柄在所有进程中都被close之后才会开始TCP四次挥手);此后,子进程接管了与客户端的通信。

正如(图三)的例子,主进程会fork出很多子进程,A和B分别对接的是不同客户端发来的请求,socket文件描述符a不会影响b的数据读写。

(图三)fork模型下传递socket句柄的过程

结论是,服务端与外界建立的每一个socket连接,都有独立的文件描述符和独立的子进程与客户端通信。服务端断开连接是指关闭了某个文件描述符的读写,并非关闭了整个端口的数据往来,不影响其他的socket连接之间通信。至于丢弃,就是说外界如果还有发往这个socket文件描述符的数据被丢弃,因为这个文件描述符已经禁止写入,自然地数据便无法落地。

TCP keepalive更像是保障系统有序工作的兜底机制,确保系统最终能收回半打开的socket连接,否则长期运行后无法再接收更多的请求(系统的socket最大连接数限制)。

HTTP keepalive则是应用层的骚操作,使得服务端的应用程序能自主决定socket的释放,因为TCP keepalive的倒计时默认值很长,web服务的某次连接通常不需要等待那么久。说直白点,就是TCP有一个计时器,HTTP也可以自己搞个计时器,如果HTTP的计时器先超时,同样有权利让TCP进入四次挥手流程。

在某个数据包传输后,两个keepalive的定时任务同时存在且一起进入倒计时状态,一个是系统内核TCP相关代码的程序,另一个是高级编程语言(Python/Java/Go等)Web框架代码的程序,他们一起运行并不冲突。

HTTP keepalive是应用层的东西,在上生产时对外提供服务的应用程序都会有keepalive参数,例如Gunicorn的keepalive、nginx的keepalive_timeout。通过这个参数,我们能在更高级的层面控制等待下一个数据的时长。

还有,如果同一台服务器有N个Web服务,TCP keepalive参数是全局生效,众口难调。

如果你的网络结构是类似client-nginx-web server,那么你就要同时考虑nginx和web server的keepalive参数大小搭配的问题,此处引用Gunicorn对keepalive参数的使用建议:

假设web等待时间比nginx短很多,client-nginx的连接还在,nginx-web就已经断开了,web就会错过一些数据,对于客户来说好端端的我拿不到结果是无法容忍的。因此最好是和nginx的等待时间协调好,不要相差太多(不要太短,也不要长很多)。

关于不要太长,多说一句。如果等待很久,web服务会累积维持非常多的连接,这样子新的请求无法打进来,正在维持的连接不见得利用率很高(可能客户端的代码在打断点、可能客户端早就close)。结果就是服务端netstat显示一堆连接,新的请求全都被挂起甚至丢弃。

谈一谈让人傻傻分不清的1G,2G,3G,4G……

浅谈让人傻傻分不清的1G2G3G4G……

虽然大学里学过计算机网络,平时也总是看网上不停的喷着1G,2G,3G,4G到底是啥,但总觉得隔靴搔痒,看不出其本质区别,我不想详解其中的又臭又长的关键技术,就从大家能看明白的概念上说一说这些不同代网络技术的区别。

先从概念和区别说起

1G:没啥好说的,估计是有了后来的2、3G,才想起称呼原来的为1G。1G采用FDMA(模拟和频分多址技术),可实现区域的移动性服务,代表是第一代模拟制式手机,大哥大,通话锁定在一定频率,使用可调频电台就可以窃听电话,保密性差、容量有限,互不兼容,不能提供数据业务和自动漫游。


2G:代表是GSMGlobal System for Mobile Communication)全球移动通信系统,CDMA,是开启数字通信,GSM 较之以前最大的不同是它的信令和语音信道是数字式的通话质量稳定,保密性强,频谱利用率高,支持彩信的GPRS和上网的WAP服务等业务


2.5GGPRS通用分组无线业务,是在GSM系统上发展出来的一种新的承载业务,它通过利用GSM网络中未使用的TDMA信道传说中的2.5G

GPRS采用与GSM同样的无线调制标准、频带、突发结构、跳频规则以及同样的TDMA帧结构。

GSM最根本的区别是,GSM是一种电路交换系统,而GPRS是一种分组交换系统

GPRS允许用户在端到端分组模式下发送和接收数据,而不需要利用电路交换模式的网络资源,从而提供了一种高效、低成本的无线分组数据业务。 

GSM通信网络相比,技术特点如资源利用率高传输速率高(64-128Kbps)接入时间短、永远在线、支持IP协议和X.25 协议低成本,以通信的数据量为依据进行计费


3G:无线蜂窝电话通信协议,W-CDMACDMA2000TD-SCDMA三个主流3G标准。重点在网速上,3G技术的主要优点是能极大地增加系统容量、提高通信质量和数据传输速率。此外利用在不同网络间的无缝漫游技术,可将无线通信系统和Internet连接起来,可处理图像音乐视频等多媒体形式

因采用以拓频通信为基础的一种调制和多址通信方式,其容量比模拟技术高10倍,超过GSM网络约4倍;基于宽带技术的CDMA(码分多址)使得移动通信中视频应用成为可能,从而使手机从只能打电话和发送短信息等狭窄的服务中走向宽带多媒体应用。


4G:包括TD-LTE,FDD-LTE两种制式,集3GWLAN于一体,采用OFDM(正交频分多址)技术,4G改变了从2G3G时的运营商网络的建设方式和运营成本,4G不再保留无线通讯资源来专门跑语音了,而是所有资源全部用来跑数据——就是全部用来上网;速率更快,可达上行20Mbps,下行100Mbps。网络信道更宽

4G技术支持100Mbps~150Mbps的下行网络带宽,也就是意味着4G手机用户可以体验到最大12.5MB/s~18.75MB/s的下行速度。是目前中国移动3G(TD-SCDMA)2.8Mbps35倍,中国联通3G(WCDMA)7.2Mbps14倍。

4G实测网速真的有那么快么?

技术分享

20144月实测图

目前运营商都在加紧部署4G网络,也天天在吆喝4G网速能达到100Mbps,但用过4G的亲们都知道,目前的4G的速度根本就没有宣传的快,据2014年的实际网络测试,电信的下载速率可达43Mbps移动38.18Mbps而联通则只有25Mbps,这与联通的4g覆盖率低有关,4G再快,如果没有覆盖,等于享受不到。

在大众还在纠结要不要买个4G手机,把卡换一换,享受下啥事4G时,4G的时代又要来临了,具体什么事4G+,5G又长啥模样,下一篇详述。

4G手机还要换4G卡?4G卡和2G卡有啥区别?

其实在3G时代,电信和联通就对SIM卡进行了更换,电信手机卡叫UIM,联通3G手机卡叫USIM。它们都是一个意思,即用户识别卡,是全球数字移动电话用户的一张个人资料卡。

4G手机需要使用4G SIM卡,其名称为USIM

如果你已经是4g手机,对于移动用户来说,需要将原来的sim卡换成usim,不换号,需要换卡完成升级。对联通3g用户来说,如果已经是usim卡,可以不换号不换卡,但需要去营业厅升级为4g服务,才能使用4g功能。

USIM和SIM的区别

USIMUniversal Subscriber Identity Module(全球用户识别卡)的缩写。全球用户身份模块(USIM),也叫做升级 SIM ,是在 UMTS 3G 网络的一个构件。

除能够支持多应用之外,USIM卡还在安全性方面对算法进行了升级,并增加了卡对网络的认证功能,这种双向认证可以有效防止黑客对卡片的攻击。 SIM卡叫“用户识别卡”,它实际上是一张内含大规模集成电路的智能卡片,用来登记用户的重要数据和信息。SIM也指社会影响营销。
  更换后的USIM芯片部分的面积更大一方面是因为存储容量增加,例如从64KB增加到128KB,另一方面则源于加密技术的升级。在2G功能机时代,我们还使用SIM卡来存储联系人信息,不过到了3G时代,随着大容量智能手机的流行,这些信息早就存在手机内存当中了,因此更换USIM卡更大的意义在于更高等级的加密功能,也就是说安全性更强,更不易被破解。


以上是关于傻傻分不清的TCP keepalive和HTTP keepalive的主要内容,如果未能解决你的问题,请参考以下文章

谈一谈让人傻傻分不清的1G,2G,3G,4G……

cacao与cocoa 傻傻分不清的“可可”

[CTF pwn]傻傻分不清的execveint80syscallsystem及shellcode

CAPL脚本中关于相对路径/绝对路径操作的几个傻傻分不清的内置函数

URI、URL傻傻分不清

那些分不清的编程术语