TCP的连接

状态变化

各个状态的意义如下:

LISTEN - 侦听来自远方TCP端口的连接请求;

SYN-SENT -在发送连接请求后等待匹配的连接请求;

SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;

ESTABLISHED- 代表一个打开的连接,数据可以传送给用户;

FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;

FIN-WAIT-2 - 从远程TCP等待连接中断请求;

CLOSE-WAIT - 等待从本地用户发来的连接中断请求;

CLOSING -等待远程TCP对连接中断的确认;

LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认;

TIME-WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认;

CLOSED - 没有任何连接状态;

三次握手(wireshark抓包如下)

说明:1.发送方与接收方各自维护自身的seq与ack

2.关于mass指的是包最大发送数据量,决定了要分几个包进行发送。Mass加上TCP头和IP头的长度就能得到MTU。

3.win表示自身还能接受多少字节的数据。

4.发送方根据ack当中期望收到的下一个字节的序号以及窗口,还有已经发送的字节序号,可以算出还可以发送的字节数。

5.FIN携带这个标志的包表示正在请求终止连接。

带宽与速率、滑动窗口之间的关系

滑动窗口:用于接收方通知发送方自己可以接受的数据大小。

拥塞窗口:用于发送方主动控制发送速率。

带宽:单位时间内从发送端到接受端所能通过的最高速率。

设滑动窗口大小为W, 发送端和接收端的带宽为B, RTT为Tr。

TCP发送数据时受滑动窗口的限制,当TCP将滑动窗口中的数据都发出后,在收到第一个ACK之前,滑动窗口大小是0,不能再发送数据了,必须等待ACK包使滑动窗口移动。那么在理想情况下,ACK包应该在什么时候到达呢?显然,就是在数据发出后的RTT时间后,ACK包到达。这也就是说,现在在不考虑丢包和拥塞情况下,TCP在一个RTT时间内能发出的最大数据量为W,所以不考虑带宽限制下,TCP能一个时刻能达到的最大速度是 V = W/Tr

如果假设Tr是一个定值,那么决定TCP速率的唯一因素就是TCP的滑动窗口大小。现在再考虑带宽限制,前面说过当马路上摆满车的时候,就无法再往里放车了,同理,TCP发送端在Tr/2时间内,能往通道上放的数据量为 V*Tr/2,当 V*Tr/2<=B*Tr/2时,单向通道容积不构成瓶颈,速率的限制主要来源于窗口大小限制。而当V*Tr/2>B*Tr/2时,则就受到容积限制,即此时速率限制来源于带宽限制。

把V*Tr/2<=B*Tr/2和V*Tr/2>B*Tr/2两边的Tr/2约掉,再把V = W/Tr代入,则可以得到 :

W <= B*Tr 及 W > B*Tr

B*Tr就是带宽时延乘积,取W为TCP能支持窗口的最大值Wmax,当Wmax <= B*Tr时,此时发送和接收端之间的通道就是所谓的长肥管道,即带宽时延乘积大的通道。在我们平时生活中使用的宽带网络,ADSL等环境下,因为带宽都比较小,从而B*Tr也比较小,再加上网络情况比较复杂,拥塞情况比较常见,所以这些网络环境下,TCP速率的主要限制因素在于带宽,丢包率等。长肥管道一般不太常见,多见于一些单位使用的专线网络,在这些网络中速率的主要限制因素就是窗口大小了,这也是传统TCP在这些网络环境中不能充分利用带宽的原因所在(因为传统TCP的窗口大小是用2字节表示的,所以最大只有65535(不考虑窗口扩大选项)),除了专线网络外,随着网络硬件技术的发展,万兆交换机的出现,局域网中也可能会出现带宽时延乘积较大的情况。

总结,在W<B*Tr时,影响TCP发送数据速率的最直接的因素是滑动窗口的大小,TCP的流量控制策略(比如超时时窗口设置为1,重复ACK时窗口减半)最终都是通过控制窗口大小来控制速率,而慢启动,拥塞避免这些流量控制算法实际上就是控制窗口增长方式的算法,也就是控制的是加速度大小。当W>B*Tr时,则影响速率的因素就是带宽了。

重传的研究

网络之所以能限制发送窗口,是因为它一口气收到太多数据时会发生拥塞。

拥塞窗口的维护:

  1. 连接刚刚建立,发送方对网络情况一无所知,如果一口气发太多数据就可能遭遇拥塞,所以发送方把拥塞窗口的初始值定的很小。
  2. 慢启动。
  3. 拥塞避免。

发生超时重传之后:

快速重传:当发送方得到三个或以上重复确认时,就意识到相应的包已经丢,立即重传。之所以限定三个或者以上可以在很大程度上避免因乱序而触发快速重传。

说明:

  1. 没有发生拥塞时,发送窗口越大,性能越好。所以在没有带宽限制的情况下,应该尽量增大接受窗口。
  2. 如果经常发生拥塞,那限制发送窗口反而能提高性能。因为即便是万分之一的重传对性能的影响都很大。
  3. 超时重传对性能影响最大,因为它有一段时间(RTO)没有数据传输,而且拥塞窗口会设置成1mss
  4. 快速重传对性能影响小一些,因为它没有等待时间,而且拥塞窗口减少的没有那么大。
  5. SACK和NewReno有利于提高重传效率,提高传输性能。
  6. 丢包对极小的文件影响比大文件要大。

TCPIP学习笔记的更多相关文章

  1. 转载 TCPIP学习笔记之概述

    1.分层 网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能.一个协议族,比如 T C P / I P,是一组不同层次上的多个协议的组合. T C P / I P通常被认为是一个四层协议系统 ...

  2. TCP-IP详解学习笔记2

    TCP-IP详解学习笔记2 链路层 链路层的目的是为IP模块发送和接收IP数据报: TCP/IP支持多种不同的链路层,依赖于使用网络硬件类型:有线局域网(以太网,城域网(MAN),有线语音网络).无线 ...

  3. TCP-IP详解学习笔记1

    TCP-IP详解学习笔记1 网关可以在互不相关的网络之间提供翻译功能: 体系结构: 协议和物理实现,实际上是一组设计决策. TCP/IP协议族允许计算机,智能手机,嵌入式设备之间通信: TCP/IP是 ...

  4. LwIP学习笔记——STM32 ENC28J60移植与入门

    0.前言     去年(2013年)的整理了LwIP相关代码,并在STM32上"裸奔"成功.一直没有时间深入整理,在这里借博文整理总结.LwIP的移植过程细节很多,博文也不可能一一 ...

  5. Sybase:SAP IQ学习笔记

    Sybase:SAP IQ学习笔记 -- 启动IQ管理 >> start_iq -n utility_db -n utility_db >> dbisql -c "u ...

  6. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  7. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  8. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  9. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

随机推荐

  1. web.xml 设置字符编码

    个人理解  就是为了防止在前端输入的数据到了后台发生乱码 直接复制到web.xml里面就可以使用 亲测 能用!!! <!-- 前端过滤器设置字符编码 --> <filter> ...

  2. linux批量配置ip

    获取使用的网卡接口 ip a 2.查看系统版本 cat /etc/redhat-release 3.执行配置脚本 wget  http://d.sshby.com/biaozhun.tar&& ...

  3. [Maven - Java Version] 如何设置Maven的Java版本或者使用不同的JDK版本编译

    In pom.xml, defined this maven.compiler.source properties to tell Maven to use Java 8 to compile the ...

  4. vue刷新路由,不刷新页面

    1.路由介绍 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来 ...

  5. js中Array数组基本方法

    总结:push() 添加元素到数组未尾, 返回数组长度 unshift() 添加元素到数组头部, 返回数组长度 pop() 删除数组未尾元素, 返回删除元素 shift() 删除数组头部元素, 返回删 ...

  6. 备忘:移植ucos-III到stm32f103c8t6

    由于本人对linux系统内核这块比较感兴趣,下一份工作想做linux驱动相关的:于是最近一旦有空都在研究linux内核源码,面对linux内核这个庞然大物,越看越觉得不能太过急躁,且由于还要工作,只能 ...

  7. oracleDBconsole服务启动失败

    问题出现的故障:    在一次正常使用企业管理器后,重新启动计算机,再次启动OracleDBConsoleORCL服务时,报:Windows 不能在 本地计算机 启动 OracleDBConsoleo ...

  8. idea怎么创建properties文件

    我们在idea当中新建一个properties时,就要新建一个ResourceBundle类型的文件 

  9. ArrayList与LinkList

    1.ArrayList 1)继承结构 2)ArrayList是数组存储结果,初始容量为0,添加第一个元素后容器为10,后面每次超过容量时,容量递增50%,每次扩容都需要产生新的数组,再把老的数据复制过 ...

  10. mysql中用limit 进行分页有两种方式

    代码示例:语句1: select * from student limit 9,4 语句2: slect * from student limit 4 offset 9 // 语句1和2均返回表stu ...