TCP 传输策略

防止黏包现象的出现

当窗口数为 0 时,发送者不能正常发送数据段,除非:
-Urgent数据。比如,用户想杀掉远端机器上的进程的时候,可以发送数据
-发送者可以发送一个字节的数据段,以便让接收者再次发送期待接收的字节号和窗口数(避免死锁)

考虑一个指向某交互式编辑器(远程)的TELNET 连接,该编辑器对用户的每次击键都作出响应,在最坏的情况下:
当用户敲入一个字符的时候,被送到传输实体,创建一个21字节的数据段,在传到网络层,变成了41字节的IP分组
接收方(运行着编辑器的远端机)收到这个信息后,会立发送一个40字节的确认分组 (20字节的 TCP段头和20字节的IP头)

随后,当编辑器读取出这个字节,TCP实体发送一个窗口更新,
这个分组也是40字节
最后,当编辑器处理了这个字符,它发送一个41字节的分组作为该字符的回显
总共累计起来,对于每个敲入的字符,需要至少 162 字节的带宽(还没有考虑到链路层的开销),发送4个数据段。

远程交互telnet的最坏情形图示

怎样优化接收端
接收端可以推迟500ms发送确认分组和窗口更新窗口,以便可以免费搭载在处理后的回显分组内(free ride)

怎样优化发送端
Nagle's algorithm (1984):
- 当数据以一次一字节的速度到达的时候,只发送第一个字节,然后将后续的字节缓存起来,直到发出的字节得到确认
- 将缓存起来的字节在一个数据段中发出,再继续缓存,直到发出的数据得到确认
- Nagle算法在很多TCP上实现,但是有些时候最好禁用,比如:
当一个X-Windows应用在互联网运行的时候,鼠标的移动事件必须发送给远程计算机,把这些移动事件收集起来一批一
批发送出去,使得鼠标的移动极不连贯

Nagle’s 算法图示

傻瓜窗口综合症

另一个使TCP性能退化的问题是傻瓜窗口综合症(silly window
syndrome problem):当有大块数据被传递给发送端TCP实体,
但接收端的交互式应用每次只读取一个字节的时候,问题就来了

每次接收1字节

 Clark解决方案 :阻止接收方发送只有1个字节的窗口更新,相反,它必须等待一段时间,当有了一定数量的空间之后再告诉发送方
 接收方可以可以维护一个内部缓冲,且阻塞上层应用的
READ 请求,直到它有大块的数据提供

Clark解决方案

发送方和接收方

TCP传输的是全双工的字节流。
TCP适配收发双方的数据流量
-Window size
TCP还需要效率
-发方优化: Nagle’s algorithm
-收方优化: Clark’s solution

s6-7 TCP 传输策略的更多相关文章

  1. TCP传输小数据包效率问题(译自MSDN)

    TCP传输小数据包效率问题(译自MSDN) http://www.ftpff.com/blog/?q=node/16 摘要:当使用TCP传输小型数据包时,程序的设计是相当重要的.如果在设计方案中不对T ...

  2. TCP传输工作原理

    引言 在TCP/IP体系结构中,IP协议只管将数据包尽力传送到目的主机,无论数据传输正确与否,它都不做验证,不发确认,也不保证数据包的顺序,因而不具有可靠性.这一问题要由传输层TCP协议来解决,TCP ...

  3. 跨境 TCP 传输优化实录 — 使用 BBR 解决 LFN 问题

    背景 近期开通了一条访问美国机房的 1G 专线,用于提供行情数据备源,并基于 TCP 建立了一套数据传输服务.上线后发现一个严重的问题:应用程序发送队列中的数据大量积压,最终导致程序 OOM Kill ...

  4. Java实验五报告——TCP传输及加解密

    一.实验内容 1.运行教材上TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TCP发送: 注:加密使用AES或者D ...

  5. tcp传输黏包

    tcp传输黏包 tcpip协议使用"流式"(套接字)进行数据的传输,就是说它保证数据的可达以及数据抵达的顺序,但并不保证数据是否在你接收的时候就到达,特别是为了提高效率,充分利用带 ...

  6. Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)

    一.实现功能 1.服务器端选择待发送的文件,可以是多个 2.开启服务器,支持多客户端接入,能够实时显示每个客户端接入状态 3.等待所有客户端都处于已连接状态时,依次发送文件集给每个客户端,显示每个客户 ...

  7. TCP传输连接建立与释放详解

    一直以来有许多读者朋友对TCP的传输连接建立和释放过程不是很理解,而这又是几乎网络认证中必考的知识点,包括软考.CCNA\CCNP.H3CNA\H3CNE等,为此再把笔者年度巨作,广受好评的——< ...

  8. 在qt中用tcp传输xml消息

    在qt中用tcp传输xml消息 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:Qt5 3.1.2 说明: 在tcp上 ...

  9. TCP传输协议使用

    TCP传输协议,也称之为套接字连接,比较安全,三次握手!,必须确保对方计算机存在,才能连接,而且是长时间连接. 缺点是传输速度有点慢. 你用 socket 去连接 ServiceSocaket 服务器 ...

随机推荐

  1. springboot项目创建

    1.在eclipse中创建springboot项目,右键找到New,然后找到Spring Starter Project, 如果menu中找不到Spring Starter Project就选择oth ...

  2. keepliave

    keepalived的主要功能 1. healthcheck:           检查后端节点是否正常工作           如果发现后端节点异常,就将该异常节点从调度规则中删除:        ...

  3. ansible批量自动安装LNMP

  4. CentOS 6.8下网卡配置、桥接模式和NAT连接模式、VMware虚拟机克隆网卡配置

    模式一:桥接模式: 1. 在VMware中安装好虚拟机后,虚拟机网卡设置:选择桥接模式 2. 查看本机的网络信息: 找到ip.子网掩码.网关.DNS等. 找一个没有使用的ip,例如:192.168.1 ...

  5. PhoenixFD插件流体模拟——UI布局【Export】详解

    Liquid Export 流体导出 本文主要讲解Export折叠栏中的内容.原文地址:https://docs.chaosgroup.com/display/PHX3MAX/Liquid+Expor ...

  6. FPGA_VHDL 学习课堂笔记001

    FPGA_VHDL 学习课堂笔记   记录说明:本文档主要记录大学期间,老师FPGA授课课堂笔记. 代码语言:VHDL 编程软件:MAX+plus II FPGA硬件:FLE-843   03月05日 ...

  7. ajax 跳转页面时添加header

    在页面中添加一个form表单隐藏域,表单的一个属性是需要传的token,然后在ajax的回调函数中提交这个表单.要把这个token添加到header中就需要重写一个过滤器filter继承org.spr ...

  8. 如何修复“网络路径”,错误代码0x80070035

    1.以管理员权限 运行 cmd. sc.exe config lanmanworkstation depend= bowser/mrxsmb10/nsi回车sc.exe config mrxsmb20 ...

  9. jq动画设置图片抽奖(修改效果版)

    效果:点击开始,图片转动,按钮显示"停止",点击停止,选出中奖号码,,最后一个数字停止时,按钮变为"again",点击"again"开始转动 ...

  10. Hillstone设备管理-设备软件Stone-OS升级

    1.通过sysloader进行StoneOS升级 1)给设备上电按提示按ESC并且进入 Sysloader.参照以下操作提示: 2)在下面选择对应的选项升级os,可以通过tftp.ftp.usb.系统 ...