TCP/IP具体解释--nagle算法和TCP_NODELAY
在client一直给server发送小数据的时候,接受到一个回应会在非常长的时间以后,可是将多个小数据写操作合并成一个写操作,问题就没了。
这个事件的缘由可能是TCP_NODELAY的原因
如今大概明确。是因为nagle算法在捣乱。
TCP/IP协议中。不管发送多少数据,总是要在数据前面加上协议头,同一时候,对方接收到数据。也须要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS參数,因此。TCP/IP希望每次都可以以MSS尺寸的数据块来发送数据)。
Nagle算法就是为了尽可能发送大块数据。避免网络中充斥着很多小数据块。
Nagle算法的基本定义是随意时刻,最多仅仅能有一个未被确认的小段。
所谓“小段”。指的是小于MSS尺寸的数据块,所谓“未被确认”。是指一个数据块发送出去后。没有收到对方发送的ACK确认该数据已收到。
举个样例,一開始client端调用socket的write操作将一个int型数据(称为A块)写入到网络中,因为此时连接是空暇的(也就是说还没有未被确认的小段)。因此这个int型数据会被立即发送到server端,接着,client端又调用write操作写入‘/r/n’(简称B块),这个时候。A块的ACK没有返回。所以能够觉得已经存在了一个未被确认的小段,所以B块没有立即被发送,一直等待A块的ACK收到(大概40ms之后),B块才被发送。整个过程如图所看到的:
这里还隐藏了一个问题,就是A块数据的ACK为什么40ms之后才收到?这是由于TCP/IP中不唯独nagle算法,另一个ACK延迟机制。当Server端收到数据之后,它并不会立即向client端发送ACK,而是会将ACK的发送延迟一段时间(如果为t),它希望在t时间内server端会向client端发送应答数据,这样ACK就行和应答数据一起发送。就像是应答数据捎带着ACK过去。在我之前的时间中,t大概就是40ms。这就解释了为什么'/r/n'(B块)总是在A块之后40ms才发出。
假设你觉着nagle算法太捣乱了,那么能够通过设置TCP_NODELAY将其禁用。当然,更合理的方案还是应该使用一次大数据的写操作,而不是多次小数据的写操作。
TCP/IP具体解释--nagle算法和TCP_NODELAY的更多相关文章
- nagle算法和TCP_NODELAY
写socket发现的一个诡异现象,当时将多个小数据写操作合并成一个写操作,问题就没了.Chenshuo同学还建议我设置TCP_NODELAY,只是后来因为事情忙,也就没有再深究下去. 现在大概明白,是 ...
- TCP_NODELAY和TCP_CORK nagle算法和cork算法
TCP_NODELAY 默认情况下,发送数据採用Nagle 算法.这样尽管提高了网络吞吐量,可是实时性却减少了,在一些交互性非常强的应用程序来说是不同意的.使用TCP_NODELAY选项能够禁止Nag ...
- TCP/IP具体解释--TCP/UDP优化设置总结& MTU的相关介绍
首先要看TCP/IP协议,涉及到四层:链路层,网络层.传输层,应用层. 当中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Data)在应 ...
- TCP/IP具体解释--三次握手和四次握手 Dos攻击
TCP连接的状态图 TCP建立连接的三次握手过程,以及关闭连接的四次握手过程 贴一个telnet建立连接,断开连接的使用wireshark捕获的packet截图. 1.建立连接协议(三次握手) (1) ...
- 《TCP/IP具体解释卷2:实现》笔记--接口层
接口层包含在本地网上发送和接收分组的硬件与软件. 我们用设备驱动程序来表示与硬件及网络接口通信的软件,网络接口是指在一个特定网络上硬件与设备驱动器之间的接口. Net/3接口层试图在网络协议和连接到一 ...
- TCP/IP具体解释学习笔记——数据链路层(2)
五 Wireless LANs(Wi-Fi) 现在很流行的一种接入互联网的方式就是Wi-Fi了.我们用的ipad.手机.笔记本电脑等等都能够用这样的方式接入互联网,很方便灵活.一个典型的Wi-Fi网络 ...
- TCP/IP具体解释--TCP的分段和IP的分片
写在前面: 分组能够发生在运输层和网络层.运输层中的TCP会分段,网络层中的IP会分片.IP层的分片很多其它的是为运输层的UDP服务的,因为TCP自己会避免IP的分片,所以使用TCP传输在IP层都不会 ...
- TCP/IP详细解释--TCP/IP可靠的原则 推拉窗 拥塞窗口
TCP和UDP在同一水平---传输层.但TCP和UDP最不一样的地方.TCP它提供了一个可靠的数据传输服务,TCP是面向连接的,那.使用TCP两台主机通过第一通信"拨打电话"这个过 ...
- TCP/IP具体解释--TCP/IP可靠的原理 滑动窗体 拥塞窗体
TCP和UDP处在同一层---运输层,可是TCP和UDP最不同的地方是,TCP提供了一种可靠的数据传输服务,TCP是面向连接的,也就是说,利用TCP通信的两台主机首先要经历一个"拨打电话&q ...
随机推荐
- CacheHelper工具类的使用
package com.bbcmart.util; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import ne ...
- win7下硬盘安装win7+CentOS双系统方法
原文:win7下硬盘安装win7+CentOS双系统方法 LinuxCentOS安装大致介绍: win7下硬盘安装win7+CentOS双系统方法 原则: 所有的看完在装,请仔细看 一 条件: 1. ...
- myeclipse 那个版本号好用?
myeclipse 那个版本号好用? 有没有现成的下载地址?
- hdu 4404 Worms(多边形与圆的交)
求出爆炸点的坐标,就成了多边形与圆相交面积的模板题了... #include<algorithm> #include<iostream> #include<cstring ...
- Git——git 上传时 遗漏文件解决办法
今天在Server上建立一个git 库,把本地的code 上传到Server,再次clone下来时,发现少了些文件.原来git 工具不上上传一些二进制,pdf,.patch等一些文件.在上传时,git ...
- tera term 残ALT债券
Setup -> Keyboard对话框 Meta key变: left 版权声明:本文博客原创文章,博客,未经同意,不得转载.
- Thinkphp中的volist标签(查询数据集(select方法)的结果输出)用法简介
参考网址:http://camnpr.com/archives/1515.html 通常volist标签多用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数 ...
- text bss data的区别
BSS段 在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS ...
- 2-07. 素因子分解(20) (ZJUPAT 数学)
题目链接:http://pat.zju.edu.cn/contests/ds/2-07 给定某个正整数N,求其素因子分解结果,即给出其因式分解表达式 N = p1^k1 * p2^k2 *-*pm ^ ...
- hbase列表排序
hbase都是依照字典序进行排序的,也就是降序,在页面的表现就是最早的数据(rowkey最小的)排在前面. 眼下的解决方式是:给主键添加一个外键关联表.外键的生成规则是 400000000000-主键 ...