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服务器传输超文 ...
随机推荐
- React-classnames库
今天在项目中看到了大佬引入了classnames,之前没用过所以去搜了搜,感觉还真的是挺好用的,搜到一篇很不错的文章,跟原创作者交流了一下就转载过来了! 下面废话不多说,我们直接来看文章吧 首先我们我 ...
- 【代码笔记】Web--使用Chrome来查看网页源代码
一,用Chrome打开百度页面,如图所示. 二,鼠标右键--->显示网页源代码--->如图所示. 三,鼠标右键--->检查---->如图所示.此时可以通过Device来看不同设 ...
- 反编译Apk得到Java源代码
原文章转载自:http://hi.baidu.com/%CB%BF%D4%B5%CC%EC%CF%C2/blog/item/2284e2debafc541e495403ec.html 本人转载自:ht ...
- C#语言————第四章 深入C#的String类
*********类型转换**************** Convert与Parse的区别: Convert可以将任何内置类型转换为其他任何内置类型 XX.Parse:只能将字符串转换为XX类型例如 ...
- 转:SQL Server中服务器角色和数据库角色权限详解
当几个用户需要在某个特定的数据库中执行类似的动作时(这里没有相应的Windows用户组),就可以向该数据库中添加一个角色(role).数据库角色指定了可以访问相同数据库对象的一组数据库用户. 数据库角 ...
- java基础面试题(Servlet生命周期)
Servlet运行在Servlet容器中,其生命周期由容器来管理.Servlet的生命周期通过javax.servlet.Servlet接口中的init().service()和destroy()方法 ...
- msyql备份还原
MySQL备份和还原,都是利用mysqldump.mysql和source命令来完成的. 1.Win32下MySQL的备份与还原 1.1 备份 开始菜单 | 运行 | cmd |利用“cd \Prog ...
- CanalSharp.AspNetCore v0.0.4-支持输出到MongoDB
一.多样输出支持 CanalSharp.AspNetCore是一个基于CanalSharp的适用于ASP.NET Core的一个后台任务组件,它可以随着ASP.NET Core实例的启动而启动,目前采 ...
- UVA804-Petri Net Simulation(模拟)
Problem UVA804-Petri Net Simulation Accept:251 Submit:1975 Time Limit: 3000 mSec Problem Descriptio ...
- P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib (数论—素数 + DFS)
这大概是我写的第一个DFS 题目描述 农民约翰的母牛总是产生最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们.农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨, ...