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. Linux系统时间, 硬件BIOS时间的校准与同步

    #宿主机系统时间: date #宿主机时间校准方法: yum install -y ntpdate ntpdate -u ntp.api.bz #centos查看设置系统时区:(可能没有) cat / ...

  2. windows下用c++调用caffe做前向

    参考博客: https://blog.csdn.net/muyouhang/article/details/54773265 https://blog.csdn.net/hhh0209/article ...

  3. C语言实验一(1)

    #include<stdio.h>int main(){ int a,b,sum; a=123; b=456; sum=a+b; printf("sum is %d\n" ...

  4. Matlab - 各种函数学习

    一.find函数 (1)find()函数的基本功能是返回向量或者矩阵中不为0的元素的位置索引. X = [1 0 4 -3 0 0 0 8 6]; index = find(X) 返回不为零的位置索引 ...

  5. 点击button会自动刷新页面

    如题 因为button标签按钮会提交表单. 解决方法如下: 1.将<button></button>改为<input type="button"> ...

  6. fetch跨域浏览器请求头待研究

    fetch('https://wwww.baidu.com', {headers: { "Access-Control-Allow-Origin": "*", ...

  7. python修炼第三天

    今天主要讲了文件操作,函数与装饰器,装饰器比较烧脑,需要多做练习,逐步分解来进行理解!    加油! 一 文件操作 操作系统 提供文件的概念可以操作磁盘. 文件的只读模式: 注意如果是windows ...

  8. Property Exercise

    要求一:自定义用户信息数据结构,写入文件,然后读出内容,利用eval重新获取数据结构 3 with open('user.db','w') as write_file:#创建并以写入的方式打开一个文件 ...

  9. Ubuntu18下sudo apt install xxx出现问题

    当执行sudo apt install rpm时失败(apt-get也失败),输出如下报错信息: E: Could not get lock /var/lib/dpkg/lock - open (11 ...

  10. VIPKID 内推---开发工程师

    VIPKID 目前是K12教育领域最大的一家公司,目前已发展到6w名北美外教,服务于中国50w的小朋友,每天数十万节视频课程在线上进行. 有兴趣加入VIPKID的程序员小伙伴,请发简历到 gloryz ...