TCP数据流
1. 引言
如果按照分组数量计算,约有一半的TCP报文段包含成块数据(如FTP、电子邮件等),另一半则包含交互数据(如telnet和rlogin)。
如果按照字节计算,则成块数据与交互数据的比例约为90%和10%。这是因为成块数据的报文段基本上都是满长度(full-sized)的(通常为512字节的用户数据),而交互数据则小得多,研究表明telent和rlogin分组中通常约90%的用户数据小于10字节。
因此TCP需要能处理交互数据和成块数据,但使用的处理算法有所不同。
2. 交互数据流
2.1 经受时延ACK/数据捎带ACK
一个Rlogin连接上键入一个交互命令时会产生4个报文段:
(1)来自客户的交互按键
(2)来自服务器的按键确认
(3)来自服务器的按键回显
(4)来自客户的按键回显确认
如图:
然而,我们一般可以将报文段(2)和(3)进行合并--按键确认与按键回显一起发送(经受时延的确认)
通常TCP在接收到数据时并不立即发送ACK;相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送(有时称这种现象为数据捎带ACK)
绝大多数实现采用的时延为200ms,也就是说,TCP将以最大200ms的时延等待是否有数据一起发送。
2.2 Nagle算法
一个Rlogin连接上客户一般每次发送一个字节到服务器,这就产生了一些41字节长的分组:20字节的IP首部、20字节的TCP首部和1字节的数据。在局域网上,这些小分组(tinygram)通常不会引起拥塞。
但在广域网上,这些小分组则会增加拥塞出现的可能,一种简单和好的方法就是采用Nagle算法。
Nagle算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反,TCP收集这些少量的分组,并在确认到来时以一个分组的方式发出去。
有时需要关闭Nagle算法:小消息(鼠标移动)必须无时延地发送,以便为进行某种操作的交互用户提供实时的反馈。Socket API用户可以使用TCP_NODELAY选项来关闭Nagle算法。
3. 成块数据流
3.1 滑动窗口
如图
将字节1~11进行标号,接收方通告的窗口称为提出的窗口(offered window),它覆盖了从第4字节到第9字节的区域,表明接收法已经确认了包括第3字节在内的数据,且通告窗口大小为6。
窗口大小与确认序号相对应的,发送方计算它的可用窗口,该窗口表明多少数据可以立即被发送。
当接收方确认数据后,这个滑动窗口向右移动。窗口边沿的相对运动增加或减少了窗口的大小。有如下4种移动情况:
(1)称窗口左边沿向右边沿靠近为窗口合拢,这种现象发生在数据被发送和确认时
(2)当窗口右边沿向右移动时将允许发送更多的数据,称之为窗口张开。这种现象发生在一段的接收进程读取已经确认的数据并释放了TCP的接收缓存时
(3)当右边沿向左移动时,称之为窗口收缩。(不允许)
(4)窗口左边沿向左移动。(不存在)
特别说明:
(1)发送方不必发送一个全窗口大小的数据。
(2)来自接收方的一个报文段确认数据并把窗口向右边滑动。这是因为窗口的大小是相对于确认序号的。
(3)窗口大小可以减小,但是窗口的右边沿却不能够向左移动,如果左边沿到达右边沿,则称为一个零窗口,此时发送方不能够发送任何数据。
(4)接收方在发送一个ACK前不必等待窗口被填满。
3.2 窗口大小
由接收方提供的窗口的大小通常可以由接收进程控制,这将影响TCP的性能。
Socket API允许进程设置发送和接收缓存的大小。接收缓存的大小是该连接上所能够通告的最大窗口大小。有一些应用程序通告修改Socket缓存大小来增加性能。
3.3 PUSH标志
发送方使用该标志通告接收方将所收到的数据全部提交给接收进程。这里的数据包括与PUSH一起发送的数据以及接收方TCP已经为接收进程收到的其他数据。
3.4 慢启动
如果发送方和接收方之间存在多个路由器和速率较慢的链路时,就有可能出现一些问题。一些中间路由器必须缓存分组,并有可能耗尽存储器的空间。
TCP支持一种称为“慢启动(Slow start)”算法。该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。
慢启动为发送方的TCP增加了另一个窗口:拥塞窗口(congestion window),记为cwnd。当与另一网络主机建立TCP连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。
每收到一个ACK,拥塞窗口就增加一个报文段(cwnd以字节为单位,但是慢启动的报文段大小为单位进行增加),发送方取拥塞窗口与通告窗口中的最小值最为发送上限。
拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。
发送方开始时发送一个报文段,然后等待ACK。当收到该ACK时,拥塞窗口从1增加为2,即可以发送两个报文段。当收到这两个报文段的ACK时,拥塞窗口就增加为4。这是一种指数增加的关系。
当某些点上达到了互联网的容量,于是中间路由器开始丢弃分组。这就通告发送方它的拥塞窗口开的过大。
3.5 紧急方式
TCP提供了“紧急方式”(urgent mode),它使一段可以告诉另一端有些具有某种方式的“紧急数据”已经放置在普通的数据流中。另一端被通告这个紧急数据已被放置在普通数据流中,由接收方决定如何处理。
可以通过TCP首部中的两个字段来发出这种从一端到另一端的紧急数据已经被放置在数据流中的通告。URG比特被置为1,并且一个16位的紧急指针被置为一个正的偏移量,该偏移量必须与TCP首部中的序号字段相加,以便得出紧急数据的最后一个字节的序号。
TCP数据流的更多相关文章
- 基于libnids的TCP数据流的还原(多线程实现) .
我们知道,libnids本身可以实现TCP数据流的重组,但是如果一个TCP流数据量比较大的时候,就会分成好多个TCP报文段,这些报文段在网络中的传播可能是乱序的,利用libnids可以帮助我们按顺序接 ...
- TCP/IP具体解释学习笔记--TCP数据流
1.TCP的交互数据流 (1)基本概念 所谓交互数据流,其对TCP而言,就是他们所产生的大多数的TCP报文段中所包括的数据不超过10个字节.比如聊天等telnet的软件的TCP数据流就属于TCP交互数 ...
- ZooKeeper(四):从TCP数据流到zk内部处理包的转换
通过前面几篇文章,我们可以从整体上看到zk是如何处理网络数据的宏观架构. 本文我们从细节着手,看一下一个tcp的包是如何转换到内部的数据流处理的. 一.监听用户请求socket 基于NIO的端口监听, ...
- 使用python脚本+zabbix前端监控云联网底层TCP数据流所负载的链路质量,并在丢包时联动保存MTR记录
背景 目前国内各家云联网跨区域数据传输,会将数据流通过哈希运算负载到不同的底层链路上,而底层链路质量差异较大,这种情况导致的现象就是,使用传统的icmp监控线路正常,但是业务一直不稳定,所以才有了使用 ...
- 《TCP/IP详解 卷一》读书笔记-----TCP数据流
1.Delayed Acknowledgements:TCP通常不会在收到数据之后立即返回一个ACK,而是会有一个延时,希望能ACK报文段中带上一些数据,通常这个延时为200ms 2.Nagle Al ...
- TCP数据流稳定性--TCP分片,重组及乱序
http://www.cnblogs.com/derekchen/archive/2009/07/15/1524415.html 1.IP分片的情况.IP软件包有一个[分片]和[重组]模块,一个IP数 ...
- TCP/IP 笔记 - TCP数据流和窗口管理
TCP流量控制机制通过动态调整窗口大小来控制发送端的操作,确保路由器/接收端消息不会溢出. 交互式TCP连接 交互式TCP连接指该连接需要在客户端和服务器之间传输用户输入信息,如按键操作.短消息.操作 ...
- libnids TCP数据流重组,显示TCP连接过程的程序总无法捕获数据包解决办法:
法一: 指定可用网卡: nids_params.device="lo"; 法二: nids.h中有这么一段: struct nids_chksum_ctl { u_int ne ...
- TCP/IP之TCP交互数据流、成块数据流
建立在TCP协议上的网络协议有telnet,ssh,ftp,http等等.这些协议根据数据吞吐量来分成两大类: (1)交互数据类型,例如telnet,ssh,这种类型的协议在大多数情况下只是做小流量的 ...
随机推荐
- STL - 容器 - Deque
Deque和Vector类似,只不过deque头尾都开放,能够在头尾进行快速插入和删除操作 DequeTest.cpp #include <iostream> #include <d ...
- Java从零开始学五(数据类型转换)
一.数据类型转换 分为“自动类型转换”和“强制类型转换” 二.自动类型转换 低级别------>高级别 byte b=7; int i=b; System.out.println("i ...
- HDOJ 4686 Arc of Dream 矩阵高速幂
矩阵高速幂: 依据关系够建矩阵 , 高速幂解决. Arc of Dream Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65535/ ...
- Android 如何将Canvas上绘制的内容保存成本地图片(转)
效果如下图所示 保存在sd卡上的文件为 手机上显示效果为: 1>>在Manifest文件中增加相应权限 <!-- 在SDCard中创建与删除文件权限 --> <uses- ...
- WebApi 数据保护操作未成功。这可能是由于未为当前线程的用户上下文加载用户配置文件导致的。当线程执行模拟时,可能会出现此情况。","ExceptionType":"System.Security.Cryptography.CryptographicException","StackTrace
在调用System.Security.Cryptography.ProtectedData.Protect方法来保护私密信息时,IIS可能会报以下错误:CryptographicException: ...
- 创建Maven项目后,发现目录里面只有src/main/resources
创建Maven项目: 创建文件后,发现目录只有一个:缺少了src/main/java 和 src/test/java 百度后发现这个有效果,在本环境中只处理了第三步就可以了: 1.eclipse-&g ...
- 22、集合(Collection)
一.集合(Collection) 1.简介 Collection是一个接口,其定义了集合的相关功能方法.Collection继承了Iterable接口,而Iterable接口有一个方法Iterator ...
- Rational Rose 2003 逆向工程转换C++源代码成UML类图
主要介绍用户如何使用Rose的逆向工程生成UML模型,并用来进行C++代码的结构分析. Rational Rose可以支持标准C++和Visual C++的模型到代码的转换以及逆向工程.下面将详细地说 ...
- 【微信小程序】用户首次进入小程序拒绝授权,如何再次调用授权页面,获取用户信息userInfo
前言:微信小程序的app.js里面,最少有2个接口,一个wx.login:一个是wx.getUserInfo: 前者得到腾讯给我们的微信用户唯一的code,通过code获取openid,这个不需要用户 ...
- PHP中一些有用的函数
<?php /** * 加密解密 * * @param string $key * @param string $string * @param string $decrypt * @retur ...