<如果您从事iOS或者对数据结构和算法以及TCP/IP网络感兴趣,欢迎大家加入学习交流群:QQ529560119>

一.TCP和UDP的区别?他们位于那一层?

答:位于传输层。

TCP是面向连接的(只有在确认通信对端存在时才会发送数据),可靠的流协议,流就是指不间断的数据结构,你可以把它想象成排水管道中的水流。当应用程序采用TCP发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。 TCP为提供可靠性传输,实行“顺序控制”或“重发控制”机制。此外还具有“流量控制”,“拥塞控制”提高网络利用率等众多功能。TCP用于在传输层有必要实现可靠传输的情况。

 UDP是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在UDP的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。UDP主要用于那些对高速传输和实时性有较高要求的通信和广播通信。UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网上的一种机制。1.即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥堵的行为。2.此外在传输途中即使出现丢包,UDP也不负责重发,甚至当出现包的到达顺序乱掉时也没有纠正的功能。如果需要这些细节控制,那么不得不交由采用UDP的应用程序去处理(比如QQ采用UDP实现传输,UDP本身不具有流量控制和是重发机制能功能,如果非要实现就要QQ去做特殊处理了)。UDP面向无连接,可以随时发送数据,再加上UDP本身的处理既简单有高效,所以常用下面几个方面:包总量较少的通信(DNS,SNMP等),视频音频等多媒体处理(即时通信),广播通信(广播,多播)。

可能有人会认为,鉴于TCP是可靠的传输协议,那么它一定优于UDP。其实不然,TCP和UDP的优缺点无法简单地,绝对地去做比较。我们举一个通过IP电话进行通话的例子,如果使用TCP,数据在传送途中如果丢失会被重发,但这样无法流畅地传输通话人的声音,会导致无法进行正常交流。而采用UDP,它不会进行重发处理,从而也就不会有声音大幅度延迟到达的问题。即使有部分数据丢失,也只是会影响某一小部分的通话。此外在多播和广播通信中也使用UDP而不是TCP。

二.描述TCP建立连接的三次握手,以及释放连接的四次握手?

答:下面第一张是建立以及释放连接的图片示意图:

网络面试常见问题总结_TCP

  

建立连接的过程

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。

断开连接的过程

1.断开连接端可以是Client端,也可以是Server端。假设Client端发起中断连接请求,就先发送FIN报文。

2.Server端接到FIN报文后,但是如果还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以服务器端先发送ACK,告诉Client端:请求已经收到了,但是我还没准备好,请继续等待停止的消息。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。

3.当Server端确定数据已发送完成,则向Client端发送FIN报文,告诉Client端:服务器这边数据发完了,准备好关闭连接了。

4.Client端收到FIN报文后,就知道可以关闭连接了,但是他还是不相信网络,所以发送ACK后进入TIME_WAIT状态, Server端收到ACK后,就知道可以断开连接了。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,最后,Client端也可以关闭连接了至此,TCP连接就已经完全关闭了!关闭连接的过程如下图所示:

网络面试常见问题总结_数据_02

三,你怎么理解分层和协议?

协议:

就是计算机与计算机之间通过网络实现通信时事先达成的一种“约定”。这种约定使那些不同厂商的设备,不同的CPU以及不用的操作系统组成的计算机之间,只要遵循先攻的协议就能够事先通信。反之,如果所使用的协议不同,就无法实现通信。这就好比两个人使用不同国家的语言说话,怎么也无法相互理解。协议可以分为很多种,每一种协议都明确地界定了它的行为规范。两台计算机之间能够支持相同的协议,并遵循相同协议进行处理,这样才能实现通信。

在这里我们举一个例子。有三个人A,B,C.A只会说汉语,B只会说英语,而C既会说汉语又会说英语。现在A与B聊天,他们之间该如何沟通呢?若A与C要聊天,又会怎么样?这是如果我们:

将汉语和英语当做“协议”

将聊天当做“通信”

将说话的内容当做数据“”

那么A与B之间由于各持一种语言,恐怕多久也无法交流,因为他们之间的谈话所用的协议(语言)不同,双方都无法将数据(所说的话)传递给对方。那分析一下A和C之间的聊天呢,两人都用汉语这个“协议”就能理解对方索要表达的具体含义了。

网络面试常见问题总结_数据_03

在计算机通信中,事先达成一个详细的约定,并遵循这一约定进行处理尤为重要,这种约定其实就是“协议”。

网络面试常见问题总结_服务器_04


分层:

协议分层就如同计算机软件中的模块化开发。这一模型将通信协议中必要的功能分成了7层,通过这些分层,使得那些比较复杂的网络协议更加简单化,在这一模型中,每个分层都接受由它下一层所提供的特定服务,并且负责为自己的上一层提供特定的服务,上下层之间进行交互时所遵循的约定叫做“接口”。同一层之间的交互所遵循的约定叫做“协议”。PSI参考模型是的建议是比较理想化的,她希望实现从第一层到第七层的所有模块,并将他们组合起来实现网络通信。分层可以将每个分层独立使用,即使系统中某些分层发生变化,也不会波及整个系统。因此,可以构造一个扩展性和灵活性都较强的系统。此外,通过分层能够细分通信功能,更易于单独实现每个分层的协议,并界定各个分层的具体责任和义务,这些都属于分层的优点。而分层的劣势,可能就在于过分模块化,使处理变得更加沉重以及每个模块都不得不实现想死的处理逻辑等问题。

针对协议分层,我们再以A与C的对话为例子,在这里,我们只考虑语言曾和通信设备层这两个分层的情况。在下面这张图中,他们所用的语言协议作为毛科峰的音频输入,在通信设备层被转换为点播信号传送出去了。传送到对方的电话机后,又被通信设备层转化为音频输出,传递给了对方,因此,A与C其实是利用电话机之间通过音频转化声音的接口实现了对话。这个道理其实和分层的道理是一样的。

网络面试常见问题总结_TCP_05

四,为什么建立连接时是三次握手,两次行不行?

答:我们先讲一个小故事,在英雄儿女的电影中,友军双方黄河和长江利用发报机通话。

第一次握手:黄河发起呼叫,长江收到了。这时长江可以确认的是,黄河的发信机和自己的收信机都是好的,否则的话他收不到黄河的呼叫,黄河能确认什么呢?他什么也不能确认,有可能自己的电台除了指示灯是好的,其他都是坏的,他在对着一台铁疙瘩发功。

第二次握手:长江回应,黄河收到了。这时黄河可以确认的是,自己和长江的收发信机都是好的,否则的话他收不到长江的回应信号。这时黄河可以说正事了么?还不能,虽然长江发出了回应,但他并不能确认自己的发信机和黄河的发信机都是好的。

第三次握手:黄河对长江的回应进行回应。这时黄河很清楚双方收发信机都是好的,自己的这次回应长江肯定能收到,这个回应的目的只是消除长江对黄河的收信机和长江的发信机的担心,因为有可能长江发送了回应,但是黄河没有收到。然后,黄河不必等长江再次回应就可以说正事了。

俗话说人算不如天算,我看再多握几次手会更可靠些。”这种想法有道理,几句话还真说不清,那么不妨先讲一个与此有关的战斗小故事。

有些读者看到这里,心里会想“且慢,你凭什么说第三次握手后,长江肯定会收到?长江刚才的状态好,不代表后来的状态好,俗话说人算不如天算,我看再多握几次手会更可靠些”,这种想法有道理,但是呢,世界上不存在完全可靠的通信协议。如果这样一下担心对方收不到最后一条消息,那么这场战斗也永远打不起来。

总结下来就是两次是肯定不行的,因为长江会担心黄河是否收到了自己确认消息。而三次呢,双方都形成了闭环,最大程度上实现了可靠传输。

五,如果建立链接的第三次握手失败了怎么处理?关闭连接时,第四次握手失败怎么处理?

答:第三次握手其实解决了第二步的数据包丢失问题。那么第三步的ACK确认丢失后,TCP协议是如何处理的呢?按照TCP协议处理丢包的一般方法,服务器会重新向客户端发送数据包,直至收到ACK确认为止。但实际上这种做法有可能遭到SYN泛洪攻击。所谓的泛洪攻击,是指发送方伪造多个IP地址,模拟三次握手肚饿过程。当服务器返回ACK后,攻击方故意不确认,从而使得服务器不断重发ACK。由于服务器长时间处于半连接状态,最后消耗过多的CPU和内存资源导致死机。

正确的处理办法是服务器发送RST报文,进入CLOSE状态。这个RST数据包的TCP首部中,控制位中的RST位被设置为1.这表示链接信息全部被初始化,原有的TCP用心不能继续进行。客户端如果还想重新建立TCP链接,就必须重新开始第一次握手。

在关闭链接时,最后一个ACK丢失,实际上在第三步中,客户端收到FIN包时,它会设置一个计时器,等待相当长的一段时间,如果客户端返回的ACK丢失,那么服务器还会重发FIN并充值计时器。假设在计时器失效前服务器重发的FIN包没有到达客户端,客户端就会进入CLOSE状态,从而导致服务端永远无法收到ACK确认,也就无法关闭链接。

网络面试常见问题总结_TCP_06

这个关闭连接都是最后的ACK该怎么办 还是欠缺点什么~不是最终的解决方案,期待有会的大神~帮忙指点下哈~

六,TCP协议是如何进行流量控制,拥塞控制的?

答:

流量控制:(窗口大小)

发送端根据自己的实际情况发送数据。但是,接收端可能受到的是一个毫无关系的数据包又可能会在处理其他问题上花费一些时间,因此在为这个数据包做其他处理时会耗费一些时间。因此在为这个数据包做其他处理时会耗费一些时间,甚至在高负荷的情况下无法接受任何数据。如果一来,如果接收端将本应该接收的数据丢弃的话,就会触发重发机制,从而导致网络流量的无端浪费。

为了防止这种现象的发生,TCP提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量。这就是所谓的流量控制。它的具体操作是,接收端主机向发送端主机通知自己可以接收数据的大小。窗口大小的值就是由接收端主机决定的。

TCP首部中,专门有一个字段用来通知窗口的大小。接收主机将自己可以接收的缓冲区大小放入这个字段中通知给发送端。这个字段的值越大,说明网路偶的吞吐量越高。

不过,接收端的这个缓冲区一旦面临数据溢出时,窗口大小的值也会随之被设置为一个更小的值通知给发送端,从而控制数据发送量。也就是说,发送端主机会根据接收端主机的提示,对发送数据的量进行控制。这也行程了一个完整的TCP流控制(流量控制)。

网络面试常见问题总结_服务器_07

如上图,当接收端到3001号开始的数据后其缓冲区既满,不得不暂时停止数据接收。之后,在收到发送窗口更新通知后通信才得以继续进行。如果这个窗口的更新通知在传送途中丢失,可能会导致无法继续通信,为避免此类问题发生,发送端主机会时不时发送一个叫做窗口探测的数据段,此数据段仅为一个字节以获取最新的窗口大小信息。

拥塞控制:(拥塞窗口)

一般来说,计算机网络都处在一个共享的环境,因此也有可能会因为其他主机之间的通信使得网络拥堵。在网络出现拥堵时,如果突然发送与一个较大量的数据,极有可能会导致整个网络的瘫痪。

TCP为了防止该问题的出现,在通信一开始就会通过一个叫做慢启动的算法得出的数值,对发送数据量进行控制。

网络面试常见问题总结_TCP_08

首先,为了在发送端调节索要发送数据的量,定义了一个叫做“拥塞窗口”的概念。于是在慢启动的时候,将这个拥塞窗口的大小设置为1个数据段(1MSS)发送数据,之后每收到一次确认应答(ACK),拥塞窗口的值就加1.在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小做比较,然后按照他们当中较小那个值,发送比其还要小的数据量。

如果重发采用超时机制,那么拥塞窗口的初始值可以设置为1以后再进行慢启动修正。有了上述这些机制,就可以有效地减少通信开始时连续发包导致的网络拥堵,还可以避免网络拥塞情况的发生。

不过随着包的每次往返,拥塞窗口也会以1,2,4等指数函数的增长,拥堵情况激增甚至导致网络拥塞的发生。为了防止这些,引入了慢启动阈值的概念。只要拥塞窗口的值超出这个阈值,在每收到一次确认应答时,只允许以下面这种比例方法拥塞窗口:

网络面试常见问题总结_数据_09

网络面试常见问题总结_TCP_10

拥塞窗口越大,确认应答的数目也会增加。不过随着每收到一个确认应答,其涨幅也会逐渐减少,甚至效果比一个数据段还要小的字节数。因此,拥塞窗口的大小会呈直线上升的趋势。

TCP的通信开始时,并没有设置相应的慢启动阈值。而是在超时重发时,才会设置为当时拥塞窗口一般的大小。

由重发确认应答而触发的高速重发与超时重发机制的处理多少有些不同。因为前者要求至少3次的确认应答数据段到达对方主机后才会触发,相比后者网络的拥堵要轻一些。

而由重复确认应答进行高速重发控制时,慢启动阈值的大小被设置为当时窗口大小的一半。然后将窗口的大小设置为该慢启动阈值+3个数据段的大小。

有了这样一种控制,TCP的拥塞窗口如上图所示发生变化。由于窗口的大小会直接影响数据被转发的吞吐量,所以一般情况下,窗口越大,越会形成高吞吐量的通信。

当TCP通信开售以后,网络吞吐量会逐渐上升,但是随着网络拥堵的发生吞吐量也会急速下降。于是会再次进入吞吐量慢慢上升的过程。因此所谓TCP的吞吐量的特点就好像是在逐步占领网络宽带的感觉。

七,路由器和交换机的工作原理大概是什么?他们分别用到什么协议?位于哪一层?

答:

交换机:

3层交换机在二层的基础上支持如静态路由,RIP,OSPF,ISIS,BGP等路由协议,有时候会要求支持MPLS,GRE,L2TP,IPSec等隧道协议。

2层交换机/网桥工作在数据链路层,3层交换机/路由器工作在网络层,4-7层交换机工作在应用层。

网络面试常见问题总结_服务器_11

网络面试常见问题总结_TCP_12

网络面试常见问题总结_数据_13

2层交换机/网桥是在OSI模型的第2层-数据链路层面上链接两个网络的设备。数据链路的数据帧中有一个数据位叫做FCS,用以校验数据是否正确送达目的地。网桥通过检查这个域中的值,将那些损坏的数据丢弃,从而避免发送给其他的网段。此外,网桥还能通过地址自学机制和过滤功能控制网络流量。

网络面试常见问题总结_服务器_14

这里所说的地址是指MAC地址,硬件地址,物理地址以及适配器地址,也就是网络上针对NIC分配的具体地址。如下图所示,主机A与主机B之间进行通信时,只针对主机A发送数据帧即可。网桥会根据地址自学机制来判断是否需要转发数据帧。这类功能是OSI参考模型的第2层数据链路层所具有的功能。为此,有时候也罢网桥称作2层交换机。

网络面试常见问题总结_数据_15

有些网桥能够判断是否将数据报文转发给相邻的网段,这种网桥被称作自学式网桥。这类网桥会记住曾经通过自己发转发的数据帧的MAC地址,并保存到自己里的内存表李。由此可以判断哪个网段中包含持有哪类MAC地址的设备。

3层交换机具有路由器的功能,网络层面上链接两个网络,并对分组报文进行转发的设备,网桥是根据物理地址(Mac地址)进行处理,而路由器/3层交换机则是根据IP地址进行处理的。

网络面试常见问题总结_数据_16

4-7层交换机:负责处理OSI模型中从传输层至应用层的数据。如果用TCP/IP分层模型来表述,4-7层交换机就是以TCP等协议的传输层及其上面的应用层为基础,分析手法数据,并对其进行特定的处理。

例如:对于并发访问量非常打的一个企业级Web站点,使用一台服务器不足以满足前端的访问需要,这时通常会假设多态服务器来分担,这些服务器前端访问的入口地址通常只有一个(企业为了使用者的方便,只会向最终的用户开放一个统一的访问URL)。为了能通过同一个URL将前端访问分发到后台多个服务器上,可以在这些服务器的前端加一个负载均衡器。这种负载均衡器就是4-7层交换机的一种。

网络面试常见问题总结_服务器_17

此外,实际通信当中,人们希望在网络比较拥堵的时候,优先处理像语音这类对及时性要求较高的通信请求,放缓处理像邮件或数据转发等稍有延迟也并无大碍的通信请求,这种处理被称为宽带控制,也是4-7层交换机的重要功能,还有其他很多功能,例如广域网加速器,特殊应用访问加速以及防火墙等。


路由器:

工作在网络层。

人们根据路由控制的范围常使用IGP和EGP两种类型的路由协议。IGP称为内部网关协议,EGP称为外部网关协议。而IGP还包括RIP(路由信息协议)和OSPF(开放式最短路径优先协议)等协议。而EGP使用的是BGP(边界网关协议)协议。

上面说了3层交换机具有路由器的功能,但是3层交换机只不过具备了一些基本的路由功能,3层交换机的主要功能仍是数据交换。还是有差别的,接下来讨论下路由器。

路由器是由路由器连接的网络组合而成的。为了能让数据包正确达到目的地主机,路由器必须在途中进行正确的转发。这种正确的方向转发数据所进行的处理就叫做路由控制或路由。

路由器根据路由控制表转发数据包。它根据所受到的数据包中目标主机的IP地址与路由控制表的比较得出下一个应该接收的路由器。因此,这个过程路由控制表的记录一定要正确无误。

往深处挖路由器的协议就够一大片博客了,在这里不多做讨论,有兴趣可以细细研究一下,好了 写太久太累了,歇会~