今日刷题总结15

TCP滑动窗口

假设A向B发送数据,A收到了B的确认报文,报文首部的窗口值为20,确认号ack=31,这表示B已经收到了截止序列号30的所有数据,根据窗口值和确认号,A构造出自己的发送窗口,如下图所示。

A的发送窗口表示在没有收到B的确认下可以联系把窗口内的数据发送出去。对于已经发送出去的数据,在没有接到确认时,必须暂时驻留在发送窗口内以便在超时重传时使用。发送窗口后沿的后面部分是已经发送并得到确认的数据,这些数据不再保留到发送窗口内。发送窗口前沿的前面部分是不允许发送的数据,因为接受方B的接收窗口没有足够的空间保留这些数据。

由上图可知,发送窗口的位置与大小由前后沿共同决定。后沿的变化有2种可能:

(1)变大:接收到新的确认。

(2)不变:没有接收到新的确认。

后沿不可能变小,因为不能撤销已经接收到的确认。

前沿的变化有3种可能:

(1)不变:没有接收到新的确认,或者接收到新的确认但是接收方B的接收窗口变小了,正好导致前沿位置不变。

(2)变大:接收到新的确认并且B的接收窗口不变。

(3)变小:接收到新的确认并且B的接收窗口变小了,正好导致前沿位置变小。但是tcp标准强烈建议不要这样做,因为在接收到这个确认以前A已经发送了这个窗口的很多数据,现在窗口缩小并且不许发送这些数据,会产生一些错误。

假设现在A发送了序列号31~41的11个字节的数据,如下图所示,其中发送窗口内11个黑色方框表示已经发送但未收到确认的数据,由p1、p2指出,即p2-p1=已发送但尚未收到确认的字节数。窗口内其余的方框表示允许发送但未发送的数据,有p2、p3指出,即p3-p2=允许发送但未发送的字节数。发送窗口的大小为p3-p1。

由上图可知,B的接收窗口大小为20,序列号31~50表示可以接收的数据。现在B已经收到了黑色方框表示的32和33号数据,但是这些数据没有按序到达,31号数据可能滞留在网络中或者丢失了,而B只能对按序到达的数据中的最高序列号进行确认,所以B发送的确认报文的确认号仍然是31。

假设B现在收到了按序到达的31~33号数据,把这些数据交付给主机,然后B删除这些数据并把接收窗口向前移动3个序列号,窗口仍为20保持不变,如下图所示。B会发送确认给A,其中确认号为34,窗口值为20,表明B已收到序列号33为止的所有数据。从图中可以看到,B也收到了37、38和40号数据,但是不是按序到达,只能暂存在接收窗口中。A在接收到B的确认后,将发送窗口向前移动3个序列号。

假设A继续发送序列号42~53的数据后p2与p3重合,此时发送窗口内的数据全部发送完毕但还没收到确认,如下图所示。由于A的发送窗口已满,可以继续发送的数据为0,因此必须停止发送。A在经过一段时间(由超时计时器控制)后如果没有收到B的确认就会重传这些数据,并重置超时计时器,直到收到B的确认为止。如果A收到的确认号处于发送窗口之间,A就可以相应地向前移动发送窗口并继续发送数据。

时间: 2024-11-02 00:29:08

今日刷题总结15的相关文章

今日刷题集合

月考没考,最皮的是刷题效率低的可怕,搜索中的那些回溯用的还是很水,不如总结一下. codevs 题号:1501 1506 1842 1983 2549 2806 3143 3145 1008 1294 1295 1501 二叉树的最大宽度和高度(没加using namespace std ;会过不去编译,max.min函数封装在#include<iostream>里,所以没有using namespace std ;不行.) 1 #include<bits/stdc++.h> 2

今日刷题总结14

http协议 (1)URL(universal resource locator,统一资源定位器) URL用于标识因特网上的资源位置并给出访问这些资源的方法.由于访问不同资源对象需要的协议不同,URL指出了访问某个资源对象时需要用到的协议,其一般格式为: <协议>://<主机名>:<端口>/<路径> 最左边的<协议>指出使用什么协议来获取万维网文档.一般最常用的协议是http,而HTTP URL的一般格式如下: http://host["

c++刷题(15/100)矩阵转置,最深子树

题目一:矩阵转置 给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引. 示例 1: 输入:[[1,2,3],[4,5,6],[7,8,9]] 输出:[[1,4,7],[2,5,8],[3,6,9]] 示例 2: 输入:[[1,2,3],[4,5,6]] 输出:[[1,4],[2,5],[3,6]] 思路:比较简单,但要注意对矩阵的初始化,如果不初始化会报错-->reference binding to null pointer of type

今日刷题总结3

稳定排序 (1)冒泡排序:冒泡排序就是把小的元素往前调或者把大的元素往后调.比较是相邻的两个元素比较,交换也发生在这两个元素之间.如果两个元素相等,不用进行交换:所以冒泡排序是一种稳定排序算法. (2)归并排序 :归并排序是把序列递归地分成短序列,递归出口是短序列只有1个元素或者2个序列(1次比较和交换),然后把各个有序的短序列合并成一个有序的长序列,不断合并直到原序列全部排好序.在1个或2个元素时,1个元素不会交换,2个元素如果大小相等也不进行交换.在短的有序序列合并的过程中可以保证如果两个当

今日刷题总结21

C++的内存分配方式 之前有说过C++的内存分为5部分,即栈.堆.全局/静态存储区.自由存储区以及常量存储区. 栈:栈由编译器自动分配与释放,它用来存储函数的参数值以及局部变量. 堆:堆由应用程序分配与释放,应用程序使用malloc在堆上获取内存,使用free释放内存.如果应用程序获取内存后没有释放,就会造成内存泄漏,在应用程序终止时泄漏的内存才会被操作系统回收. 自由存储区:自由存储区是C++中基于new和delete的抽象概念.当应用程序使用new分配内存时,就说该内存是自由存储区.C++编

今日刷题总结9

数据存取路径 数据存取是指数据库数据存贮组织和存贮路径的实现和维护.在计算机中,数据一般以文件形式保存或存放在数据库中.在数据库,数据存取路径分为主存存取路径与辅存存取路径,前者主要用于主键检索,后者用于辅助键检索.在系统中,路径一般分为相对路径和绝对路径. 数据存取路径是指存取数据的位置,由于程序运行具有局部性,不可能把所有数据都调入内存,在内存中只有一部分数据,其余数据都在外存,因此数据存取路径分为辅存存取路径和内存存取路径,不同的路径,查找的方法是不同的,一般分为内存查找和辅存查找. 内存

今日刷题总结7

内联函数 内联函数是由inline关键字修饰.在类内定义的函数默认为内联函数.从源代码的层面上看,内联函数有函数的结构,而在编译后,却不具备函数的性质.内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处,这类似于宏替换,使用函数体替换调用处的函数名.能否形成内联函数,需要看编译器对该函数定义的具体处理. 内联函数的主要作用是用来消除函数调用时的时间开销.它通常用于频繁执行的函数,对于小内存空间的函数非常受益. 使用内联函数的时候要注意: (1)递归函数不能定义为内联函数 (

今日刷题总结17

拥塞控制方法 (1)慢开始和拥塞避免 发送方维持一个拥塞窗口cwnd的状态变量,开始时cwnd的大小为一个最大报文段长度MSS.发送方发送完窗口内所有报文段后,每收到一个新的对已发送报文段的确认,就把cwnd增加至多一个MSS.以下说明了慢开始与拥塞避免的原理,其中cwnd的大小用MSS的个数来衡量. 最初发送方设置cwnd=1,发送第一个报文段M1,收到对M1的确认后,cwnd从1增大为2,然后发送方接着发送cwnd中的M2和M3两个报文段,接收方接收后对M2和M3确认.发送方每接收到一个对已

今日刷题总结19

共享区域与私有区域 每个进程都有自己的私有虚拟地址空间,避免了受到其他进程的错误读写.但是,通常的c程序几乎都使用到标准库函数,例如printf或者scanf,如果每个进程都要为这些常用库函数在物理内存保留一份拷贝,这样对内存就非常浪费了. 为了解决上述问题,可以将常用库函数设定为共享对象,共享对象在物理内存上只有一份拷贝,多个进程可以把自身虚拟内存的一个区域映射到该共享对象上,这些区域就叫共享区域,如果一个进程在自己的共享区域进行写操作,在其他进程的共享区域内能看到相应的改变,并且这种改变也会