章节回顾:

《TCP/IP详解卷1:协议》第1章 概述-读书笔记

《TCP/IP详解卷1:协议》第2章 链路层-读书笔记

《TCP/IP详解卷1:协议》第3章 IP:网际协议(1)-读书笔记

《TCP/IP详解卷1:协议》第3章 IP:网际协议(2)-读书笔记

《TCP/IP详解卷1:协议》第4章 ARP:地址解析协议-读书笔记

《TCP/IP详解卷1:协议》第5章 RARP:逆地址解析协议-读书笔记

《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记

《TCP/IP详解卷1:协议》第11章 UDP:用户数据报协议-读书笔记

《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(1)-读书笔记

《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(2)-读书笔记

《TCP/IP详解卷1:协议》第19章 TCP的交互数据流-读书笔记


1、引言

有关TCP通信量的研究发现:按分组数量计算,约有一半的TCP报文段包含成块数据(如FTP、电子邮件和Usenet新闻),另一半则包含交互数据(如Telnet和Rlogin)。按字节计算,成块数据与交互数据的比例约为90%和10%。

成块数据的报文段基本上都是满长度的(通常为512字节的用户数据),交互数据则小得多(Telnet和Rlogin分组中约90%左右的用户数据小于10个字节)

TCP需要同时处理这两类数据,但使用的处理算法不同。


2、交互式输入

说明:本书是以远程登录Rlogin协议模拟交互输入的,我没有进行相关实验,下面我会给出作者所做的实验截图。

如图19-1所示,Rlogin协议需要远程系统回显客户输入的字符,每按一个字符就会产生一个分组,而不是每次一行作为一个分组。

一般可以将报文段2和3合并(图中两个红框)

当我们键入5个字符date\n时的数据流,如图19-2所示:

说明:

(1)第1行:客户发送字符d到服务器;第2行:该字符的确认及回显;第3行:回显字符的确认。

(2)与字符a有关的是第4~6行,与字符t有关的是第7~9行,与字符e有关的是第10~12行。

(3)13~15行与上面稍有不同。客户发送到服务器的是一个字符(换行符),而回显的是两个字符(图中14行红线处),这两个字符为:回车和换行字符,作用是将光标移动到左边并换到下一行。

(4)第16行:来自服务器date命令的输出。这30个字节(图中红线处)由28个字符与最后的回车+换行组成。第17、18行:服务器发往客户7个字符(第18行),它们是在服务器主机上的客户提示符:svr4%。第19行:确认了这7个字符。


3、经受时延的确认

图19-3表示了图19-2中数据交换的时间。

通常TCP在接收到数据时并不立即发送ACK;它会推迟发送,以便将ACK与需要沿该方向发送的数据一起发送,有时称这种现象为数据捎带ACK

说明:绝大多数实现采用的时延为200ms,即TCP将以最大200ms的时延等待是否有数据一起发送。

下面我假设你会看这张图中标记的时间差,会计算实际时间(累加)。说明如下

观察bsdi接收到数据和发送ACK之间的时间差:123.5、65.6、109.0、132.2、42.0、140.3和195.8 ms,似乎是随机的。观察bsdi发送ACK的实际时间(从0开始计算)为:139.9、539.3、940.1、1339.9、1739.9、1940.1和2140.1 ms,这些时间差是200ms的整数倍。

注意:因为TCP使用了一个200ms的定时器,以相对于内核引导的200ms固定时间溢出。由于将要确认的数据是随机到达的,TCP在内核的200ms定时器的下一次溢出时得到通知。


4、Nagle算法

Rlogin连接时,一般每次发送一个字节到服务器,这就产生了一些41字节长的分组:20字节的IP首部、20字节的TCP首部和1个字节的数据。

在局域网上,这些小分组(被称为微小分组tinygram)通常不会引起麻烦,因为局域网一般不会出现拥塞。在广域网上,这些小分组则会增加拥塞出现的可能。一种简单有效的方法就是采用RFC 896建议的Nagle算法。

算法说明:

算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反,TCP收集这些少量的分组,并在确认到来时以一个分组的方式发出去。

算法优点:

算法的优越之处在于它是自适应的:确认到达得越快,数据也就发送得越快。在希望减少微小分组数目的低速广域网上,则会发送更少的分组。

从图19-3中看到,在以太网上一个字节被发送、确认和回显的平均往返时间约为16ms。为了产生比这个速度更快的数据,我们每秒键入的字符必须多于60个。说明在局域网环境下两个主机之间发送数据时很少使用这个算法。

当往返时间(RTT)增加时,如通过一个广域网,情况发生了变化。如图19-4:

从左到右待发数据的长度是不同的,分别为:1、1、2、1、2、2、3、1和3个字节。这是因为客户只有收到前一个数据的确认后才发送已经收集的数据。通过使用Nagle算法,为发送16个字节的数据客户只需要使用9个报文段,而不再是16个

关闭Nagle算法

有时我们也需要关闭Nagle算法。例如,X窗口系统服务器,小消息(鼠标移动)必须无时延地发送,以便为进行某种操作的交互用户提供实时的反馈。


5、窗口大小通告

观察图19-4,可以看到slip通告窗口大小为4096字节,vangogh通告其窗口大小为8192字节。但报文段5通告的窗口大小为4095个字节,意味着TCP缓冲区中仍然有一个字节等待应用程序(Rlogin客户)读取。

说明:

(1)通常服务器通告窗口大小为8192个字节,这是因为服务器在读取并回显接收到的数据之前,其TCP没有数据发送。当服务器已经读取了来自客户的输入后,来自服务器的数据将被发送。

(2)在ACK到来时,客户的TCP总是有数据需要发送。这是因为它在等待ACK的过程中缓存接收到的字符。当客户TCP发送缓存的数据时,Rlogin客户没有机会读取来自服务器的数据,因此,客户通告的窗口大小总是小于4096。


小结:

交互数据总是以小于最大报文段长度的分组发送。对于这些小的报文段,接收方使用经受时延的确认方法来判断确认是否可被推迟发送,以便与回送数据一起发送。这样通常会减少报文段的数目。在较慢的广域网环境中,通常使用Nagle算法来减少这些小报文段的数目。这个算法限制发送者任何时候只能有一个发送的小报文段未被确认。

《TCP/IP详解卷1:协议》第19章 TCP的交互数据流-读书笔记的更多相关文章

  1. TCP/IP详解 卷1 第十九章 TCP的交互数据流

    19.1 引言 成块数据:比如ftp.电子邮件.Usenet新闻 交互数据:Telnet.Rlogin 成块数据的报文段基本上都是满长度(full-size)的,而交互数据小的多(Telnet和Rlo ...

  2. 【TCP/IP详解 卷一:协议】第二章:链路层

    2.1 引言 链路层的三个目的: (1)为IP模块发送和接收IP数据报. (2)为ARP模块发送ARP请求和接收ARP应答.地址解析协议:ARP. (3)为RARP模块发送RARP请求和接收RARP应 ...

  3. 【TCP/IP详解 卷一:协议】第一章概论 学习笔记

    第一章 概述 游览了一下,本章主要是简介OSI模型的低层(1-4层).介绍了TCP/IP协议族的相关知识. TCP/IP的分层 Application <--> TCP / UDP < ...

  4. tcp/ip详解 卷1 -- 协议概述

    第一章 概述 分层 TCP/IP 通常被认为是一个四层协议系统. 每一层负责不同的功能. 链路层, 也成为数据链路层或者网络接口层. 通常包括 操作系统中的设备驱动程序和计算机中对应的网络接口卡. 主 ...

  5. 《TCP/IP详解 卷1:协议》读书笔记

    第一章 概述 协议栈 应用层 HTTP,FTP   运输层 TCP, UDP 段(Segment) 网络层 IP, ICMP, IGMP 数据报(Datagram) 链路层   帧(Frame) 物理 ...

  6. 【TCP/IP详解 卷一:协议】第二十章 TCP的成块数据流

    本章节主要内容: ACK的累积 滑动窗口协议(即 接收方TCP数据报缓存的大小) 流量控制(慢启动 -发送方TCP的 拥塞窗口(cwnd) 以及接受方的 通告窗口) 20.1 引言 在教材的之前章节中 ...

  7. TCP/IP详解 卷一(第十九章 TCP的交互数据流)

    TCP需要同时处理两类数据:块数据.交互数据. 本章将以Rlogin应用为例观察交互数据的传输过程. 交互式输入 首先观察在一个Rlogin连接上键入一个交互命令时所产生的数据流(每键入一个交互按键都 ...

  8. TCP/IP详解卷1 - wireshark抓包分析

    TCP/IP详解卷1 - 系列文 TCP/IP详解卷1 - 思维导图(1) TCP/IP详解卷1 - wireshark抓包分析 引言 在初学TCP/IP协议时,会觉得协议是一种很抽象的东西,通过wi ...

  9. 《TCP/IP详解卷1:协议》第1章 概述-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  10. 《TCP/IP详解卷1:协议》第2章 链路层-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

随机推荐

  1. Docker CentOS 7.2镜像systemd问题解决办法

    docker的CentOS 7.2最新版官方镜像使用systemctl管理程序时会遇到如下错误: Failed to get D-Bus connection: Operation not permi ...

  2. 【读书笔记《Android游戏编程之从零开始》】14.游戏开发基础(Bitmap 位图的渲染与操作)

    Bitmap 是图形类,Android 系统支持的图片格式有 png.jpg.bmp 等. 对位图操作在游戏中是很重要的知识点,比如游戏中需要两张除了大小之外其他完全相同的图,那么如果会对位图进行缩放 ...

  3. IOS添加手势识别

    ios里面有手势识别,多点触控等功能,过去要实现手势识别很复杂,现在苹果为我们实现了,手势识别变得很简单 1.向视图添加手势识别器:(一般由controller完成,有时View也可以添加) 2.提供 ...

  4. C#委托与C语言函数指针及函数指针数组

    C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...

  5. 我发现:在StackOverflow上拯救歪果仁十分有意思!

    菊长:火星特工们!今天是周五了,大家有什么提议? BeJavaGod:报告菊长!我发现,在StackOverflow上拯救歪果仁十分有意思! 噗哈哈,时不时遇到问题会使用到StackOverflow, ...

  6. [转]Rapid Reporter——轻量级ET测试记录工具

    下载地址:http://testing.gershon.info/reporter/ 特别感谢:邰晓梅老师 在一次ET的在线培训课程,邰晓梅老师使用的是这个工具. Rapid Reproter,是一款 ...

  7. java 21 - 1 IO流中的字符流概述

    字节流通过读取一个byte数组的方式可以读取中文的,但是有可能出现小问题,所以,读取中文最好是用字符流. 字符流: 字符流=字节流+编码表. 编码表: 由字符及其对应的数值组成的一张表 编码表介绍: ...

  8. Mac上安装node.js

    1.下载node for mac并一路默认安装 2.测试成功否 3.copy this file to test(save as javascript file) var http = require ...

  9. Mina 中遇到SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder"

    SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".SLF4J: Defaulting to no-op ...

  10. [原创]CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接

    近年来,由于开源项目.社区的活跃热度大增,进而引来持续集成(CI)系统的诞生,也越发的听到更多的人在说协同开发.敏捷开发.迭代开发.持续集成和单元测试这些拉风的术语.然而,大都是仅仅听到在说而已,国内 ...