一 Nagle算法背景

有时候,我们可能会遇到一些很小的分组,比如,20字节的IP首部,20字节的TCP首部和1字节的数据,如果很多这样的小分组数据,在局域网一般不会出现拥塞,但是在广域网就可有可能。所以Nagle算法就是为了解决这样的小分组问题

二 Nagle算法详解

#1 TCP连接上最多只能有一个未被确认的小分组,该分组的确认到达之前不能发送其他的小分组

#2 发送端需要收集这些小分组,然后在未被确认的小分组确认的时候,就可以将收集的这些小分组组成一个报文段发送出去

#3 但是如果长时间没有被确认,就不发送收集的分组数据吗。满足以下三个任何一个条件,都可以发送出去:

第一: 如果窗口长度大于MSS(1460)且数据字节长度大于或等于MSS

第二: 等待了一定的时间(默认200毫秒)

第三: 如果有紧急数据发送

三 延迟确认

延迟确认

如果TCP对每一个报文段都进行ack确认,那么只是一个单独的报文段,只为发送一个ack代价比较高,所以TCP会延迟一端时间,如果这段时间内有数据发送到对端,则捎带发送ACK确认;或者在ACK定时器触发的时候,发现ACK尚未发送,则立即单独发送。

如果Nagle算法遇上了延迟确认怎么办?

第一次写入的数据到达对端之后,对端延迟确认,不发送ACK确认,而本端因为要发送的数据长度小于MSS,所以Nagle算法起作用,数据并不会立即发送,而是需要对端确认第一次发送的白文段的ACK,如果一直不ACK,只有等待对端超时才发送ACK,然后本端才能发送数据,从而会带来延迟。

四 禁用Nagle算法

默认情况下TCP是开启Nagle算法的,但是并不是适用于所有场景。Nagle算法比较适用于发送方发送大批量的小数据,提高了网络吞吐量,但是降低了实时性。但是在有些实时性比较强的应用程序,是不允许的,所以可以禁止Nagle算法。

那如何禁止Nagle算法呢?

我们可以通过参数tcp_nodelay来禁用。

五 Keepalive保活机制

如果发送端和接收端建立了连接,但是一直没有数据通信,连接是不会自动释放,除非重启了(一个空闲的TCP连接没有任何的数据交换)。

一般我们使用keepalive时会修改空闲时长,避免资源浪费,系统内核会为每一个TCP连接 建立一个保护记录,相对于应用层面效率更高。

常见的几种使用场景:

#1 检测挂掉的连接 (导致连接挂掉的原因很多,如服务停止、网络波动、宕机、应用重启等)

#2 防止因为网络不活动而断连(使用NAT代理或者防火墙的时候,经常会出现这种问题)

#3 TCP层面的心跳检测

tcp_keepalive_time一个连接需要TCP开始发送keepalive探测数据包之前的空闲时间。以秒为单位

tcp_keepalive_probes发送TCP keepalive探测数据包的最大数量,默认是9.如果发送9个keepalive探测包后对端仍然没有响应,就关掉这个连接

tcp_keepalive_intvl:发送两个TCP keepalive探测数据包的间隔时间,默认是75秒

六 http协议的keepalive机制和tcp的keepalive机制区别

主要是目的不一样:

在http早期,每个http请求都要求打开一个tpc socket连接,并且使用一次之后就断开这个tcp连接。使用keep-alive可以改善这种状态,即在一次TCP连接中可以持续发送多份数据而不会断开连接。通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd服务器的吞吐率。总之,http keep-alive是为了让tcp活得更久一点,以便在同一个连接上传送多个http

TCP协议中,keepalive是TCP保鲜定时器,当网络两端建立了TCP连接之后,闲置idle(双方没有任何数据流发送往来)了tcp_keepalive_time后,服务器内核就会尝试向客户端发送侦测包,来判断TCP连接状况(有可能客户端崩溃、强制关闭了应用、主机不可达等等)。如果没有收到对方的回答(ack包),则会在 tcp_keepalive_intvl后再次尝试发送侦测包,直到收到对对方的ack,如果一直没有收到对方的ack,一共会尝试 tcp_keepalive_probes次,每次的间隔时间在这里分别是15s, 30s, 45s, 60s, 75s。如果尝试tcp_keepalive_probes,依然没有收到对方的ack包,则会丢弃该TCP连接。TCP连接默认闲置时间是2小时,一般设置为30分钟足够了。

总之,TCP的keepalive机制一种检测TCP连接状况的保鲜机制。

网络协议:TCP保活机制和Nagle算法相关推荐

  1. 网络协议 TCP 数字编号和重传机制

    网络协议 TCP 数字编号和重发 1. TCP 的数字编号 2. TCP 确认机制的特点 2.1 TCP一次可发送多个数据包 2.2 仅对连续接收的数据段进行确认 2.3 不连续的数据将先缓存 3. ...

  2. 网络协议-TCP和UDP最完整的区别介绍

    网络协议-TCP和UDP最完整的区别介绍 前言:为了方便后期翻看,公众号在慢慢整理所发文章,关于Java网络编程内容的文章,可以在菜单栏-文章整理-进阶篇模块中查看. TCP与UDP基本区别   1. ...

  3. TCP保活机制(KeepAlive)

    TCP保活机制 如果两端的 TCP 连接一直没有数据交互,达到了触发 TCP 保活机制的条件,那么内核里的 TCP 协议栈就会发送探测报文. 如果对端程序是正常工作的.当 TCP 保活的探测报文发送给 ...

  4. 如果客户端不发送数据,什么时候才会断开处于 ESTABLISHED 状态的连接?(TCP保活机制和心跳包)

    TCP 的 保活机制(KeepAlive机制).这个机制的原理是这样的: 定义一个时间段,在这个时间段内,如果没有任何连接相关的活动,TCP 保活机制会开始作用,每隔一个时间间隔,发送一个「探测报文」 ...

  5. 网络协议-TCP协议详解

    本文转载自:https://www.pdai.tech/md/develop/protocol/dev-protocol-tcpip.html 重点:TCP滑动窗口,TCP握手,TCP重传机制. 简述 ...

  6. TCP握手机制、TCP长连接和短连接、TCP 保活机制 、心跳机制

    参考: https://www.cnblogs.com/Andya/p/7272462.html 1. TCP连接(3次握手建立连接.4次挥手关闭连接) 当网络通信时采用TCP协议时,在真正的读写操作 ...

  7. 在c语言中如何屏蔽一段程序,如何在用C语言关闭TCP程序中的Nagle算法

    TCP为了防止在网络中过多的小分组会导致阻塞,因此提供了Nagle算法:要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组.相反,TCP收集这些少量 ...

  8. 网络分层,网络协议TCP/IP模型,OSI模型

    TCP\IP模型是多种协议的综合,4层模型(也有说5层的). 其中最重要的就是分层结构和主要协议. 1.应用层(SMTP,HTTP,FTP) 2.传输层(TCP,UDP) 3.网络互联层(IPv4,I ...

  9. 网络协议-TCP、IP协议和互联网协议群

    目录 TCP/IP协议群简介(互联网协议群)(Internet Protocol Suite) 应用层(Application)(合并简化了展示层,会话层) 传输层(Transport) 网络层(In ...

最新文章

  1. 安装openproject
  2. Python 切片的简单讲解
  3. 请求地址出现不明的字符%E2%80%8E(Zero-Width Space)
  4. css3 - target
  5. 高效神器!小目标检测迎来曙光!SSPNet金字塔网络!川大出品
  6. mysql腾讯面试题_2020腾讯阿里精选面试题100+(包含答案)
  7. 对天气数据进行简单的数据分析
  8. Codeforces Round #260 (Div. 1) A - Boredom DP
  9. c语言分数等级switch,用switch输出分数等级
  10. DenseNet介绍
  11. matlab在循环中保存jpg格式_matlab中的图片保存方法
  12. 根据经纬度查询位置百度api
  13. 最优化问题的Matlab优化工具箱求解总结
  14. 测试管理之--文档管理
  15. 《Tomcat内核设计剖析》勘误表
  16. R绘图基础指南 | 2.折线图
  17. 《MySQL高级篇》数据库建模工具---PowderDesigner的使用教程
  18. 跨境电商独立站站群模式
  19. 《思科九年》读书笔记
  20. javaweb-----------filter过滤器

热门文章

  1. JavaScript四则运算的一些特殊情况
  2. PostgreSQL中的执行计划
  3. zhongdexing-pro
  4. Python机器学习:多项式回归与模型泛化003过拟合与欠拟合
  5. oracle 数字格式取整,Oracle SQL语句操作数字:取整、四舍五入及格式化
  6. matlab 聚类 源程序,聚类——KFCM的matlab程序
  7. 华为能更新到鸿蒙的手机有哪些,荣耀哪些手机可以升级鸿蒙系统 荣耀鸿蒙系统支持的手机型号盘点...
  8. android 7.0 黑屏,Android app启动是出现白屏或者黑屏如何解决?
  9. 正则匹配——python用一个正则表达式从字符串中提取数字(包括整数、小数、正负数)
  10. python multiprocessing 保存与打印返回值