赞
踩
目录
A 类 IP 地址:0.0.0.0 ~ 127.255.255.255 1 字节网络号,3 字节主机号
B 类 IP 地址:128.0.0.0 ~ 191.255.255.255 2 字节网络号,2 字节主机号
C 类 IP 地址:192.0.0.0 ~ 223.255.255.255 3 字节网络号,1 字节主机号
0 ~ 127 共有 128 个网络号,但是有两个比较特殊:0 作为本地宿主机,127 作为内部回送,并不算在内。
127.0.0.0 ~ 127.255.255.255 是保留地址,用做循环测试用的。0.0.0.0 ~ 0.255.255.255 也是保留地址,用做表示所有的 IP 地址。其中还有一个比较特殊的是 10 网段,用于分配给组建私网。
Socket 描述了地址信息,是网络通信的句柄,因为通过 socket 才知道谁与谁在进行通信。
UDP 通信不需要建立连接。
客户端通常不建议绑定端口,而是让系统自动进行分配合适的端口以此避免端口冲突的发生。
服务端的地址信息通常不能随意更改,否则客户端就无法找到服务器。
ARP 协议:介于链路层和网络层之间的协议,在相邻设备之间广播 ARP 请求,通过 IP 地址来获取指定设备的物理硬件 MAC 地址,收到响应之后将指定的 IP-MAC 映射信息添加到 ARP 表中。
Cookie 是用于维护 HTTP 通信状态的,HTTP 是一个无状态协议,服务端将一些需要客户端下次请求时携带的一些数据通过 Cookie 交给客户端,保存起来,客户端在下次请求服务器时将 Cookie 读取出来,在请求服务器的时候顺带一起发送,服务器根据 Cookie 中的信息就能知道客户端是谁、处于什么状态。
简单来说,Cookie 就是浏览器存储数据的结构。
Cookie 里面存储的全是键值对。
ARP 欺骗攻击是局域网欺骗攻击,通过大量广播发送 ARP 响应伪装自己是网关是目标主机。
重放攻击的基本原理是把以前窃听到的数据原封不动地重新发送给接收方。
暴力攻击是一种密码攻击方法,可以输入和解密所有理论上可能的模式。
DNS 欺骗就是攻击者冒充域名服务器的一种欺骗行为。
synflood 是 syn 泛洪攻击。有一个恶意主机,伪造大量的 IP 地址,然后给服务器发送 SYN 请求,但是不进行第三次握手的回复,这样就会消耗服务器大量资源,使服务器连接等待队列爆满,无法处理合理的客户端请求。
DDos 攻击:分布式拒绝服务攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动 DDos 攻击,从而成倍的提高拒绝服务攻击的威力。
MAC 地址欺骗:利用 mac 欺骗阻止局域网内任意电脑使用网络。
伪造 DHCP 服务器:本质上是 DHCP 欺骗攻击,将真的 DHCP 服务器的 ip 资源耗尽,然后部署假的 DHCP 服务器,让主机向假的 DHCP 服务器请求。
Dos 攻击被称之为拒绝服务攻击,其目的是使计算机或网络无法提供正常的服务。最常见的 Dos 攻击有计算机网络宽带攻击和连通性攻击。
Dos 攻击中并不包括侵入目标服务器或目标网络设备。
Dos 是指故意的攻击网络协议实现的缺陷或直接通过野蛮手段残忍的耗尽被攻击对象的资源。
A 类 IP 地址有 1 字节网络号,3 字节主机号。
B 类 IP 地址有 2 字节网络号,2 字节主机号。
C 类 IP 地址有 3 字节网络号,1 字节主机号。
RARP 协议是通过 MAC 地址获取 IP 地址。
ARP 协议就是根据 IP 地址找到 MAC 地址的。
IP 协议是用于网络层通信的。
IMCP 其实就是 ICMP网际控制协议,用于网络探测的(ping)。
应用层:文件传输协议(FTP),远程登录协议(Telnet),电子邮件协议(SMTP),网络文件服务协议(NFS),网络管理协议(SNMP),域名解析协议(DNS)。
传输层:TCP,UDP 协议。
网络层:IP,ICMP,ARP,RARP。
A:客户端发送请求后,收到响应的时间,系统响应时间是系统对用户请求作出反应的时间。
B:RTT 往返延时,从数据被发出到收到接收端的确认经历的时间,是网络层的计算。
C:TTL,报文最大生存周期,或者说所经过路由器的跳数。
D:这里说的网络延迟和我们打游戏的延时是不一样的,指的是数据在传输介质中通过网络协议在传输介质中传输所用的时间。
有逃课写法,可以直接利用库函数完成。首先把每个间隔符都替换成空格,然后利用字符串自带的 split 方法来切割空格,最后从数组后面往前输出每个元素即可。
还有另一种双指针写法,总体思路就是先将整个字符串逆序一遍,然后再将每个单词都逆序,最后再进行输出。
用两个双指针 start 和 end 来分别记录单词的首字母和该单词的末尾字母的下一个间隔符,先让 start 找到字母,然后再让 end 指向 start。
如果 end 遇到的是字母,就一直往后走,直到遇到间隔符才停下来,如果 end 越界了,就先逆序 start 到 end - 1 范围的字符,然后再退出循环。
如果 end 没越界,说明此时 end - 1 就一定是该单词的最后一个字母,逆序 start 到 end - 1 范围的字符,然后再让 end 跳过后面一连串的间隔符,直到遇到字母才停下来,如果此时 end 越界了,就说明从该单词往后已经没有单词了,全是间隔符,所以直接跳出循环。如果没越界,则说明此时 end 就一定是下个单词的首字母,让 start 指向 end 。
重复上述过程,如果 start 越界了,则说明单词已经逆序完成,最后按照题目要求输出即可。
代码实现:
- // split 方法:
- import java.util.*;
-
- // 注意类名必须为 Main, 不要有任何 package xxx 信息
- public class Main {
- public static void main(String[] args) {
- Scanner in = new Scanner(System.in);
- // 注意 hasNext 和 hasNextLine 的区别
- while (in.hasNextLine()) { // 注意 while 处理多个 case
- String str = in.nextLine();
- StringBuilder s = new StringBuilder();
- // 把所有的间隔符替换成空格
- for (int i = 0; i < str.length(); i++) {
- char c = str.charAt(i);
- if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
- s.append(c);
- } else {
- s.append(' ');
- }
- }
- // 然后利用 split 切割函数来根据空格切割,
- // 最后从后往前输出单词即可
- String[] arr = s.toString().split(" ");
- for (int i = arr.length - 1; i >= 0; i--) {
- if (i > 0) {
- System.out.print(arr[i] + " ");
- } else {
- System.out.println(arr[i]);
- }
- }
- }
- }
- }
-
-
-
-
-
-
- // 双指针法:
- import java.util.*;
-
- // 注意类名必须为 Main, 不要有任何 package xxx 信息
- public class Main {
- public static void main(String[] args) {
- Scanner in = new Scanner(System.in);
- // 注意 hasNext 和 hasNextLine 的区别
- while (in.hasNextLine()) { // 注意 while 处理多个 case
- String str = in.nextLine();
- print(str);
- }
- }
-
- public static void print(String str) {
- char[] arr = str.toCharArray();
- // 先整句进行逆序,然后再每个单词都进行逆序
- reverse(arr, 0, arr.length - 1);
- int start = 0;
- int len = arr.length;
- while (start < len) {
- // 先找到单词的首字母
- while (start < len && !isAlpha(arr[start])) {
- start++;
- }
- // 此时 start 一定是单词首字母
- int end = start;
- // 再找到该单词的最后一个字母
- while (end < len && isAlpha(arr[end])) {
- end++;
- }
- if (end >= len) {
- // 越界了,先逆序再退出循环
- reverse(arr, start, end - 1);
- break;
- }
- // 如果代码来到这里说明 end - 1 一定是该单词的最后一个字母
- // 逆序
- reverse(arr, start, end - 1);
- // 跳过这一串连续的间隔符
- while (end < len && !isAlpha(arr[end])) {
- end++;
- }
- if (end >= len) {
- // 越界了,因为这里前面已经找到并逆序过单词了,
- // 现在是跳过一连串的间隔符,如果直接就跳到了字符串末尾
- // 说明从单词往后就全是间隔符,没有单词了(示例2)
- // 所以不用再逆序,直接跳出循环即可
- break;
- }
- // 来到这里说明 end 一定是下一个单词的首字母
- start = end;
- }
-
- // 最后按题目要求输出即可
- for (int i = 0; i < len; ) {
- if (isAlpha(arr[i])) {
- System.out.print(arr[i]);
- i++;
- } else {
- System.out.print(' ');
- // 然后跳过后面连续的间隔符
- while (i < len && !isAlpha(arr[i])) {
- i++;
- }
- }
- }
- System.out.println();
-
- }
-
- public static boolean isAlpha(char c) {
- if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
- return true;
- }
- return false;
- }
-
- public static void reverse(char[] arr, int left, int right) {
- while (left < right) {
- char tmp = arr[left];
- arr[left] = arr[right];
- arr[right] = tmp;
- left++;
- right--;
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。