原文链接:

http://www.freesoft.org/CIE/RFC/1122/114.htm
http://www.freesoft.org/CIE/RFC/1122/index.htm

实现TCP的人或许会包含 "keep-alives" 在它们实现的TCP中,虽然keep-alive不是普遍被接受。如果keep-alive被包含,应用程序必须能够为每个连接打开或者关闭keep-alive,默认一定是关闭状态。
Keep-alive报文仅在一定时间间隔内没有收到数据或者确认报文时才被发送,时间间隔必须能够配置,默认的时间间隔必须不小于俩个小时。

记住TCP传播不包含数据的ack报文是不可靠的是十分重要的,因此,如果keep-alive机制被实现,
if a keep-alive mechanism is implemented it MUST NOT interpret failure to respond to any specific probe as a dead connection(没看懂).
然后,为了兼容错误的TCP实现,它可能被配置成发送一个包含垃圾八元组的keep-alive报文。

讨论

当连接空闲时,keep-alive机制定期的探测连接的另一方,即使它(发起探测的一方)没有数据要发送,TCP标准文档没有包含keep-alive机制,因为它会导致如下问题。
1:网络临时的错误的时候,导致一个良好的连接被断掉
2:浪费没有必要的带宽(如果没有人使用这个连接,谁会去管连接是否还是好的)
3:浪费钱

一些TCP实现包含keep-alive机制,为了确认一个空闲的连接依旧是活跃的(可用的),发送一个探测报文,为了引出对方的响应。
探测报文一般包含SEG.SEQ=SND.NXT-1(自己的TCP序号减一),探测报文可能还包含或不包含一个垃圾(无用的)八元组。
注意,在一条安静的连接中,SND.NXT(探测方下一个发送的字节序号)=RCV.NXT(被探测方希望收到的序号),所以当前的SEG.SEQ(探测报文中包含的TCP序号)将在窗口外。
因此,这个探测报文导致接收方返回一个ack(确认)报文来确认当前的连接还是存活的,
如果对等方已经放弃这个连接(由于网络改变,或者网络崩溃),
接收方将响应一个RST报文,而不是响应一个ack报文。

不幸运的是,一些不规范的实现不响应(SEG.SEQ=SND.NXT-1)的报文,除非这个报文包含数据。
Alternatively, an implementation could determine whether a peer responded correctly to keep-alive packets with no garbage data octet.(没看懂)

A TCP keep-alive mechanism should only be invoked in server applications that might otherwise hang indefinitely and consume resources unnecessarily if
a client crashes or aborts a connection during a network failure.
(好像是说服务器没必要为一个死了的客户端耗费资源)

原文

4.2.3.6 TCP Keep-Alives

Implementors MAY include "keep-alives" in their TCP implementations, although this practice is not universally accepted. If keep-alives are included, the application MUST be able to turn them on or off for each TCP connection, and they MUST default to off.

Keep-alive packets MUST only be sent when no data or acknowledgement packets have been received for the connection within an interval. This interval MUST be configurable and MUST default to no less than two hours.

It is extremely important to remember that ACK segments that contain no data are not reliably transmitted by TCP. Consequently, if a keep-alive mechanism is implemented it MUST NOT interpret failure to respond to any specific probe as a dead connection. An implementation SHOULD send a keep-alive segment with no data; however, it MAY be configurable to send a keep-alive segment containing one garbage octet, for compatibility with erroneous TCP implementations.

DISCUSSION:
A "keep-alive" mechanism periodically probes the other end of a connection when the connection is otherwise idle, even when there is no data to be sent. The TCP specification does not include a keep-alive mechanism because it could: (1) cause perfectly good connections to break during transient Internet failures; (2) consume unnecessary bandwidth ("if no one is using the connection, who cares if it is still good?"); and (3) cost money for an Internet path that charges for packets.

Some TCP implementations, however, have included a keep-alive mechanism. To confirm that an idle connection is still active, these implementations send a probe segment designed to elicit a response from the peer TCP. Such a segment generally contains SEG.SEQ = SND.NXT-1 and may or may not contain one garbage octet of data. Note that on a quiet connection SND.NXT = RCV.NXT, so that this SEG.SEQ will be outside the window. Therefore, the probe causes the receiver to return an acknowledgment segment, confirming that the connection is still live. If the peer has dropped the connection due to a network partition or a crash, it will respond with a RST instead of an acknowledgment segment.

Unfortunately, some misbehaved TCP implementations fail to respond to a segment with SEG.SEQ = SND.NXT-1 unless the segment contains data. Alternatively, an implementation could determine whether a peer responded correctly to keep-alive packets with no garbage data octet.

A TCP keep-alive mechanism should only be invoked in server applications that might otherwise hang indefinitely and consume resources unnecessarily if a client crashes or aborts a connection during a network failure.

  

TCP keep-alive翻译的更多相关文章

  1. LwIP raw api下使用tcp keep alive

    // The following code is implemented after tcp_new() or in tcp_connected call back... xxx_connected( ...

  2. Tcp抓包以及tcp状态解释

    tcp三次握手 发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手:接收端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它, ...

  3. golang tcp keepalive实践

    前文中已经介绍了TCP keep alive的做了详尽说明,本文结合golang,介绍如何使用TCP keep alive. 目前golang net包不提供TCP keep alive 空闲多长时间 ...

  4. TCP 长连接保活机制&HTTP长连接设置

    TCP KeepAlive Wireshark抓包分析机制 -------------------------------- 如上图所示,TCP保活报文总是成对出现,包括TCP保活探测报文和TCP保活 ...

  5. HTTP的长连接和短连接

        本文总结&分享网络编程中涉及的长连接.短连接概念.     关键字:Keep-Alive,并发连接数限制,TCP,HTTP 一.什么是长连接 HTTP1.1规定了默认保持长连接(HTT ...

  6. HTTP长连接短连接

    一.什么是长连接 HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包.不四次握手),等待 ...

  7. HTTP协议中的长连接和短连接(keep-alive状态)

    什么是长连接 HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包.不四次握手),等待在同 ...

  8. 【转】HTTP长连接与短连接(2)

    一.什么是长连接 HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包.不四次握手),等待 ...

  9. HTTP的长连接(持久连接)和短连接

      HTTP的长连接和短连接 本文总结&分享网络编程中涉及的长连接.短连接概念. 关键字:Keep-Alive,并发连接数限制,TCP,HTTP 一.什么是长连接 HTTP1.1规定了默认保持 ...

  10. HTTP 的长连接和短连接

    一.什么是长连接 HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包.不四次握手),等待 ...

随机推荐

  1. 多名历年高考状元最终选择做中国顶尖黑客 - imsoft.cnblogs

    原标题:揭秘中国顶尖黑客:二分之一是历年高考[微博]状元 “二分之一是各地的历年高考状元,二分之一是数学专业,二分之一来自微软.” Keen这样的团队是坚决与黑产划清界限的,这也是圈内的“道德洁癖”, ...

  2. ReSharper2017.3的列对齐、排版格式、列对齐错误的修复

    ReSharper代码排版格式 列对齐 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

  3. zookeeper windows 下配置和基础命令

    原文链接:http://blog.csdn.net/woshioosm/article/details/45560177 1, 解压zookeeper ,在目录下建立文件夹 data 和log 2,在 ...

  4. RequireJs 与 SeaJs的相同之处与区别

    相同之处: RequireJS 和 Sea.js 都是模块加载器,倡导模块化开发理念,核心价值是让 JavaScript 的模块化开发变得简单自然. 不同之处: 定位有差异.RequireJS 想成为 ...

  5. POJ 3617:Best Cow Line(贪心,字典序)

    Best Cow Line Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30684   Accepted: 8185 De ...

  6. linux学习——sed工具

    命令格式: sed [-nefr] [动作] 1.sed可以分析标准输入(STDIN)的数据,然后将数据处理后,再将他输出到标准输出(STDOUT),他有替换.删除.新增.选定特定行等处理功能.sed ...

  7. C# Dictionary源码剖析

    参考:https://blog.csdn.net/exiaojiu/article/details/51252515 http://www.cnblogs.com/wangjun1234/p/3719 ...

  8. elastic job简单用法

    public class JobMain { //配置注册中心 private ZookeeperConfiguration zkConfig = new ZookeeperConfiguration ...

  9. 使用VI编辑器在Linux下编写Java文件

    1.cd 文件名称.进入一个文件夹下 2.vi 文件名称,新建一个文件(如此文件已存在则打开) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWlfc3N ...

  10. 字符设备之register_chrdev与register_chrdev_region(转)

    之前写字符设备驱动,都是使用register_chrdev向内核注册驱动程序中构建的file_operations结构体,之后创建的设备文件,只要是主设备号相同(次设备号不同),则绑定的都是同一个fi ...