前边讲了TCP连接的建立和终止,分别要三次握手和四次通信。这些报文段都只包含首部,没有数据部分。    这里就讲讲数据传送的一些细节。一个TCP连接建立成功以后,就可以开始传送数据了~

一般TCP数据传输中,按分组数量算的话,一半是成块数据(比如FTP应用),一半是交互数据(比如Telnet应用)。
如果按照字节数比较的话,成块报文段远远高于交互报文段(显然交互报文段都是几个字节的数据...)

TCP的交互数据流:

比如Rlogin应用,每一次按键(每个字节)都会发送包,而不是敲一行命令回车后发送,并且Rlogin需要远程系统(服务器)回显我们(客户)键入的字符。这样一个字节就产生4个报文段。如图:


一般可以将服务器返回的报文段2和3进行合并—按键确认与按键回显一起发送。这种合并的技术 (称为经受时延的确认)。

就是说这个确认段的发送要稍微等一会,看看自己有没有还要发送的数据,放在一块传过去~这样就稍微提高了效率,减少网络负载。

Nagle算法:
前边演示在一个Rlogin连接上客户一般每次发送一个字节到服务器,这就产生了一些41字节长的分组:20字节的IP首部、20字节的TCP首部和1个字节的数据。在局域网上, 这些小分组(被称为微小分组(tiny gram))通常不会引起麻烦,因为局域网一般不会出现拥塞。但在广域网上,这些小分组则会增加拥塞出现的可能。一种简单和好的方法就是采用Nagle算法。

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

这表示,如果确认到达的快,那么发送的就快。如果在局域网中使用到了Nagle算法,可以想象数据得输入的多快才能造成为了等待确认到来,而塞很多数据。。所以一般都是在广域网TCP传输才用到Nagle算法。

-- 关闭Nagle算法:
可以看出来,Nagle算法是为了减少网络负载,只有一个ack到达了,我才接着发送过去数据。这就表明会有延迟,而这种延迟对交互数据的应用来说也有些蛋疼。。所以有时候也要禁用Nagle算法。

TCP的成块数据流:

TCP使用的被称为滑动窗口协议的流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组(注意区分前边的Nagle算法,等待ack的时候是组装成了一个分组发过去。这里的滑动窗口协议是一口气发送多个分组~)。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。
如图时间序列:

说明下:这里的实现是接收方每收到两个报文段,就会发送一个ACK(比如ack7是对于4和5的报文段。为什么ack8只返回了报文段6的确认?因为经受时延的定时器溢出了...表示我也想等你的比如报文段9过来,再发送ack8,但是定时器到点儿了,我必须发送了哈哈~)。

值得注意的是滑动窗口协议并不要求对每一个接收的数据段都要确认。

下图是针对这个时间序列图的滑动窗口协议示意图:

这里说下滑动窗口协议:

1-11是模拟的11个字节,1-3个字节已经被发送并且确认(可以看出滑动窗口就不包含已经确认的字节了,向右做滑动)。接收方通告的窗口称为提供的窗口(offered window),它覆盖了从第4字节到第9字节的区域,4-6字节是已经发送出去了但还没有得到确认,此时滑动窗口不能右移(因为有可能4-6的确认段我收不到,如果右移,我就没法重发,找不到了哈哈),且通告窗口(接收端提供的窗口大小)大小为6。发送方计算它的可用窗口,该窗口表明多少数据可以立即被发送(通告窗口减去发送但没确认的大小)。

当接收方确认数据后,这个滑动窗口不时地向右移动。窗口两个边沿的相对运动增加或减少了窗口的大小。我们使用三个术语来描述窗口左右边沿的运动:

如图:

1) 称窗口左边沿向右边沿靠近为窗口合拢。这种现象发生在数据被发送和确认时。

2) 当窗口右边沿向右移动时将允许发送更多的数据,我们称之为窗口张开。这种现象发生在另一端的接收进程读取已经确认的数据并释放了TCP的接收缓存时。

3) 当右边沿向左移动时,我们称之为窗口收缩。 协议中强烈不建议这种方式(通常不会发生)。

4) 左边沿往左边移动(这个不可能了,因为左边沿是根据ack确认段确定的,表示左边沿左边的数据已经得到了确认,如果说发生,也是ack重复了。。)

-窗口大小:

这里说下接收端的通告窗口大小。窗口大小表示,我最大可以容纳多少数据。来个图说明下:

1-3个报文段是在建立TCP连接。在第二个ack段中,接收端告诉发送端,我的通告窗口大小是6144个字节。发送端比较实惠,我也不见外,直接给你发过去6个数据段(每个1024,6个就是6144)。重点看一下第10个报文段,这是接收端把这过来的6个段都确认了,通告窗口大小由原来的6144变成了2048,这个很可能是因为我的接收缓冲区里仍然有数据(6144-2048个字节)没有被应用程序调取走。

-慢启动:

前边的TCP连接,可以看到,当连接建立后,发送端总是一下发送好几个分组过去,直至达到接收方的通告窗口大小为止。
当然这种策略在局域网中,几乎没有什么问题。但是如果发送方和接收方之间是一个存在着多个路由器和速率较慢的链路时,这就可能出现拥塞的问题...
TCP需要支持一种慢启动的算法。顾名思义,是一点点加速,而不是一次传太多过去。
实现原理:发送方需要支持一个窗口,拥塞窗口(congestion window,cwnd)。当TCP连接建立好以后,拥塞窗口被初始化为1个报文段,发送端每收到ACK,就在cwnd中增加报文段(比如说这个ACK是确认的一个报文段,那么我就增加一个报文段;下次我就发俩报文段,收到这俩的ACK后,我就增加到4个报文段长度。有点类似于成倍增加,这就是慢启动)。那么现在有两个窗口了,发送端传数据的时候是用拥塞窗口大小还是接收端的通告窗口大小呢?这里是取两者中较小的一个大小。

-

TCP/IP协议--TCP的交互数据流和成块数据流的更多相关文章

  1. TCP/IP之TCP交互数据流、成块数据流

    建立在TCP协议上的网络协议有telnet,ssh,ftp,http等等.这些协议根据数据吞吐量来分成两大类: (1)交互数据类型,例如telnet,ssh,这种类型的协议在大多数情况下只是做小流量的 ...

  2. TCP/IP详解学习笔记(11)-TCP交互数据流,成块数据流

    目前建立在TCP协议上的网络协议特别多,有telnet,ssh,有ftp,有http等等.这些协议又可以根据数据吞吐量来大致分成两大类:(1)交互数据类型,例如telnet,ssh,这种类型的协议在大 ...

  3. TCP/IP协议 | TCP协议 | UDP协议 | 三次握手四次挥手

    TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP.SMTP.TCP.UDP.IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP ...

  4. TCP/IP协议——TCP/IP协议栈及框架

    TCP/IP协议同ISO/OSI模型一样,也可以安排成栈形式.但这个栈不同于ISO/OSI版本,比ISO/OSI栈少,所以又称之为短栈.另外,需要知道的是:TCP/IP协议栈只是许多支持ISO/OSI ...

  5. TCP/IP协议--TCP协议概括和TCP连接的建立和终止

    TCP提供一种面向连接的.可靠的字节流服务.面向连接指,发送和接收方在交换数据前必须建立一个TCP连接.顺便说下,一个TCP连接只有两方,因此广播和多播是不能应用于TCP的.字节流指,两个应用程序通过 ...

  6. TCP/IP协议--TCP的超时和重传

    TCP是可靠传输.可靠之一体现在收到数据后,返回去一个确认.但是不能完全避免的是,数据和确认都可能丢失.解决这个办法就是,提供一个发送的重传定时器:如果定时器溢出时还没收到确认,它就重传这个报文段. ...

  7. 【转载】TCP /IP协议详解

    首先,TCP/IP不是一个协议,而是一个协议族的统称. 里面包括了IP协议,IMCP协议,TCP协议,以及http.ftp.pop3协议等等. TCP/IP协议分层 提到协议分层,我们很容易联想到IS ...

  8. TCP /IP协议详解【转】

    转自:https://www.jianshu.com/p/0cf648510bce?utm_campaign=maleskine&utm_content=note&utm_medium ...

  9. C# HTTP1.0 1.1 2.0与HTTPS 、TCP/IP协议的UDP与TCP、 Socket介绍与WebSocket

    一.HTTP1.0 1.1 2.0和HTTPS 1.HTTP协议是什么? HTTP协议是超文本传输协议的缩写,英文是Hyper Text Transfer Protocol.它是从WEB服务器传输超文 ...

随机推荐

  1. python的四大函数讲解

    Python的四类函数: 1.普通函数 2.默认函数 3.关键字函数 4.收集参数 1.普通函数 a.定义的时候直接定义变量名 b.调用的时候直接把变量或者值放入指定位置 def 函数名(参数1,参数 ...

  2. 【读书笔记】iOS-发布你的应用

    一,添加图标 你的应用在iPhone主屏幕上的标准图标(Icon.png)是57像素*57像素的正方形,PNG格式,不能有透明效果或者图层,72DPI.除些之外,你还可以提供一个同样格式的114像素* ...

  3. react+antd分页 实现分页及页面刷新时回到刷新前的page

    antd框架地址:https://ant.design/index-cn 利用antdUI框架做了个分页,其他功能都没问题,但是页面跳转后刷新会回到第一页,经过学习,在组件里增加了hash值,详情请看 ...

  4. 伪类选择器 E:nth-child(n)、E:nth-of-type(n)

    结构伪类是css3新增的类型选择器. E:nth-child(n).E:nth-of-type(n)就是其中之二.搞懂了这两个,基本上跟他俩一家的其他几个兄弟伙基本上也可以弄懂了. 首先先用文字语言来 ...

  5. Openjdk 安装 on centos7

    本文演示如何在CentOS7上安装openjdk. 1 准备工作 1.1 查看可安装的版本 $ yum -y list java-1.8* # 列出当前可用的安装版本 Available Packag ...

  6. JS列表

    promise 引用类型/值类型 ----- 对比python可变对象/不可变对象 原型继承

  7. 线程:生命周期、实现方式、start()和run()的区别!

    1.线程的生命周期 要想实现多线程,必须在主线程中创建新的线程对象.Java语言使用Thread类及其子类的对象来表示线程,在它的 一个完整的生命周期中通常要经历如下的五种状态: 新建:当一个Thre ...

  8. Postgresql_根据执行计划优化SQL

    执行计划路径选择 postgresql查询规划过程中,查询请求的不同执行方案是通过建立不同的路径来表达的,在生成许多符合条件的路径之后,要从中选择出代价最小的路径,把它转化为一个计划,传递给执行器执行 ...

  9. 安全之路 —— 借助DLL进行远程线程注入实现穿墙与隐藏进程

    简介        大多数后门或病毒要想初步实现隐藏进程,即不被像任务管理器这样典型的RING3级进程管理器找到过于明显的不明进程,其中比较著名的方法就是通过远程线程注入的方法注入将恶意进程的DLL文 ...

  10. 薛兆丰吴军何帆曾鸣万维刚李笑来罗永浩等得到APP专栏作者的书23本

    最近看了何帆的<大局观>,是他在得到APP的专栏文章的精选.顺便整理以下最近两三年内看过的得到APP其他专栏与课程作者的得到精选文集和他们写过的其他的书共23本. 薛兆丰 4星|<薛 ...