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,这种类型的协议在大多数情况下只是做小流量的 ...
随机推荐
- glassfish--服务搭建
集群配置: 1. DAS节点执行: 1)./asadmin start-domain domain1 2)./asadmin change-admin-password 3)./asadmin ena ...
- php之快速入门学习-3(print和echo)
PHP echo 和 print 语句 echo 和 print 区别: echo - 可以输出一个或多个字符串 print - 只允许输出一个字符串,返回值总为 1 提示:echo 输出的速度比 p ...
- rm 命令(转)
原文:http://www.cnblogs.com/peida/archive/2012/10/26/2740521.html rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件 ...
- 【Qt】splitter
一段简单的切割窗体的程序: <span style="font-size:18px;">#include "mainwindow.h" #inclu ...
- MySQL 数据库几种类型
关系数据库(MySQL.Oracle.SQL Server.DB2.Postgres)键-值存储数据库(Riak和Redis)面向列的数据库(HBase) 面向文档的数据库(MongoDB 和Couc ...
- 改动Apach默认port
一.改动Apache的默认port号 在WEB SERVER界,无论是微软的IIS还是世界排名第一的Apache,它们安装好后默认的网页服务port号都是80.有必要指出的是,假设你的电脑中已经安装有 ...
- 用BeanUtilsDate类型值为空报错的解决方法
除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发 ...
- EXCEPTION-JS
CreateTime--2016年11月22日13:00:55Author:Marydon 声明:异常类文章主要是记录了我遇到的异常信息及解决方案,解决方案大部分都是百度解决的,(这里只是针对我遇 ...
- 类的专有方法(__repr__)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #http://blog.csdn.net/yyt8yyt8/article/details/7030416 ...
- CentOS 7 网络磁盘挂载到本地 并测试传输速度
本文中的配置只做测试使用,正式环境中考虑到安全,请自行结合网上介绍的配置细节完善配置内容. 首先明确两个概念,服务器和客户端(本地),我们要做的是将服务端的硬盘上的/home/liuyx 目录挂载到本 ...