网络工程师/技术支持工程师面试题(1)
网络工程师/技术支持工程师面试题
(一)TCP三次握手四次挥手
TCP三次握手?
A:您好,我是 A
B:您好 A,我是 B
A:您好 B
最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。
第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器 SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进 ESTABLISHED(TCP连接成功)状态,完成三次握手。
字段 | 含义 |
---|---|
URG | 紧急指针是否有效。为1,表示某一位需要被优先处理 |
ACK | 确认号是否有效,一般置为1。 |
PSH | 提示接收端应用程序立即从TCP缓冲区把数据读走。 |
RST | 对方要求重新建立连接,复位。 |
SYN | 请求建立连接,并在其***的字段进行***的初始值设定。建立连接,设置为1 |
FIN | 希望断开连接 |
TCP 四次挥手
A:B 啊,我不想玩了
B:哦,你不想玩了啊,我知道了
这个时候,只是 A 不想玩了,即不再发送数据,但是 B可能还有未发送完的数据,所以需要等待 B 也主动关闭。
B:A 啊,好吧,我也不玩了,拜拜
A:好的,拜拜
数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。
- 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其***为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
- 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的***seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
- 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
- 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的***为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
- 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的***是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗*∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
- 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
常见面试题
1.为什么客户端最后还要等待2MSL?
MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。
第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。
2. 为什么建立连接是三次握手,关闭连接确是四次挥手呢?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
3. 如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
(二)TCP 是如何通过滑动窗口协议实现流量控制和拥塞控制的?
滑动窗口协议
滑动窗口是什么?
滑动窗口是类似于一个窗口的东西,用来告诉发送端可以发送数据的大小或说是窗口标记了接收端缓冲区的大小。
注:窗口是指一次批量发送数据的大小
为什么会出现滑动窗口?
在确认应答策略中,对每一个发送的数据段,都要给ACK确认应答,收到ACK后在发送下一个数据段,这样做有一个较大的缺点就是性能很差,尤其是数据往返时间长的时候使用滑动窗口就可以一次发送多条数据,从而提高了性能。
1:接收端将自己可以接收的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK来通知发送端。
2:窗口大小字段越大,说明网络的吞吐率越高。
3:窗口大小是指无需等待确认应答而可以继续发送数据的最大值,即不需要接收端的应答就能一次连续发送数据的大小。
4:操作系统内核为了维护滑动窗口,需要开辟发送缓冲区来记录当前还有哪些数据没有应答,只有确认应答过的数据,才能从缓冲区中删掉。(注:缓冲区如果太大,会有空间开销)
5:接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端,发送端收到该值后,就会减慢自己的发送速度。
6:如果接收端发现自己的缓冲区满了,就会将窗口的大小设置为0,此时发送端将不再发送数据,但是需要定期发送一个窗口探测数据段,让接收端把窗口大小告诉发送端。(注:TCP首部有一个16位的窗口字段,该字段用来存放窗口大小信息)
流量控制
防止对方发送过快,耗尽接收方的资源,从而导致接收方来不及处理。
1:接收端抑制发送端的依据:接收端缓冲区的大小。
2:流量控制的目标是接收端,怕接收端来不及处理。
3:流量控制的机制是丢包。
拥塞控制
防止发送方发送过快导致网络来不及处理,从而引起网络拥塞。
拥塞控制使用的机制:加法增加乘法减少\慢启动。
加法增加:执行拥塞避免算法后,收到对所有报文段的确认后(经过一个往返时间),就把拥塞窗口cwnd增加一个MSS大小,使拥塞窗口缓慢增大,防止网络过早出现拥塞。
乘法减少:出现一次超时(即一次网络拥塞),就把慢启动门限值ssthresh设置为当前拥塞窗口值的一半。
注:当网络频繁拥塞时,ssthresh值下降的很快,用来减少注入到网络中的分组数。
流量控制和拥塞控制的区别和联系
相同点
1:现象都是丢包。
2:实现机制都是让发送方发的慢一点,少一点。
不同点
1:丢包位置不同。
流量控制丢包位置在接收端上。
拥塞控制丢包位置在路由器上。
2:作用的对象不同。
流量控制的对象是接收方。
拥塞控制的对象是网络。
联系
拥塞控制:通常为一个全局性的过程,涉及到网络中的所有主机、路由器以及所有降低网络传输性能的因素。
流量控制:发生在发送端和接收端之间,只是点到点之间的控制。
(三)什么是 DDOS 攻击?和 DOS 攻击有什么区别?
DOS攻击
1:利用自己的计算机攻击目标,也是一对一的关系。
2:是一种拒绝服务式攻击。
DDOS攻击
1:在DOS攻击基础上产生的一种新的攻击方式,利用控制成百上千台
机,组成一个DDOS攻击群,同一时刻对目标发起攻击。
2:是分布式拒绝服务攻击。
(四)TCP和UDP区别
TCP(传输控制协议):是一个面向连接的可靠的传输层的协议,在发送数据之前要和对方建立可靠的连接。
UDP(用户数据报协议):是一个非面向连接的不提供可靠性的传输层的协议。只是把应用程序传给IP层的数据包包发送出来,不能保证他们到达目的地,由于UDP在传输前不需要建立连接,也没有超时重传机制,所以速度很快。
TCP
UDP
(五)ping原理
ping主要是用来探测主机和主机之间是否可以进行通信,如果不能ping到某台主机,表示不能与这台主机建立连接。ping使用的是ICMP协议,他发送ICMP回送请求消息给目的主机。
ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机,如果源主机在一定时间内收到应答,表明主机可达。ICMP协议是通过IP协议发送的,IP协议是无连接的,不可靠的数据报协议。
ping是用来检测网络是否畅通或者网络连接速度的命令
在同一网段内
在主机 A 上运行“Ping 192.168.0.5”后,都发生了些什么呢?
首先,Ping 命令会构建一个固定格式的 ICMP 请求数据包, 然后由 ICMP 协议将这个数据包连同地址“192.168.0.5”一起 交给IP 层协议,IP 层协议将以地址 “192.168.0.5”作为目的地址。本机 IP 地址作为源地址,加上一些其他的控制信息,构建一 个 IP 数据包,并想办法得到 192.168.0.5 的MAC 地址,以便交给数据链路层构建一个数据帧。关键就在这里,IP层协议通过机器B的IP地址和自己的子网掩码,发现它跟自己属同一网络,就直接在本网络内查找这台机器的 MAC,如果以前两机有过通信,在 A 机的 ARP 缓存表应该 有 B 机 IP 与其 MAC 的映射关系,如果没有,就发一个 ARP 请求广播,得到 B 机的 MAC, 一并交给数据链路层。后者构建一个数据帧,目的地址是 IP 层传过来的物理地址,源地址则是本机的MAC地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送 出去。 主机 B 收到这个数据帧后,先检查它的目的地址,并和本机的MAC地址对比,如符合, 则接收;否则丢弃。接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层 协议。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议,后者处理后,马上构建 一个 ICMP 应答包,发送给主机 A,其过程和主机 A 发送 ICMP 请求包到主机 B 一模一样。
在不同网段内
在主机 A 上运行“Ping 192.168.1.4”后,开始跟上面一样,到了怎样得到 MAC 地址时,IP 协议通过计算发现 D 机与自己不在同一网段内,就直接将交由路由处理,也就是将路由的 MAC 取过来,至于怎样得到路由的 MAC,跟上面一样,先在 ARP 缓存表找,找不到就广播吧。路由得到这个数据帧后,再跟主机 D 进行联系,如果找不到,就向主机 A 返回一个 超时的信息。
(六)trace route原理
Traceroute是用来侦测由源主机到目的主机所经过的路由的情况的重要工具,也是最简洁的工具,尽管ping可以进行侦测,但是ping受到IP头的限制(IP首部字段最多只能放9个IP地址),ping不能完全记录所经过的路由器,所以才会引入Traceroute。
Traceroute原理:其实Traceroute的原理很简单,他收到目的主机IP后,首先给目的主机发送一个TTL=1(TTL指生存时间)的udp数据包,而经过的第一个路由器收到这个数据包之后,自动把TTL减去1,而TTL变为0之后,路由器就将这个数据包抛弃了,并同时产生一个主机不可达的ICMP超时数据报给主机。主机收到这个ICMP数据报以后,会发送一个TTL=2的数据报给目的主机,然后刺激第二个路由器给主机发送ICMP数据报,如此反复,直到到达目的主机。这样Traceroute就可以拿到所有路由器的IP,从而避开IP头只能记录有限路由的IP地址。
那么我们怎么知道UDP到没到达目的主机呢?
这就涉及一个技巧的问题,TCP和UDP协议有一个端口号定义,而普通的网络程序只监控少数的几个号码较小的端口,比如说80,比如说23,等等。而traceroute发送的是端口>30000(真变态)的UDP报,所以到达目的主机的时候,目的主机只能发送一个端口不可达的ICMP数据报给主机。主机接到这个报告以后就知道目的主机到了。
(七)DNS解析过程
-
在浏览器中输入www.qq.com域名后,浏览器首先会在自己的缓存中查找是否有该域名对应的IP地址映射,若有,则先使用该IP地址映射完成域名解析。
-
若浏览器缓存中没有该域名的映射关系。操作系统会检查自己本地的hosts文件是否有这个网址的映射关系,若有,就先调用该IP地址映射完成域名解析。
-
若hosts文件中没有这个域名映射,则查找本地DNS解析器缓存来看是否有这个网址的映射关系。若有,则直接返回完成域名解析。
-
若hosts文件与本地DNS解析器缓存都没有相应的网址映射关系。首先查找TCP/IP参数中设置的首选DNS服务器,我们称之为本地DNS服务器。该服务器收到查询时,如果要查询的域名在本地配置区域资源中,则返回解析给客户端,完成域名解析。该解析具有权威性。
-
若要查询的域名不在本地DNS服务器区域资源中,但该服务器缓存了该网址的映射关系,则调用这个IP地址映射,完成域名解析。该解析不具有权威性。
-
如果本地DNS服务器的本地区域资源和缓存都解析失败,则根据本地DNS服务器的设置(是否设置转发器)进行查询。若未使用转发模式,本地DNS就会把请求发送给13台根DNS。根DNS服务器收到请求后会判断该域名由谁来管理,并返回一个负责该*域名服务器的IP地址。本地DNS服务器收到IP地址后,将会联系负责.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个IP后,就会找qq.com域服务器,重复上面的操作进行查询,直至找到www.qq.com主机。
-
若使用了转发模式,本地DNS服务器就会把请求发送给上一级DNS服务器,由上一级服务器进行解析。若上一级服务器不能解析,就把请求发送给上上级或找到根DNS,以此循环。无论是本地DNS服务器使用转发还是非转发,最终都是把结果返回给本地DNS服务器,由本地DNS服务器再返回给客户端。