自我介绍
。。。。。。。。。。。。。。。。。。
项目
TCP和UDP的区别
- TCP是面向连接的,UDP是无连接的
- TCP是可靠传输,UDP是非可靠传输
TCP连接传送的数据,无差错,不丢失,按序到达;UDP尽最大努力交付,不保证可靠交付 - TCP传输速度慢,UDP传输速度快
- TCP连接只能是一对一的;UDP支持一对一,一对多和多对多的交互通信
- TCP面向字节流,UDP面向报文
TCP把数据看成是一连串无结构的字节流,可能会出现粘包问题
TCP的可靠机制
连接机制
三次握手,四次挥手
确认应答机制
TCP的协议报头中有两个字段,序列号和确认序列号。这两个字段就是来保证确认应答机制的。
- 保证确认应答机制
- 保证数据按序到达
- 保证去重机制
超时重传机制
当主机A向主机B发送数据后,一段时间内A没有收到B的确认信号,就会进行重传。原因为:
- 数据在传输过程中丢失
- ACK确认信号在传输过程中丢失
时间设定
时间太长,影响重传的效率;时间太短,当ACK包延迟,会重传大量的数据包。
TCP协议动态计算超时重传的时间。
流量控制机制
TCP通过接收端的接收能力来控制发送端的发送速度,就叫做流量控制。窗口越大,网络的吞吐量越高
如果发送端发送数据的速度过快,导致接收端的接受缓冲区被占满了。此时,发送端在发送数据时, 接收端就不能接收,从而造成丢包,然后发送端会再次重传,造成资源等浪费问题。
拥塞控制机制
TCP的拥塞控制
拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载.
- 慢开始
- 拥塞避免
- 快重传
- 快恢复
慢开始
开始发送数据时,由小到大逐渐增大拥塞窗口的数值;每经过一个传输轮次(RTT),拥塞窗口cwnd就加倍。
为了防止cwnd增长过大引起网络拥塞,还需设置一个慢开始门限ssthresh状态变量。
拥塞避免
使拥塞窗口缓慢增长,每经过一个**往返传输时间(RTT)**就把发送方的拥塞窗口cwnd加1
快重传
快速重传要求接收方在收到一个失序的报文段后就立即发出重复确认,不要等到自己发送数据时捎带确认
快重传算法规定:
发送方只要一连收到3个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计数器时间到期
快恢复
当发送方连续收到三个重复确认,就执行“乘法减小”算法,把慢开始门限ssthresh减半。这是为了预防网络发生拥塞。请注意:接下去不执行慢开始算法。(超时才重新执行慢开始算法)
由于发送方现在认为网络很可能没有发生拥塞,把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。
死锁的条件
- 互斥
- 请求保持
- 循环等待
- 不可剥夺
多继承
多继承是指一个子类继承多个父类
class 派生类名: 访问控制符 基类名1,访问控制符 基类名2
{
数据成员和成员函数声明;
}
多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序
优点:
减少代码量,提高代码的复用性
缺点:
出现二义性,代码耦合度高
代码
对于有序数组 a[ ] = [2, 3, 3, 3, 5, 5, 8, 8, 10 ];
删除重复个数大于k = 2 的数字,将符合条件的数字前移如下所示:a[] = [2, 5, 5, 10, X, X, X];
返回值为数组中数字的个数
#include <iostream>
using namespace std;
int fun(int *a, int n, int k)
{
int p = 0;
int q = 0;
int count = 1;
while (p < n - 1)
{
if (a[p] < a[p+1])
{
if (count > k)
count = 1;
else
{
while (count)
{
a[q++] = a[p];
--count;
}
count = 1;
}
}
else if (a[p] == a[p + 1])
{
count++;
}
p++;
}
if (count <= k)
{
while (count)
{
a[q++] = a[p];
--count;
}
}
return q;
}
int main()
{
int n,k;
cin >> n>>k;
int a[50];
for (int i = 0; i < n; ++i)
{
cin >> a[i];
}
int res = fun(a, n, k);
cout << res << endl;
return 0;
}