TCP/IP协议--TCP的交互数据流和成块数据流
前边讲了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的交互数据流和成块数据流的更多相关文章
- TCP/IP之TCP交互数据流、成块数据流
建立在TCP协议上的网络协议有telnet,ssh,ftp,http等等.这些协议根据数据吞吐量来分成两大类: (1)交互数据类型,例如telnet,ssh,这种类型的协议在大多数情况下只是做小流量的 ...
- TCP/IP详解学习笔记(11)-TCP交互数据流,成块数据流
目前建立在TCP协议上的网络协议特别多,有telnet,ssh,有ftp,有http等等.这些协议又可以根据数据吞吐量来大致分成两大类:(1)交互数据类型,例如telnet,ssh,这种类型的协议在大 ...
- TCP/IP协议 | TCP协议 | UDP协议 | 三次握手四次挥手
TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP.SMTP.TCP.UDP.IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP ...
- TCP/IP协议——TCP/IP协议栈及框架
TCP/IP协议同ISO/OSI模型一样,也可以安排成栈形式.但这个栈不同于ISO/OSI版本,比ISO/OSI栈少,所以又称之为短栈.另外,需要知道的是:TCP/IP协议栈只是许多支持ISO/OSI ...
- TCP/IP协议--TCP协议概括和TCP连接的建立和终止
TCP提供一种面向连接的.可靠的字节流服务.面向连接指,发送和接收方在交换数据前必须建立一个TCP连接.顺便说下,一个TCP连接只有两方,因此广播和多播是不能应用于TCP的.字节流指,两个应用程序通过 ...
- TCP/IP协议--TCP的超时和重传
TCP是可靠传输.可靠之一体现在收到数据后,返回去一个确认.但是不能完全避免的是,数据和确认都可能丢失.解决这个办法就是,提供一个发送的重传定时器:如果定时器溢出时还没收到确认,它就重传这个报文段. ...
- 【转载】TCP /IP协议详解
首先,TCP/IP不是一个协议,而是一个协议族的统称. 里面包括了IP协议,IMCP协议,TCP协议,以及http.ftp.pop3协议等等. TCP/IP协议分层 提到协议分层,我们很容易联想到IS ...
- TCP /IP协议详解【转】
转自:https://www.jianshu.com/p/0cf648510bce?utm_campaign=maleskine&utm_content=note&utm_medium ...
- 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服务器传输超文 ...
随机推荐
- window的Navigator 对象
Navigator 对象包含有关浏览器的信息. Navigator 对象属性 document.write("浏览器的代码名:" + navigator.appCodeName + ...
- demo:复制粘贴功能
复制链接功能,也是为了方便用户一键"复制",粘贴链接和文本到指定位置,在此,接着上一篇"demo:生成专属二维码link "来记录一键"复制" ...
- 如何用原生JS实现一个简单的promise
我又又又回来了,最近真是累的跟狗一样,急需一个大保健回复一下子精力 我现在是一边喝着红牛一边写着博客,好了好了,不扯了,回归整体好吧 先简单来说一下啥是promise吧 它是什么?Promise是一个 ...
- ArcGIS Portal与Adapter安装问题
1. WIN2008R2 80端口被system占用解决办法 修改注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP右侧的star ...
- 活字格 QQ 群和客户
上活字格的官网溜达了一圈,有2点收获: 1. 活字格基础教学 QQ 群 这个群居然有1790人!好大的一个群,是不是说明学活字格的人也多呢,我潜水几天看看先 2. 活字格的用户真是各行各业都有,看到他 ...
- RxJava2.0的使用详解
RxJava2.0的使用详解 1,初识RxJava RxJava就是一种用Java语言实现的响应式编程,来创建基于事件的异步程序 RxJava是一个基于事件订阅的异步执行的一个类库,目前比较火的一些技 ...
- Expo大作战(三十)--expo sdk api之Permissions(权限管理模块),Pedometer(计步器api)
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- [iOS]多线程和GCD
新博客wossoneri.com 进程和线程 进程 是指在系统中正在运行的一个应用程序. 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开QQ.Xcode,系统就会分别 ...
- Spring Data JPA方法定义规范
Spring Data Jpa方法定义的规则: (1)简单条件查询 简单条件查询:查询某一个实体类或者集合. 按照Spring Data的规范的规定,查询方法以find | read | get开头, ...
- 洗礼灵魂,修炼python(41)--巩固篇—从游戏《绝地求生-大逃杀》中回顾面向对象编程
声明:本篇文章仅仅以游戏<绝地求生>作为一个参考话题来介绍面向对象编程,只是作为学术引用,其制作的非常简易的程序也不会作为商业用途,与蓝洞公司无关. <绝地求生>最近很火,笼络 ...