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

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

拥塞控制

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

首先发送方维持一个叫做拥塞窗口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. 教你如何下载并破解IAR

    最近参加项目要写STM8的工程的,所以用到IAR,所以就自己安装了一次然后写个心得. 因为我用到的是STM8,所以我就下载了STM8的,不过其他过程都一样的. 首先去到IAR SYSTEMS的官网,找 ...

  2. 常用内置函数_eval_exce

    内置函数 abs 绝对值函数 res = abs(-19) print(res) round 四舍五入(n.5时, 奇数进偶数不进) sum 计算序列的和(元素是数字类型) listvar = (1, ...

  3. 关于Unity单个对象多个脚本的Update调用的时序问题

    先说几句废话, 最近在研究Unity, 这玩意用起来比较简单, 而且商店里还有各种插件, 初学者也能轻松拼凑出一个像模像样的游戏(顺便说一句,自己做着玩就无所谓了,但随便拼凑个辣鸡丢出来骗钱就不好了) ...

  4. 浅谈角色换装功能--Unity简单例子实现

    在前置篇中,基本上梳理了一下换装功能背后涉及到的美术工作流.但程序员嘛,功能终归是要落到代码上的.本文中会结合Unity提供的API及之前提到的内容来实现一个简单的换装功能.效果如下: (图1:最终效 ...

  5. DCDC电源 TPS54525

    电路图: 输入电压12V,输出电压5V.不接负载可以获得5V输出,接入负载后只有4mV,且PG为低. 预计原因:可能是上电瞬间电流过大,芯片过流保护. 解决方案:SS软启动引脚的电容C331加大至1u ...

  6. 让WebStrom支持SSH协议的子项目

    让WebStrom支持SSH协议的子项目 在大项目中, 经常会遇到子项目(submodule)使用ssh的情形, 但是WebStrom不直接支持它. 下面以MAC为例,在PC中的处理类似. 打开ter ...

  7. memory_profiler的使用

    作用:memory_profiler是用来分析每行代码的内存使用情况 使用方法一: 1.在函数前添加 @profile 2.运行方式: python -m memory_profiler memory ...

  8. windows计划任务启动bat执行java文件

    系统:win7 环境:需要配置好jdk的环境变量 需求:每次开机,用bat批处理执行将一个位于D:\workspace\console目录底下的console.txt重命名的java文件 拿到需求,我 ...

  9. python shutil模块&random模块

    shutil模块 import shutil shutil.copyfileobj(open("os_.py", "r"), open("os_2.p ...

  10. js生成uuid

    前端不能像java一样有内置的uuid生成包,所以需要自己写一个function,每次调用这个函数都会生成一个不同的字符串,代码如下: getuuid() { var uid = []; var he ...