TCP/UDP的学习总结(三)

xiaoxlm 2018-08-10 原文

TCP/UDP的学习总结(三)

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.发送方: 发送方不要发送太小的报文段,而是把数据累计成足够大的报文段,或达到接收方缓存的空间的一半大小,再发送数据。

上述两种方法配合使用,可以最大化提升信道利用率

发表于 2018-08-10 14:17 xiaoxlm 阅读() 评论() 编辑 收藏

 

版权声明:本文为xiaoxlm原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xiaoxlm/p/9454721.html

TCP/UDP的学习总结(三)的更多相关文章

  1. 使用PHP导出数据到CSV文件

    使用PHP导出数据到CSV文件 CSV,是Comma Separated Value(逗号分隔值)的英文缩写, […]...

  2. 构建PHP容器

    文档说明:只记录关键地方;PHP 有两种运行模式 php-fpm 和 php-cli构建脚本 php-cli-alpine#!/bin/shset -ux TIME=`date -u '+%Y%m%dT%H%M%SZ'`VER...

  3. PHP MySQL 快速导入10万条数据

    项目背景 数据来源:所有数据均为外部导入,最大数据量在10w+ 输出数据:导出经过业务处理之后的数据 使用框架 […]...

  4. 聊一聊PHP的global

    众所周知,在PHP的函数中,如果想使用全局变量,一种是使用超全局变量$GLOBALS,另一种是在函数中使用gl […]...

  5. 全局负载均衡与CDN内容分发

    高并发时,一些静态资源(例如商品详情页)最好分配在用户较近的边缘服务器上,节省宽带资源,本文主要梳理了全网负载 […]...

  6. php 安装 grpc 扩展

    升级gcc默认gcc的版本为4.8.5,grpc扩展需要支持c++14查询对照的话gcc6.1就可以完全至此c++14 (转载至)如图:踩过的坑,重新安装升级了gcc 6.5.0的版本,安装grpc还是提示如下: 可能是安装升级的方...

  7. 零基础学PHP需注意的细节问题(Continuous updating)

    话不多说,此篇博客,将持续记录易疏忽掉的注意事项,包括期间遇到的一些知识点性的问题。 Continuous u […]...

  8. 面试锦囊 | HTTP 面试门路

    本文将通过几个问题,以面试官提问的方式出发,思考问题,锻炼思维的深度和广度,你想要的有可能就在这里! 前言 本 […]...

随机推荐

  1. VS2005补丁SP1安装

    以下内容引用自:http://blog.csdn.net/bobo307135136/archive/2008 […]...

  2. 图像处理和OpenCV初步

    图像从数学和计算机的角度理解就是一个矩阵,矩阵中的每一个元素叫做像素,又由于图像有灰度图像和彩色图像之分,所以 […]...

  3. IE8浏览器官方下载 包含Windows中繁英文各个版本

    当你的Windows XP安裝IE8时提示“此安装不支持您的操作系统的当前语言”,或者安装IE8,在语言包安装 […]...

  4. 小米路由试用心得3——关于数据备份及客户端软件

    小米路由器使用了有几天了,今天总结一下数据备份及客户端软件的使用心得。 手机客户端软件:分别在小米手机和iph […]...

  5. 电脑插入耳机没声音 – 提着裤衩追

    如果人碰到电脑耳机没有声音我们可以看看任务栏里的小喇叭是不是有一把X了,这样是一静声音了,或者是你后面板没接好 […]...

  6. eclipse 执行main方法 错误: 找不到或无法加载主类

    检查环境变量是否正确 JAVA_HOME JAVA的实际安装目录 CLASSPATH .;%JAVA_HOME […]...

  7. 计算机网络杂七杂八

    子网掩码与子网划分: 子网掩码:https://baike.baidu.com/item/%E5%AD%90% […]...

  8. 由门禁系统引起的升级改造

    一、前言   前阵子,公司大门口的指纹识别终端机器开始闹情绪了,经常出现识别不了,指纹识别速度有时快,有时慢, […]...

展开目录

目录导航