利用滑动窗口实现流量控制(让发送方的发送速率不要太快,让接收方来得及接收)

(发送窗口的发送窗口不能超过接收方给出的接收窗口的数值)

拥塞控制

拥塞:在某段时间,对网络中某一资源的需求超过了该资源所能提供的可用部分

首先发送方维持一个叫做拥塞窗口cwnd的状态变量,拥塞窗口的大小取决于网络的拥塞程度,并且动态的变化,发送方让自的发送窗口等于拥塞窗口。如果考虑到接收方的接受能力,那么发送窗口还可能小于拥塞窗口。

发送方控制拥塞窗口的原则:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去,制药网络出现拥塞,拥塞窗口就减小一些,以减小注入到网络中的分组数。

几种解决拥塞控制的方法:慢开始,拥塞避免,快重传,快恢复

慢开始:

当主机开始发送数据时,如果立即把大量数据字节注入到网络中,可能引起网络的负荷情况,经验证明,较好的方式是先探测一下,由小到大逐渐增大发送窗口

举一个例子:

在一开始,发送方先设置cwnd=1,发送第一个报文段M1,接收方收到后确认M1。发送方收到对M1的确认后,把cwnd从1增大到2,于是发送方接着发送M2和M3两个报文段,接收方接收到后发回对M2和M3的确认。此时cwnd从2变化到4,然后发送M4到M7,以后每次都是呈倍数增长。

拥塞避免算法:

让拥塞窗口cwnd缓慢增大,每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,拥塞窗口cwnd是按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率慢很多。

快重传:

要求接收方每收到一个失序报文立即发送重复确认。以图为例:

解释:

1.当发送方发送M3给接收方,在传送过程中发生丢包,

2.发送方维持的拥塞窗口中的数据包还在传送,而每一次传送到接收方,接收方都发送一个重复确认M2给发送方

3.只要发送方接收到3个重复确认时,不用等到M3设置的超时重传计时器到期,就自动重传M3

快恢复:

1.当发送方连续接收到3个重复确认时,就执行“乘法减小”算法,把慢开始门限减小,为了预防网络发生拥塞,但接下去不执行慢开始算法

2.由于发送方现在认为网络很可能没有发生拥塞(如果网络发生了严重的拥塞,就不会一连有好几个报文段连续到达接收方,也就不会导致接收方连续发送重复确认),故与慢开始不同之处在于现在不执行满开始算法,而是把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法,使拥塞窗口缓慢的线性增大

首先tcp的运输连接有3个阶段:连接建立,数据传送,连接释放

三次握手:

主要用于tcp的连接建立阶段,引用《计算机网络第6版》中的图加以说明:

首先,发起请求的一方成为客户端,故上图客户端是A,被动等待连接的一方是服务器端,故为B

分析三次握手过程:

  • A首先向B发起请求,此时的SYN(同步,在连接建立时用来同步序号)。当SYN=1,而ACK=0,这是一个连接请求报文段,此时A设置一个随机序列号,向B发起请求
  • B收到请求后,向A回复一个SYN=1,ACK=1(确认号为1),表示这是一个同意建立连接的报文段。此时ack必须为seq+1,同时也为自己设置一个seq=y,
  • A收到B的确认后,向B发送一个ACK=1,并且将ack设置为y+1,seq(字节编号),Tcp的标准规定,ACK报文可以携带数据,但是如果不携带数据则不消耗序号。

为何A还要发送一次确认,主要是为了防止已经失效的链接请求报文段突然又传到了B,因而产生错误

TCP的连接释放:(4次握手)

  • A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接,A把连接释放报文段首部的终止控制位FIN置为1(FIN字段用来释放一个连接),其序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1
  • b收到连接后,发出ACK=1,并ack=u+1,且设置自己的seq=v,此时的tcp处于半关闭状态,a收到确认后,进入等待状态,等待b发出的连接释放报文段
  • 若b没有要向a发送的数据,其应用进程就通知TCP释放连接,这是b发出的连接释放报文段必须使FIN=1,并设置自己的seq=w,且b必须重复上次已发送过的确认号ack=u+1,并且设置ACK=1
  • a收到b的连接释放报文段后,必须对此发出确认,在确认报文中把ACK置为1,确认号ack=w+1,而自己的序号是seq=u+1

为何A在time-wait状态必须等待2MSL的时间呢?

1,确保a发送的最后一个ack报文段能够到达b

2,防止之前提到的“已失效的连接请求报文段”出现在本连接中

Tcp协议细节(三次握手,四次握手)的更多相关文章

  1. python摸爬滚打之----tcp协议的三次握手四次挥手

    TCP协议的三次握手, 四次挥手 三次握手过程 1, 服务器时刻准备接受客户端进程的连接请求, 此时服务器就进入了LISTEN(监听)状态; 2, 客户端进程然后向服务器发出连接请求报文, 之后客户端 ...

  2. TCP协议中三次握手

    TCP/IP是互联网相关的各类协议族的总称 TCP/IP协议族分为:应用层,传输层,网络层,数据链路层 应用层:向用户提供应用服务时的通讯的活动 传输层:提供处于网络连接中的两台计算机之间的数据传输 ...

  3. 三报文握手 四报文握手 TCP运输连接管理

    三报文握手 四报文握手  TCP运输连接管理

  4. 计算机网络-TCP之三次握手/四次握手

    .概念 .特点 .背景知识补充 .三次握手 .四次握手 .其他补充 1.概念 TCP(Transmission Control Protocol,传输控制协议)是 在不可靠的IP层之上实现的可靠的数据 ...

  5. TCP协议的三次握手和四次挥手过程

    TCP是一种面向连接(连接导向)的.可靠的基于字节流的传输层通信协议.TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认.对失序的数据重新排序.丢弃重复数据. 1.TCP/ ...

  6. TCP协议的三次握手和四次挥手

    暂时需要的信息有: ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1 SYN(SYNchronization) : 在连接建立时用来同步序号.当SYN= ...

  7. 网络编程——TCP协议的三次握手和四次挥手

    三次握手原理解析 TCP握手协议在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND ...

  8. TCP协议的三次握手和四次分手

    HTTP连接 HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用. ...

  9. 通俗大白话来理解TCP协议的三次握手和四次断开

    from : https://blog.csdn.net/Neo233/article/details/72866230?locationNum=15&fps=1%20HTTP%E6%8F%A ...

  10. 通俗大白话来理解TCP协议的三次握手和四次分手

    通俗理解: 但是为什么一定要进行三次握手来保证连接是双工的呢,一次不行么?两次不行么?我们举一个现实生活中两个人进行语言沟通的例子来模拟三次握手. 引用网上的一些通俗易懂的例子,虽然不太正确,后面会指 ...

随机推荐

  1. C# 6.0:在catch和finally中使用await

    Asyn方法是一个现在很常用的方法,当使用async和await时,你或许曾有这样的经历,就是你想要在catch块或finally块中使用它们,比如当出现一个exception而你希望将日志记在文件或 ...

  2. C++类的组合例子

    Line类调用Point类的两个对象p1,p2作为其数据成员,计算线段长度 组合类构造函数定义的一般形式为: 类名::类名(形参表):内嵌对象1(形参表),内嵌对象2(形参表)... {类的初始化} ...

  3. iview 3.x InputNumber数字框bug

    iview 3.X 版本中InputNumber 数字框组件存在bug,把最小值设置为0.2时,数组框禁止点击,其他数字都是正常.

  4. mybatis关于ORM的使用以及设计(三)[参数对象转换为SQL语言]

    上节分析了Mapper对象的创建. 在ORM的定义中可以理解为Object->SQLMapper抽象层(这一层并不负责具体的SQL执行.这一层可以理解为SQL代理层) 本节分析以下内容: ①Sq ...

  5. java集合树状结构及源码

    java集合树状结构及源码 最近一直想看一下java集合的源码,毕竟平时用的比较多,但总是感觉是跟着习惯new出来一个对象,比如ArrayList,HashMap等等,所以就简单的看了一下,了解了一下 ...

  6. Angular CLI: 全局脚本

    全局脚本 有的时候,我们需要加载全局脚本,例如 jQuery 脚本库,第三方的控件库等等.比如 jQuery 可以直接加载到 window 对象上,这就需要我们使用 Angular 中的全局脚本来处理 ...

  7. Tomcat的startup.bat启动后显示乱码

    打开tomcat文件夹到conf目录下 修改logging.properties 找到 java.util.logging.ConsoleHandler.encoding = utf-8这行 更改为 ...

  8. postgresql 创建gin索引

    1.创建gin类型的索引 postgresql 创建gin索引遇到的问题:1.ERROR: operator class "gin_trgm_ops" does not exist ...

  9. scrapy爬去京东书籍信息

    # -*- coding: utf-8 -*- import scrapy import urllib import json from copy import deepcopy class JdSp ...

  10. tail -f 命令暂停方法

    Linux 下查看日志时,使用 tail -f 可以不断的刷新日志信息. 例如: tail -f logs.log 此时要想暂停刷新,使用ctrl+s暂停终端.若想继续终端,使用ctrl+q. 若想退 ...