【网络协议】TCP交互数据流和数据流成块
前言
建立在TCP协议上的应用层协议有非常多,如FTP、HTTP、Telnet等,这些协议依据数据传输的多少能够分为两类:交互数据类型和成块数据类型。
交互数据类型,如:Telnet,这类协议一般仅仅做小流量的数据交换。比方每按下一个键,要回显一些字符。
成块数据类型。如:FTP,这类协议须要传输的数据比較多。一般传输的数据量比較大。
针对这两种不同的情况,TCP採用不同的策略进行数据传输。
交互数据流
针对交互性要求比較高的应用,比方Rlogin远程登录中,须要回显client输入的字符,每发送一个字节到服务端。并回显到client的步骤例如以下:
1、client产生一个41bit长的报文(20字节的IP首部。20字节的TCP首部,1字节的数据)。发送到服务端;
2、服务端发送过来一个40bit的确认报文。
3、服务端发送回显的字符。报文长为41bit;
4、client发送确认报文。报文长为40bit。
假设在局域网中,通常不会有什么麻烦,由于局域网一般不会出现拥塞,但在广域网中。这些小分组则会添加网络拥塞出现的可能。为了提高这类数据的发送效率和降低网络负担,TCP採用了两种策略:捎带ACK和Nagle算法。
捎带ACK
捎带ACK的意思是,当接收端接收到TCP报文段后,并不马上发送ACK报文,而是等上一段时间,假设这段时间里该主机有数据要发送到远程主机,就将该数据捎带上ACK一起发送过去,非常明显。这样能够降低传输开销。为了防止产生超时重传。绝大多数情况下。这个等待时间为200ms,超过了200ms,假设没有数据要一起发送。就直接发送ACK报文。
捎带ACK的策略一般也仅仅有在交互性比較高的应用中才会使用,对于成块数据流,一般大多数应用程序不会同一时候在两个方向上发送数据。
Nagle算法
该算法的重点是要求在TCP连接上组多仅仅能有一个未被确认的数据报在传输。
算法的大致思路例如以下:应用程序把要发送的数据逐个字节地从到TCP的发送缓存,发送方把线面的一部分数据先发送出去。并把后面到达的字节继续缓存起来,当发送方收到前面字节的确认后,再把发送缓冲中的全部数据组装成一个报文段发送出去。同一时候继续对随后到来的数据进行缓存。仅仅有收到前一个报文段的确认后才干继续发送下一个报文段。另外。Nagle算法还规定,当发送缓存中的数据已达到发送窗体大小的一半或已达到报文段的MSS值时,就马上发送一个报文段。
当数据到达较快而网络速率较慢时,用这样的方法可明显地降低所用的网络带宽。非常明显。该算法也是专门为交互性高的应用而设计的,对于成块数据流。假设每收到一次确认才干发送下一个报文段。那么传输速率就会非常低。
成块数据流
对于一些数据吞吐量要求较高的应用,总是希望每次发送尽可能多的数据到主机。对于这类应用,TCP使用滑动窗体协议,该协议同意发送方在停止发送前和等待确认前能够连续发送多个分组,因此能够加速数据的传输。
滑动窗体
滑动窗体的滑动是以字节为单位的。发送方A和接收方B在TCP三次握手的前两次握手时协商好了发送窗体和接受窗体的大小,发送方A依据B发送来的确认连接报文中标明的窗体的大小。来确定收到确认前的最大发送数据量。假设A接收到的B发来的确认报文中标明的窗体大小为0。则停止发送数据。直到收到不为0的确认报文,再继续发送。发送窗体表示在没有收到B的确认的情况下,A能够连续把窗体内的数据都发送出去,凡是已发送过的数据,在没有收到确认前都要临时保留。以便超时重传时使用。
须要注意的一点是:使用TCP滑动窗体协议时,接收方不必确认每个收到的分组。在TCP中。ACK确认是累积的,能够在接收到几个序号连续的报文段后仅仅发送一个ACK确认报文,但累积等待的时间最长不能超过0.5秒,以防止发送端超时重传。
另外,要注意滑动窗体的三种变化:
1、窗体合拢。窗体左边沿向右边沿靠近。这样的情况发生在数据被发送后收到确认时;
2、窗体张开。窗体右边沿向右移动,说明同意发送很多其它的数据。这样的情况发生在还有一端的接收进程从TCP接收缓存中读取了已经确认的数据时。
3、窗体收缩。
窗体右边沿向左移动,一般非常少发生,RFC也强烈不建议这么做,由于非常可能会产生一些错误。比方一些数据已经发送出去了,又要收缩窗体,不让发送这些数据。
另外,窗体的左边沿是肯定不可能左移的,假设接收到一个指示窗体左边沿向左移动的ACK,则它被觉得是一个反复ACK。并被丢弃。
总结下面几点:
1、发送方不必发送一个全窗体大小的数据,一次发送一部分就可以。
2、窗体的大小能够减小。可是窗体的右边沿却不能向左移动。
3、接收方在发送一个ACK前不必等待窗体被填满。
4、窗体的大小是相对于确认序号的。收到确认后的窗体的左边沿从确认序号開始。
发送接收缓冲区
本部分主要明白一下几点:
1、缓冲空间和序号空间都是有限的,而且都是循环使用的。
2、窗体大小一定不大于收发缓冲区的大小
3、发送缓冲区用来暂存发送方准备发送的TCP报文段和已发送但尚未收到确认的数据。
4、接收缓冲区用来暂按序到达但尚未被上层应用程序读取的数据合未按序到达的数据。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
【网络协议】TCP交互数据流和数据流成块的更多相关文章
- 网络协议TCP、Http、webservice、socket区别
网络协议TCP.Http.webservice.socket区别 http 和 webservice 都是基于TCP/IP协议的应用层协议 webservice是基于http的soap协议传输数据 w ...
- 网络体系结构的概念 - 网络协议TCP - 红黑联盟
https://i.cnblogs.com/EditPosts.aspx?opt=1 网络体系结构的概念 计算机网络就是一组通过一定形式连接起来的计算机系统,它需要四个要素的支持,即通信线路和通信设 ...
- 网络协议TCP/IP、IPX/SPX、NETBEUI简介
网络中不同的工作站,服务器之间能传输数据,源于协议的存在.随着网络的发展,不同的开发商开发了不同的通信方式.为了使通信成功可靠,网络中的所有主机都必须使用同一语言,不能带有方言.因而必须开发严格的标准 ...
- python网络编程--socket,网络协议,TCP
一. 客户端/服务端架构(用到网络通信的地方) 我们使用qq.微信和别人聊天,通过浏览器来浏览页面.看京东的网站,通过优酷.快播(此处只是怀念一下)看片片啥的等等,通过无线打印机来打印一个word文档 ...
- Go语言学习之9 网络协议TCP、Redis与聊天室
主要内容 1. Tcp编程2. redis使用 1. Tcp编程 (1)简介 Golang是谷歌设计开发的语言,在Golang的设计之初就把高并发的性能作为Golang的主要特性之一,也是 ...
- [网络协议]TCP粘包分析
关于socket粘包,socket缓冲区设置的问题,记录一下: 一 .两个简单概念长连接与短连接: 长连接 Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送 ...
- 网络协议TCP
TCP:传输控制协议 tcp的特点:面向连接(打电话模型),可靠传输 tcp通信的三个步骤: 1.通信双方建立连接 2.收发收据 3.关闭连接 tcp客户端实现流程 """ ...
- 31.网络协议介绍tcp/udp
网络协议 TCP:网络中传输数据的协议,打电话 解决了我可能在网络中找不到别人(数据无法传输到) 保证数据传输的稳定性,可靠性 保证数据的安全性,完整性 对方要有响应 尝试重新发送 UDP:传输数据的 ...
- 分布式系统(二) --SOA 以及一些网络通信协议TCP/UDP SYN攻击
SOA(面向服务的架构):Service Oriented Architecture面向服务的架构.也就是把工程拆分成服务层.表现层两个工程.服务层中包含业务逻辑,只需要对外提供服务即可.表现层只需要 ...
- ****** 四十二 ******、软设笔记【网络基础】-IPv6协议、常用的网络协议
一.IPv6协议 IPv6协议,全称"互联网协议第6版",即下一代的网际协议. 相对于IPv4来说,IPv6协议主要改进: *扩展的地址.IPv6地址长度为128位. *IPv6使 ...
随机推荐
- Selenium 出现: Caused by: java.lang.ClassNotFoundException: org.w3c.dom.ElementTraversal
webDriver 运行的时候出现: Caused by: java.lang.ClassNotFoundException: org.w3c.dom.ElementTraversal 解决办法: 只 ...
- 用Delphi实现Windows的鼠标钩子函数
Delphi是基于PASCAL语言的Windows编程工具,功能十分强大.然而在Delphi的帮助文件中,对Windows API函数的说明沿袭了 VC 的格式,和VC一样,对很多API函数的用法没有 ...
- 学习老外用webstorm开发nodejs的技巧--代码提示DefinitelyTyped
最近入了nodejs的坑,作为老码农,js对我来说还是很容易的.webstorm虽说用得不多,但是pycharms我是老手了,idea的东西一脉相承,想想也就那样了. 但是自从看了某个视频后,觉得毕竟 ...
- strip 命令的使用方法
用途 通过除去绑定程序和符号调试程序使用的信息,降低扩展公共对象文件格式(XCOFF)的对象文件的大小. 语法 strip [ -V ] [ -r [ -l ] | -x [ -l ] | -t | ...
- CSDN改版问题多多
刚刚上CSDN,发现改版了,推出C币功能. 然后看了2分钟,发现了一个Bug,于是准备提交到论坛.但是--居然提交Bug的论坛也出现Bug.印象中,每次CSDN更新版本号Bug都非常多,这,作为程序猿 ...
- 自绘XP风格菜单
这是以前写的代码,自绘XP风格的菜单,硬盘坏了后以为没了,最后写的一个软件要自定义风格,“翻箱倒柜”的终于在我可爱的古董机^_^上找到了一个应用的例子.还是把它放到Blog上来,即可共享又可作为备用 ...
- 设置静态IP
设定IP $sudo vi/etc/network/interfaces autolo iface lo inet loopback 加入下面内容 autoeth0 iface eth0inet st ...
- MP3文件的结构与编程
有一个朋友喜欢听MP3,为了获取MP3,写了一个程序,专门从一家音乐网站上搜索下载mp3,一下子下载了有上千首.这时朋友又犯愁了,这些MP3的歌曲名字都是使用1,2,3,4,..等数字命名,挑选起来十 ...
- 写给C语言新手的话
首先声明啊,写这个是因为一些加我QQ的朋友问我学习经验,我才写的. 另外,如果是二级党,那么请用谭浩强老师的书.然后你就可以不用看了.倒不是有偏见,而是我写的这个东西,根本不是为了考试,而是为了和新手 ...
- 浙江大学PAT上机题解析之2-06. 数列求和
给定某数字A(1<=A<=9)以及非负整数N(0<=N<=100000),求数列之和S = A + AA + AAA + … + AA…A(N个A).例如A=1, N=3时,S ...