| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 网络协议:TCP保活机制和Nagle算法 -> 正文阅读 |
|
[网络协议]网络协议:TCP保活机制和Nagle算法 |
一 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连接状况的保鲜机制。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 3:32:35- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |