目录
5、简述 DNS 查询服务器的基本流程是什么?DNS 劫持是什么?
11、简述 TCP 和 UDP 的区别,它们的头部结构是什么样的
21、说说如果三次握手时候每次握手信息对方没收到会怎么样,分情况介绍
22、简述 TCP 的 TIME_WAIT,为什么需要有这个状态
23、简述什么是 MSL,为什么客户端连接要等待2MSL的时间才能完全关闭
26、说说 TCP 与 UDP 在网络协议中的哪一层(传输层)
28、说一说 TCP 的 keepalive,以及和 HTTP 的 keepalive 的区别?
41、说说 Cookie 和 Session 的关系和区别是什么
49、dns 的数据传输是采用 tcp 协议还是 udp 协议 ,或者是其他的什么协议
56、arp(address resolution protocol) 地址解析协议
1、简述静态路由和动态路由
静态路由:由系统管理员设计的路由表规定。适合网关数量有限的情景,需要管理员修改。
动态路由:由路由选择协议动态构建。自动更新路由表。路由广播更新信息将占据大量的网络带宽
2、路由选择算法的必要步骤
- 向其它路由器传递路由信息;
- 接收其它路由器的路由信息;
- 根据收到的路由信息计算出到每个目的网络的最优路径,并由此生成路由选择表;
- 根据网络拓扑的变化及时的做出反应,调整路由生成新的路由选择表,同时把拓扑变化以路由 信息的形式向其它路由器宣告。
3、路由选择算法与协议
算法:距离向量法(Distance Vector Routing)和链路状态算法(Link-State Routing)
距离向量法:
- RIP路由协议:路由器根据距离选择路由,所以也称为距离向量协议。简单、可靠,便于配置。但是 RIP 只适用于小型的同构网络
- IGRP 和 EIGRP 协议
链路状态算法:
- OSPF 路由协议:需要每个路由器向其同一管理域的所有其它路由器发送链路状态广播信息,利用 OSPF 的路由器首先必须收集有关的链路状态信息,并根据一定的算法 计算出到每个节点的最短路径。与 RIP 不同,OSPF 将一个自治域再划分为区,相应地即有两种类型的路由选择方式: 当源和目的地在同一区时,采用区内路由选择;当源和目的地在不同区时,则采用区间路由 选择。这就大大减少了网络开销,并增加了网络的稳定性。当一个区内的路由器出了故障时 并不影响自治域内其它区路由器的正常工作,这也给网络的管理、维护带来方便。
混合算法:
- BGP 和 BGP4 路由协议:它的主要功能是与其它自治域的 BGP 交换网络可达信息。各个自治域可以运行不同的内部网关协议。
4、简述域名解析过程,本机如何干预域名解析
输入域名后依次查询:
- 本地的hosts文件
- 本地DNS解析器缓存
- 本地DNS服务器
- 本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP
- 本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。
- 当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com主机。
从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。
如何干涉:
通过修改本机host来干预域名解析,例如: 在/etc/hosts文件中添加一句话
192.168.188.1 www.baidu.com
保存文件后再ping一下www.baidu.com就会连接到192.168.188.1了
每一行为一条记录,分成两部分,第一部分是IP,第二部分是域名。
-
一个IP后面可以跟多个域名,可以是几十个甚至上百个
-
每一行只能有一个IP,也就是说一个域名不能对应多个IP
-
如果有多行中出现相同的域名(对应的ip不一样),会按最前面的记录来解析
5、简述 DNS 查询服务器的基本流程是什么?DNS 劫持是什么?
本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。
DNS劫持就是通过劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后的指定IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务的目的。
6、简述网关的作用是什么,同一网段的主机如何通信
网关即网络中的关卡,他是保证网络互连的,翻译和转换,使得不同的网络体系能够进行。
网内通信,即通信双方都位处同一网段中,数据传输无需经过路由器(或三层交换机),即可由本网段自主完成。
假设发送主机的ARP表中并无目的主机对应的表项,则发送主机会以目的主机IP地址为内容,广播ARP请求以期获知目的主机MAC地址,并通过交换机(除到达端口之外的所有端口发送,即洪泛(Flooding))向全网段主机转发,而只有目的主机接收到此ARP请求后会将自己的MAC地址和IP地址装入ARP应答后将其回复给发送主机,发送主机接收到此ARP应答后,从中提取目的主机的MAC地址,并在其ARP表中建立目的主机的对应表项(IP地址到MAC地址的映射),之后即可向目的主机发送数据,将待发送数据封装成帧,并通过二层设备(如交换机)转发至本网段内的目的主机,自此完成通信。
7、简述CSRF攻击的思想以及解决方法
CSRF全称叫做,跨站请求伪造。就是黑客可以伪造用户的身份去做一些操作,进而满足自身目的。
要完成一次CSRF攻击,受害者必须依次完成两个步骤:
1)登录受信任网站A,并在本地生成Cookie。
2)在不登出A的情况下,访问危险网站B。
此时,黑客就可以获取你的cookie达成不可告人的目的了。
解决:CSRF 攻击是一种请求伪造的攻击方式,它利用的是服务器不能识别用户的类型从而盗取用户的信息来攻击。因此要防御该种攻击,因为从服务器端着手,增强服务器的识别能力,设计良好的防御机制。主要有以下几种方式:
1)请求头中的Referer验证(不推荐)
HTTP的头部有一个Referer信息的字段,它记录着该次HTTP请求的来源地址(即它从哪里来的),既然CSRF攻击是伪造请求是从服务器发送过来的,那么我们就禁止跨域访问,在服务器端增加验证,过滤掉那些不是从本服务器发出的请求,这样可以在一定程度上避免CSRF攻击。 但是这也有缺点,比如如果是从搜索引擎所搜结果调整过来,请求也会被认为是跨域请求。
2)请求令牌验证(token验证)
token验证是一种比较广泛使用的防止CSRF攻击的手段,当用户通过正常渠道访问服务器时,服务器会生成一个随机的字符串保存在session中,并作为令牌(token)返回给客户端,以隐藏的形式保存在客户端中,客户端每次请求都会带着这个token,服务器根据该token判断该请求是否合法
8、说说 MAC地址和IP地址分别有什么作用
IP地址:IP协议提供的逻辑地址,屏蔽物理地址差异。根据网络的拓扑结构
MAC地址:指的是物理地址。
ARP(Address Resolution Protocol:地址解析协议)负责将IP地址映射到MAC地址上来完成的。
9、简述 TCP 三次握手和四次挥手的过程
1)第一次握手:建立连接时,客户端向服务器发送SYN包(seq=x),请求建立连接,等待确认
2)第二次握手:服务端收到客户端的SYN包,回一个ACK包(ACK=x+1)确认收到,同时发送一个SYN包(seq=y)给客户端
3)第三次握手:客户端收到SYN+ACK包,再回一个ACK包(ACK=y+1)告诉服务端已经收到
4)三次握手完成,成功建立连接,开始传输数据
1)客户端发送FIN包(FIN=1)给服务端,告诉它自己的数据已经发送完毕,请求终止连接,此时客户端不发送数据,但还能接收数据
2)服务端收到FIN包,回一个ACK包给客户端告诉它已经收到包了,此时还没有断开socket连接,而是等待剩下的数据传输完毕
3)服务端等待数据传输完毕后,向客户端发送FIN包,表明可以断开连接
4)客户端收到后,回一个ACK包表明确认收到,等待一段时间,确保服务端不再有数据发过来,然后彻底断开连接
10、说说 TCP 2次握手行不行?为什么要3次
TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。
如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认,造成死等
11、简述 TCP 和 UDP 的区别,它们的头部结构是什么样的
TCP | UDP |
三次握手,面向连接 | 无连接 |
数据按序发送,按序到达 | 不保证按序到达,甚至不保证到达 |
TCP首部需20个字节 | UDP首部字段8个字节 |
有流量控制和拥塞控制 | 网络拥堵不会影响发送端的发送速率 |
一对一的连接 | 支持一对一,多对多,一对多的通信 |
字节流的服务 | 报文的服务 |
/*TCP头定义,共20个字节*/
typedef struct _TCP_HEADER
{
short m_sSourPort; // 源端口号16bit
short m_sDestPort; // 目的端口号16bit
unsigned int m_uiSequNum; // 序列号32bit
unsigned int m_uiAcknowledgeNum; // 确认号32bit
short m_sHeaderLenAndFlag; // 前4位:TCP头长度;中6位:保留;后6位:标志位
short m_sWindowSize; // 窗口大小16bit
short m_sCheckSum; // 检验和16bit
short m_surgentPointer; // 紧急数据偏移量16bit
}__attribute__((packed))TCP_HEADER, *PTCP_HEADER;
/* TCP头中的选项定义 kind(8bit)+Length(8bit,整个选项的长度,包含前两部分)+内容(如果有的话) KIND = 1表示 无操作NOP,无后面的部分 2表示 maximum segment 后面的LENGTH就是maximum segment选项的长度(以byte为单位,1+1+内容部分长度) 3表示 windows scale 后面的LENGTH就是 windows scale选项的长度(以byte为单位,1+1+内容部分长度) 4表示 SACK permitted LENGTH为2,没有内容部分 5表示这是一个SACK包 LENGTH为2,没有内容部分 8表示时间戳,LENGTH为10,含8个字节的时间戳 */
typedef struct _TCP_OPTIONS
{
char m_ckind;
char m_cLength;
char m_cContext[32];
}__attribute__((packed))TCP_OPTIONS, *PTCP_OPTIONS;
//UDP头部结构如下:cpp /*UDP头定义,共8个字节
typedef struct _UDP_HEADER
{
unsigned short m_usSourPort; // 源端口号16bit
unsigned short m_usDestPort; // 目的端口号16bit
unsigned short m_usLength; // 数据包长度16bit
unsigned short m_usCheckSum; // 校验和16bit
}__attribute__((packed))UDP_HEADER, *PUDP_HEADER;
12、简述 TCP连接和关闭的状态转移
上半部分是TCP三路握手过程的状态变迁,下半部分是TCP四次挥手过程的状态变迁。
-
CLOSED:起始点,在超时或者连接关闭时候进入此状态,这并不是一个真正的状态,而是这个状态图的假想起点和终点。
-
LISTEN:服务器端等待连接的状态。服务器经过 socket,bind,listen 函数之后进入此状态,开始监听客户端发过来的连接请求。此称为应用程序被动打开(等到客户端连接请求)。
-
SYN_SENT:第一次握手发生阶段,客户端发起连接。客户端调用 connect,发送 SYN 给服务器端,然后进入 SYN_SENT 状态,等待服务器端确认(三次握手中的第二个报文)。如果服务器端不能连接,则直接进入CLOSED状态。
-
SYN_RCVD:第二次握手发生阶段,跟 3 对应,这里是服务器端接收到了客户端的 SYN,此时服务器由 LISTEN 进入 SYN_RCVD状态,同时服务器端回应一个 ACK,然后再发送一个 SYN 即 SYN+ACK 给客户端。状态图中还描绘了这样一种情况,当客户端在发送 SYN 的同时也收到服务器端的 SYN请求,即两个同时发起连接请求,那么客户端就会从 SYN_SENT 转换到 SYN_REVD 状态。
-
ESTABLISHED:第三次握手发生阶段,客户端接收到服务器端的 ACK 包(ACK,SYN)之后,也会发送一个 ACK 确认包,客户端进入 ESTABLISHED 状态,表明客户端这边已经准备好,但TCP 需要两端都准备好才可以进行数据传输。服务器端收到客户端的 ACK 之后会从 SYN_RCVD 状态转移到 ESTABLISHED 状态,表明服务器端也准备好进行数据传输了。这样客户端和服务器端都是 ESTABLISHED 状态,就可以进行后面的数据传输了。所以 ESTABLISHED 也可以说是一个数据传送状态。
下面看看TCP四次挥手过程的状态变迁。
-
FIN_WAIT_1:第一次挥手。主动关闭的一方(执行主动关闭的一方既可以是客户端,也可以是服务器端,这里以客户端执行主动关闭为例),终止连接时,发送 FIN 给对方,然后等待对方返回 ACK 。调用 close() 第一次挥手就进入此状态。
-
CLOSE_WAIT:接收到FIN 之后,被动关闭的一方进入此状态。具体动作是接收到 FIN,同时发送 ACK。之所以叫 CLOSE_WAIT 可以理解为被动关闭的一方此时正在等待上层应用程序发出关闭连接指令。TCP关闭是全双工过程,这里客户端执行了主动关闭,被动方服务器端接收到FIN 后也需要调用 close 关闭,这个 CLOSE_WAIT 就是处于这个状态,等待发送 FIN,发送了FIN 则进入 LAST_ACK 状态。
-
FIN_WAIT_2:主动端(这里是客户端)先执行主动关闭发送FIN,然后接收到被动方返回的 ACK 后进入此状态。
-
LAST_ACK:被动方(服务器端)发起关闭请求,由状态2 进入此状态,具体动作是发送 FIN给对方,同时在接收到ACK 时进入CLOSED状态。
-
CLOSING:两边同时发起关闭请求时(即主动方发送FIN,等待被动方返回ACK,同时被动方也发送了FIN,主动方接收到了FIN之后,发送ACK给被动方),主动方会由FIN_WAIT_1 进入此状态,等待被动方返回ACK。
-
TI