一、选择题
1、上网的时候,访问某个网页却突然出现了某个运营商的网页(如联通、电信)。出现此问题可能的原因是?( )
A DNS劫持
B DDoS攻击
C MAC地址欺骗
D 伪造DHCP服务器
他的回答: C (错误)
正确答案: A
解题分析
1DNS劫持又称域名劫持,是指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范
围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应,其效果就是对特定的网络
不能反应或访问的是假网址。
2.DDoS攻击:分布式拒绝服务(DDoS:Distributed Denial ofService)攻击指借助于客户/服务器技术,
将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务
攻击的威力
3.MAC地址欺骗:利用mac欺骗阴止局域网内任意电脑使用网络
4.伪造DHCP服务器:本质上是DHCP欺骗攻击,将真的DHCP服务器的资源ip资源耗尽,然后部署假
的DHCP服务器,让主机向假的DHCP服务器请求
2、TCP建立连接的三次握手中,第二次握手发送的包会包含的标记,最正确的描述是?
A ACK
B SYN,ACK
C SYN,PSH
D SYN
他的回答: B (正确)
正确答案: B
3、当使用TCP协议编程时,下列问题哪个是必须由程序员考虑和处理的?
A 乱序数据包的重传
B 数据传输过程中的纠错
C 网络拥塞处理
D 发送数据的格式和应用层协议
他的回答: D (正确)
正确答案: D
解题分析
1TCP本身是可靠传输的协议,支持重传,纠错,网络拥塞处理等等
2.TCP本身是面向字节流的协议,对于发送的有效载荷的格式并不是很关心,由应用层协议来处理发送
数据的格式,应用层协议由程序猿来考虑和处理(tcp粘包的问题也是如此)
4、现在有很多网站都开始选择HTTPS作为默认的协议,HTTPS的用途是()
A 可以加速页面的加载,提高响应速度
B 可以让服务器端主动推送消息到客户端
C 可以确保传输数据的安全性和防篡改
D 为了提高浏览器兼容性
他的回答: C (正确)
正确答案: C
解题分析
1.HTTPS在HTTP的基础下加入SSL,HTTPS的安全基础是SS,因此加密的详细内容就需要SSL。
2.对使用HTTP传输的数据使用SSL进行加密传输,第三者即使从网络当中获取数据包内容,也会由干没有加密的密钥而导致无法解析传输的内容,从而达到加密的效果。
5、TCP断开连接的四次挥手中,第四次挥手发送的包会包含的标记,最正确的描述是?()
A FIN
B FIN,PSH
C ACK
D FIN,ACK
他的回答: C (正确)
正确答案: C
6、某浏览器发出的HTTP 请求报文如下:
下列叙述中,错误的是()。
A 该浏览器请求浏览 index.html
B Index.html 存放在 www.test.edu.cn 上
C 该浏览器请求使用持续连接
D 该浏览器曾经浏览过 www.test.edu.cn
他的回答: C (正确)
正确答案: C
host表示访问的ip地址
Connection:表示为短链接,不论request还是response的header中包含了值为close的connection,都表明当前正在使用的tcp链接在请求处理完毕后会被断掉。
Cookie:是浏览器保存的小型文件,Cookie是由服务器端生成,通过应答返回给浏览器,浏览器会将 Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器。
7、主机甲和主机乙新建一个TCP 连接,甲的拥塞控制初始阈值为 32KB,甲向乙始终以 MSS=1KB 大小的段发送数据,并一直有数据发送;乙为该连接分配 16KB 接收
缓存,并对每个数据段进行确认, 忽略段传输延迟。若乙收到的数据全部存入缓存,不被取走,则甲从连接建立成功时刻起,未发送超时 的情况下,经过 4 个 RTT
后,甲的发送窗口是()。
A 1KB
B 8KB
C 16KB
D 32KB
他的回答: C (错误)
正确答案: A
1.当前甲的4次发送数据,我们需要站在慢开始的角度来考虑,拥塞窗口的大小成指数增长,后一次是前一次的2倍。
2.甲方发送的数据大小取决干接受窗口和拥塞窗口的较小值。
3.1MSS是1KB当经过4个RTT(报文往返时间)之后,接收窗口的值变为16-1-2-4-8=1
所以此时,发送窗口的值为1。
8、通过POP3 协议接收邮件时,使用的传输层服务类型是()。
A 无连接不可靠的数据传输服务
B 无连接可靠的数据传输服务
C 有连接不可靠的数据传输服务
D 有链接可靠的数据传输服务
他的回答: A (错误)
正确答案: D
解题分析
1.POP3即邮件协议版本3,是TCP/IP协议族中的一员。
2.该协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S。
3.属于应用层协议,传输层协议使用TCP协议 。
9、下列关于UDP协议的叙述中,正确的是 ()
Ⅰ 提供无连接服务
Ⅱ 提供复用/分用服务
Ⅲ 通过差错校验,保障可靠数据传输
A 仅Ⅰ
B 仅Ⅰ、Ⅱ
C 仅Ⅱ、Ⅲ
D Ⅰ、Ⅱ、Ⅲ
他的回答: C (错误)
正确答案: B
解题分析
UDP是不可靠,无连接,面向数据报的协议,在协议头部当中有16字节的校验和,可以校验数据在传输过程当中是否失真,但是并不保证可靠。
传输层分用和复用就是把网络层提供的host-to-host传输服务扩展到运行于计算机上的应用进程间的传输服务,也就是点对点的传输,这里的点可以理解为端口
分用是把运输层segment中的信息发送给正确的socket的服务
复用是把所有socket中的数据集中并加头信息封装,然后发送到网络层的服务
10、主机甲与主机乙之间已建立一个TCP 连接,双方持续有数据传输,且数据无差错与丢失。若甲收到 1 个来自乙的 TCP 段,该段的序号为 1913、确认序号为 2046、
有效载荷为 100 字节,则甲立即发送给乙的 TCP 段的序号和确认序号分别是( )。
A 2046、 2012
B 2046、 2013
C 2047、 2012
D 2047、 2013
他的回答: C (错误)
正确答案: B
二、编程题
【发邮件】
NowCoder每天要给很多人发邮件。有一天他发现发错了邮件,把发给A的邮件发给了B,把发给B的邮件发给了A。于是他就思考,要给n个人发邮件,在每个人仅收到1封邮件的情况下,有多少种情况是所有人都收到了错误的邮件?即没有人收到属于自己的邮件。
输入描述:
输入包含多组数据,每组数据包含一个正整数n(2≤n≤20)。
输出描述:
对应每一组数据,输出一个正整数,表示无人收到自己邮件的种数。
示例1:
输入
2
3
输出
1
2
【解题思路】
用A、B、C……表示写着n位友人名字的信封,a、b、c……表示n份相应的写好的信纸。把错装的总数为记作D(n)。假设把a错装进B里了,包含着这个错误的一切错装法分两类:
b装入A里,这时每种错装的其余部分都与A、B、a、b无关,应有D(n-2)种错装法。
b装入A、B之外的一个信封,这时的装信工作实际是把(除a之外的)n-1份信纸b、
c……装入(除B以外的)n-1个信封A、C……,显然这时装错的方法有D(n-1)种。
总之在a装入B的错误之下,共有错装法D(n-2)+D(n-1)种。
a装入C,装入D……的n-2种错误之下,同样都有D(n-1)+D(n-2)种错装法,因此D(n)=(n-1)[D(n-1)+D(n-2)]
D(n) = (n-1) [D(n-2) + D(n-1)]
特殊地,D(1) = 0, D(2) = 1.
牛客网ACM模式代码
import java.util.*;
public class Main{
public static void main(String args[]){
long[] D = new long[21];
D[2] = 1;
for(int i = 3; i < 21; ++i){
D[i] = (i-1)*(D[i-1] + D[i-2]);
}
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
System.out.println(D[n]);
}
}
}
【最长上升子序列】
广场上站着一支队伍,她们是来自全国各地的扭秧歌代表队,现在有她们的身高数据,请你帮忙找出身高依次递增的子序列。 例如队伍的身高数据是(1、7、3、5、9、4、8),其中依次递增的子序列有(1、7),(1、3、5、9),(1、3、4、8)等,其中最长的长度为4。
输入描述:
输入包含多组数据,每组数据第一行包含一个正整数n(1≤n≤1000)。
紧接着第二行包含n个正整数m(1≤n≤10000),代表队伍中每位队员的身高。
输出描述:
对应每一组数据,输出最长递增子序列的长度。
示例1:
输入
7\n1 7 3 5 9 4 8\n6\n1 3 5 2 4 6
输出
4\n4
【解题思路】
动态规划的难点在于定义数组和创建“状态转移方程”。
- 定义height来存储数据,f[i]为以height[i]结尾的元素的最长上升子序列元素个数,初始时
将f所有内容全部初始化成1,因为子序列中至少包含一个元素。 - 定义"状态转移方程"
一开始先将f中的数据全部置为1,因为最小的子序列长度为1
然后对于每个height[i],通过遍历height[0]~height[i-1]之间的数据,如果在该区间中找到一个
height[j]比height[i]小的元素,开始比较f[j]+1和f[i]的大小,如果f[j]+1>f[j]则更新f[i],因此:
当height[i] > height[j]: f[i] = max(f[i], f[j]+1)
当height[i] <= height[j]:继续取下一个数据
牛客网ACM模式代码
import java.util.*;
public class Main{
public static int LIS(int[] array, int n){
// 保存以array[i]结尾的序列最长上升子序列元素的个数
int[] dp = new int[n];
dp[0] = 1;
int result = 1;
for(int i = 1; i < n; ++i){
// 求以array[i]结尾的序列的最长上升子序列的个数
// 将array[i]与array[0]~array[i-1]比较
// array[i] > array[j]: dp[i] = Math.max(dp[i], dp[j]+1)
dp[i] = 1;
for(int j = 0; j < i; ++j){
if(array[i] > array[j]){
dp[i] = Math.max(dp[i], dp[j]+1);
}
}
// 求目前最大的最长的上升子序列的长度
result = Math.max(result, dp[i]);
}
// 需要在所有状态中挑选一个最大值
return result;
}
public static void main(String args[]){
// 循环输入接收每组用例
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
int[] array = new int[n];
for(int i = 0; i < n; ++i){
array[i] = sc.nextInt();
}
// 求array数组中最长公共子序列
System.out.println(LIS(array, n));
}
}
}