TCP学习总结(三)
TCP的流量控制
1.利用滑动窗口实现流量控制
所谓流量控制,就是让发送方的发送速率不要太快,要让接收方来得及接收。利用下图来说明如何利用滑动窗口机制进行流量控制:
一开始(connect后),B告诉A: 我的接收窗口rwnd=400,TCP的窗口单位是字节,不是报文段。报文段序号初始值设为1。
接收方B进行来3次流量控制。第一次把窗口减小到rwnd=300,第二次又减到rwnd=100,最后减到rwnd=0,即不允许发送方再发送数据了。这种情况,发送方A暂停发送的状态将持续到B重新发出一个新的窗口值为止。
还应注意到,B向A发送的三个报文段都设置来ACK(报文段头部的确认位)=1,只有ACK=1时,确认号字段才有意义。小写的ack表示确认字段的值=接收到最后一个报文段+1。
考虑一种情况,在上图,B向A发送了零窗口的报文段不久后,B的接收缓存又有了一些空间,于是B发送的rwnd=400的回复确认报文段。然而在传输过程中丢失了,那么A会一直等待B发送非零窗口的通知,B也一直等待A发送数据,这样就形成来一个死锁的局面!
为了解决这个问题,TCP为每一个连接设有一个持续计时器。只要TCP连接的一方(A)收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到了,该方(A)就发送一个零窗口探测报文段(仅携带1字节的数据),而对方(B)就在确认这个探测报文段时给出了现在的窗口值(rwnd=400)。如果窗口仍是零,那么收到这个报文段的一方(A)重新设置持续计时器。如果窗口不是零,死锁的僵局就打破了。
2. 考虑传输效率
上一章节讲到,应用进程把数据传送到TCP的发送缓存后,剩下的发送任务就由TCP来控制了。
TCP用不同的机制来控制TCP报文段的发送时机:
1. 只要缓存中存放的数据等于MSS(最大报文段长度)时,就组装成一个TCP报文段发送出去。
2. 计时器到了,就把当前已有的缓存数据装入报文段,发送出去。
3. 由发送方的应用进程指明要发送的报文段,即TCP支持的push操作。
如何控制TCP发送报文段的时机仍然是一个较为复杂的问题,TCP一般是使用的Nagle算法:
若发送应用进程要把要发数据逐个字节发送到TCP的发送缓存,则TCP发送方就把第一个数据字节发送出去(内核操作), 把后面到达的字节都缓存起来(存在发送缓存中)。当发送方收到对第一个字节确认的报文段后,再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。
Nagle算法还规定,当到达的数据已达到发送窗口大小的一半或报文段最大长度时,就立即发送一个报文段!
糊涂窗口综合症(silly window syndrome)
设想一种情况: TCP接收方的缓存已经满了,而交互式的应用进程一次只从接收缓存中读取1个字节(这样接收缓存空间仅腾出1个字节空间),然后发送确认,并把窗口值大小设为1个字节(但发送的数据报是40字节长)。接着发送方又发来1个字节的数据。接收方发回确认,仍然将窗口设置为1个字节。这样下去,网络的效率很低。
解决办法:
1.接收方: 等到接收缓存已经容纳了一个最长的报文段,或者等到接收缓存已有一半空闲的控制。只要有两种情况之一,接收方就发出确认报文.
2.发送方: 发送方不要发送太小的报文段,而是把数据累计成足够大的报文段,或达到接收方缓存的空间的一半大小,再发送数据。
上述两种方法配合使用,可以最大化提升信道利用率
TCP学习总结(三)的更多相关文章
- TCP/IP的三次握手协议
关于TCP/IP的三次握手协议,这篇文章中有详细的介绍,很通俗易懂,什么时候忘了,都可以过来瞧两眼,保证很快就明白了. 首先TCP/IP协议分为三个阶段:建立连接(握手阶段),数据传输阶段,连接终止阶 ...
- 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记
回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...
- TCP/IP协议三次握手和四次挥手大白话解说
前言 昨天晚上被一位师傅问到了TCP/IP的工作机制,心里很清楚三次握手,然而对于四次挥手却忘了,这是大学习里学过的,奋而翻阅书籍和网络对之前所学的做一个温顾,算是夯实自我吧. TCP(Transmi ...
- TCP 中的三次握手和四次挥手
Table of Contents 前言 数据报头部 三次握手 SYN 攻击 四次挥手 半连接 TIME_WAIT 结语 参考链接 前言 TCP 中的三次握手和四次挥手应该是非常著名的两个问题了,一方 ...
- CCNA-Part5 - 传输层 ,TCP 为什么是三次握手?
传输层 传输层主要的作用就是建立端到端的连接.比如电脑的微信的通信,就需要跨越多个网络设备(交换机和录取)再和微信的服务器建立连接. 传输层需要具有以下的特点: 会话的多复用:如电脑上开启的多个应用, ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- TCP/IP协议三次握手与四次握手流程解析
原文链接地址:http://www.2cto.com/net/201310/251896.html TCP/IP协议三次握手与四次握手流程解析 TCP/IP协议的详细信息参看<TCP/IP协议详 ...
- 从零开始学习jQuery (三) 管理jQuery包装集
本系列文章导航 从零开始学习jQuery (三) 管理jQuery包装集 一.摘要 在使用jQuery选择器获取到jQuery包装集后, 我们需要对其进行操作. 本章首先讲解如何动态的创建元素, 接着 ...
- 前端学习 第三弹: JavaScript语言的特性与发展
前端学习 第三弹: JavaScript语言的特性与发展 javascript的缺点 1.没有命名空间,没有多文件的规范,同名函数相互覆盖 导致js的模块化很差 2.标准库很小 3.null和unde ...
随机推荐
- DAY 17常用模块
一.时间模块:time 1.时间戳:time.time() # 可以作为数据的唯一标识 print(time.time) # 1554878849.8452318 2.延迟线程的运行:time.sle ...
- 小账本APP——软件项目风险管理及解决办法案例
小账本APP——软件项目风险管理及解决办法案例 摘要 软件项目风险是指在软件开发过程中遇到的预算和进度等方面的问题以及这些问题对软件项目的影响.软件项目风险会影响项目计划的实现,如果项目风险变成现实, ...
- Error during generated code invocation: com.intellij.debugger.engine.evaluation.EvaluateException: Method threw 'java.lang.IllegalAccessError' exception.
场景描述: 再从该数据库中读取数据进行处理的时候,需要将某个字段加入到一个动态的map中,然后需要对该map进行filter过滤,在执行过滤方法的时候报错 Error during generated ...
- Confluence 6 从 WIKI 标记整合到基于 XHTML 的存储格式
如果你现在正在将 Confluence 从一个老的版本升级到 Confluence 4.0 或者更新的版本 (例如从 Confluence 3.5.x 或者更老的版本),在升级的过程中一个内容整合过程 ...
- pyhton课堂随笔-基本画图
%matplotlib inline import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np impor ...
- 【转】所有版本chrome、chromedriver、firefox下载链接
所有版本chrome.chromedriver.firefox下载链接 1. 所有版本chrome下载 是不是很难找到老版本的chrome?博主收集了几个下载chrome老版本的网站,其中哪个下载的是 ...
- php 类名和方法名相同(构造函数)
//php 5.6class father{ public function __construct() { echo __METHOD__; }} class son extends father{ ...
- dva.js 上手
来源:https://pengtikui.cn/dva.js-get-started/ ——------------------------------------------------------ ...
- Java正则表达式实现港、澳、台身份证验证
最近由于业务的要求,需要进行港.澳.台人员身份证验证,现在直接上代码,经供参考学习,也为自己积累一些工具类: package com.qiu.validate; public class regexV ...
- vue.js 自带阻止默认事件 阻止冒泡
<!-- 阻止单击事件冒泡 --> <a v-on:click.stop="doThis"></a> <!-- 提交事件不再重载页面 ...