文章目录
- C/C++笔试练习
- 选择部分
- (1)TCP
- (2)IP广播
- (3)ARP协议
- (4)IP路由器
- (5)MAC协议
- (6)三次握手
- (7)TCP/IP
- (8)TCP
- (9)TCP/IP
- (10)子网划分
- 编程题 day35
- 年会抽奖
- 抄送列表
C/C++笔试练习
选择部分
(1)TCP
主机甲和乙已建立了TCP连接,甲始终以MSS=1KB大小的段发送数据,并一直有数据发送;乙每收到一个数据段都会发出一个接收窗口为10KB的确认段。若甲在t时刻发生超时时拥塞窗口为8KB,则从t时刻起,不再发生超时的情况下,经过10个RTT后,甲的发送窗口是()
A.10KB
B. 12KB
C.14KB
D.15KB
答案:A
1.把慢开始的门限值设为当前窗口的一半,即ssthresh=1/2*8KB=4KB
2.把拥塞窗口cwnd设置为1个最大报文段MSS大小
3.再次从慢启动阶段开始。发生拥塞后
开始慢启动 cwnd=1KB,之后呈指数增长。
经过1个RTT cwnd=2^1=2KB
经过2个RTT cwnd=2^2=4KB,此时到达门限值ssthresh,之后 进入拥塞避免 阶段经过3个RTT cwnd=4+1=5KB,由于题目说之后一直都没有发生超时,cwnd会一直线性增长到接收窗口大小
经过8个RTT cwnd=10KB,因为发送端不能超过接收端10,此后拥塞窗口一直保持cwnd=10KB.
发送窗口大小=min(接收窗口,拥塞窗口)=10KB。
(2)IP广播
某主机的IP地址为180.80.77.55,子网掩码为 255.255.252.0。若该主机向其所在子网发送广播分组,则目的地址可以是()
A.180.80.76.0
B. 180.80.76.255
C.180.80.77.255
D.180.80.79.255
答案:D
180.80.77.55
77 :0100 1101
1.子网掩码255.255.252.0 (即11111111.11111111.11111100.00000000)网络号为连续的1,主机号为连续的0,也就是10位。
2.然后题目要发送广播分组,所以求的是广播地址,广播地址的主机位也是全为1, 所以主机2180.80.77.55所在的广播地址就是180.80.010011(11.11111111),括号里面的是主机号,主机号全为1就是广播地址,即180.80.79.255。
(3)ARP协议
ARP协议的功能是()
A.根据IP地址查询MAC地址
B.根据MAC地址查询IP地址
C.根据域名查询IP地址
D.根据IP地址查询域名
答案:A
当一台设备知道对方的IP地址,不知道对方的MAC 地址时,启动ARP,发送ARP Request请求广播包到其他主机,收到广播包的主机查看,只有该请求的设备才会单播回答ARP Reply响应包。
所以ARP协议本质上是用ip地址查询MAC地址的协议。
(4)IP路由器
下列关于IP路由器功能的描述中,正确的是()
Ⅰ.运行路由协议,设置路由表
Ⅱ.监测到拥塞时,合理丢弃IP分组
Ⅲ.对收到的IP分组头进行差错校验,确保传输的IP分组不丢失
Ⅳ、根据收到的IP分组的目的IP地址,将其转发到合适的输出线路上
A.仅Ⅲ、 Ⅳ
B.仅Ⅰ、Ⅱ、 Ⅲ
C.仅Ⅰ、Ⅱ、Ⅳ
D.Ⅰ、 Ⅱ、Ⅲ、Ⅳ
答案:C
IP层为什么不对数据部分进行差错校验?
因为网络层是“尽最大努力完整的传输数据包”,差错检测已由数据链路层实现,IP层没必要再进行一次校验。
优点就是,因为不负责差错检测和纠错,所以可获得较高的传输性能。
缺点就是,因为IP层不负责差错检测,那么错误检测只能在传输层或应用层被发现,使纠正错误的时间增加了。
(5)MAC协议
以太网的MAC协议提供的是()
A.无连接不可靠服务
B.无连接可靠服务
C.有连接不可靠服务
D.有连接可靠服务
答案:A
1.ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。
2.ICMP协议的底层协议使用IP协议
(6)三次握手
主机甲向主机乙发送一个(SYN=1,seq=11220)的TCP 段,期望与主机乙建立TCP连接,若主机乙接受该连接请求,则主机乙向主机甲发送的正确的TCP段可能是()
A.(SYN=0,ACK=0,seq=11221,ack=11221)
B.(SYN=1,ACK=1,seq=11220,ack=11220)
C.(SYN=1,ACK=1,seq=11221,ack=11221)
D.(SYN=0,ACK=0,seq=11220,ack=11220)
答案:C
1.主机乙给主机甲应该回复 SYN+ACK数据包,排除A,D。
2.由于主机甲在SYN数据报当中的序号为(seq=11220),所以主机乙给主机甲回复的确认序号是ack=11221,排除B。
3.主机乙发送的SYN+ACK数据包的序号seq可以从任意位置开始,所以,C是正确选项。
(7)TCP/IP
TCP/IP参考模型的网络层提供的是()
A.无连接不可靠的数据报服务
B.无连接可靠的数据报服务
C.有连接不可靠的虚电路服务
D.有连接可靠的虚电路服务
答案:A
(8)TCP
主机甲和主机乙之间建立一个TCP连接,TCP最大段长度为1000字节,若主机甲的当前拥塞窗口为4000字节,在主机甲向主机乙连续发送两个最大段后,成功收到主机乙发送的第一个段的确认段,确认段中通告的接收窗口大小为2000字节,则此时主机甲还可以向主机乙发送的最大字节数是()
A.1000
B. 2000
C.3000
D.4000
答案:A
网络层提供无连接不可靠的数据报服务,例如协议。
(9)TCP/IP
在TCP/IP体系结构中,直接为ICMP提供服务的协议是()
A.PPP
B. IP
C.UDP
D.TCP
答案:B
1.发送方的发送窗口的上限值取接收方窗口和拥塞窗口中的最小值,即min(4000,2000)=2000B,由于还未收到第二个最大段的确认,所以此时主机甲还可以向主机乙发送的最大字节数为2000-1000=1000B。
(10)子网划分
某网络的IP地址空间为192.168.5.0/24,采用定长子网划分,子网掩码为255.255.255.248,则该网络的最大子网个数、每个子网内的最大可分配地址个数()
A.32,8
B. 32,6
C.8,32
D.8,30
答案:B
一个IP的组成部分为:网络号+子网号+主机号:
对于这样的IP 192.168.5.0/24 由/24可以知道其子网掩码默认为255.255.255.0
按照子网掩码255.255.255.248进行划分
二进制位: (11111111.11111111.11111111)(24表示网络号).11111(子网掩码)000,子网掩码中全1表示的网络号和子网号部分,0部分表示主机号部分。
(11111)2二进制转换为十进制为2^5 =32 所以可以划分为32个子网,而后面有3个0,所以000-111表示的范围2^3-2(全0和全1不可用)=6。
编程题 day35
年会抽奖
年会抽奖
解题思路:错排的递推公式是:D(n) = (n - 1) [D(n - 2) + D(n - 1)],也就是n - 1倍的前两项和。公式推导可以参考百度百科。通过这个递推公式可以得到在总数为n的时候,错排的可能性一共有多少种。那么要求错排的概率,我们还需要另一个数值,就是当总数为n的时候,所有的排列组合一共有多少种,那么根据排列组合,肯定是使用Ann的公式来求,也就是n的阶乘。所以结果很简单,就是用公式求出第n项的错排种类,和n的阶乘,然后两者一除,就是概率了。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
vector<double> arr(n);
arr[0] = 0, arr[1] = 1;
for (int i = 2; i < n; i++)
{
arr[i] = i * (arr[i - 1] + arr[i - 2]);
}
double base = 1;
for (int i = 1; i <= n; i++)
base *= i;
printf("%.2lf%%\n", arr[n - 1] / base * 100);
}
return 0;
}
抄送列表
抄送列表
解题思路:1. 通过getiine(cin, names)方法获取第一行中的所有名字 2. 解析出第一行中的所有名字保存在unordered_set中 3. 获取第二行中的名字,检测该名字是否存在,并按照题目的要求进行输出。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s, res;
while (getline(cin, s))
{
getline(cin, res);
bool sta = false;
for (int i = 0; i < s.length(); i++)
{
string t;
if (s[i] == '"')
{
i++;
while (i<s.length()&&s[i] != '"')
{
t += s[i];
i++;
}
if (t == res)
{
sta = true;
break;
}
}
else if (s[i] != ',')
{
while (i<s.length()&&s[i] != ',')
{
t += s[i];
i++;
}
if (t == res)
{
sta = true;
break;
}
}
}
if (sta == true)
cout << "Ignore" << endl;
else
cout << "Important!" << endl;
}
return 0;
}