面试知识点总结之网络基础知识

1. OSI的七层网络结构图

应用层、表示层、会话层、传输层、网络层、数据链路层、物理层;TCP/IP的五层结构图:应用层、传输层、网络层、数据链路层、物理层。

具体各层的协议、作用见校招面试计算机网络基础知识面试常考点

2. 请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实现的?

物理层是转发器(repeater),数据链路层是网桥或交换机(根据MAC地址寻址,通过站表选择路由,站表的建立和维护由交换机自动进行),网络层是路由器(router)(它根据IP地址进行寻址,通过路由表路由协议产生),网络层以上是网关(gateway)(网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。)

请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用? TCP与UDP呢?

IP是英文Internet Protocol的缩写,意思是“网络之间互连的协议”,也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守 IP协议就可以与因特网互连互通。正是因为有了IP协议,因特网才得以迅速发展成为世界上最大的、开放的计算机通信网络。因此,IP协议也可以叫做“因特网协议”。网络协议(IP)是网络上信息从一台计算机传递给另一台计算机的方法或者协议。网络上每台计算机(主机)至少具有一个IP地址将其与网络上其他计算机区别开。当你发送或者接受信息时(例如,一个电子邮件信息或一个网页),信息被分成几个小块,称为信息包。每个信息包都包含了发送者和接受者的网络地址。网关计算机读到了目的地址,信息包继续向前到下一个邻近的网关照例读到目的地址,如此一直向前通过网络,直到一个网关确认这个信息包属于其最紧邻或者其范围内的计算机。最终直接进入到其指定地址的计算机。 因为一个信息被分成了许多信息包,如果必要,每个信息包能够通过网络不同的路径发送。信息包能按照与它们发送时的不同顺序到达。网络协议(IP)仅仅是递送他们。IP是一个无连接协议,这就意味着在通信的终点之间没有连续的线路连接。每个信息包作为一个处理过的独立的单元在网络上传输,这些单元之间没有相互的联系。(信息包能放在正确的位置上是因为TCP明了信息中信息包顺序的面向连接协议。)

IP协议工作在网络层TCP UDP(用户数据报协议)工作在传输层。TCP保证提供可靠的交付,而UDP只能提供尽最大努力的交付。

具体IP协议及其他协议见校招面试计算机网络基础知识面试常考点

3. TCP和UDP的区别

1)TCP面向连接,发送数据之前要先建立连接(三次握手),UDP无连接,发送数据之前不需要建立连接

2)TCP提供可靠的连接,通过TCP传送的数据保证无差错和不丢包,UDP提供不可靠的连接,可能丢包

3)TCP面向字节流,UDP面向报文

4)TCP有拥塞控制,UDP没有,网络出现拥塞不会使源主机的发送速率降低

5)TCP要求系统资源较多,头部开销大(20个字节),UDP较少(8个字节)

6)TCP是点到点的连接,UDP支持一对一,一对多,多对一,多对多

4. DNS(Domain Name System,域名系统)

万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。每个IP地址都可以有一个主机名,主机名由一个或多个字符串组成,字符串之间用小数点隔开。有了主机名,就不要死记硬背每台IP设备的IP地址,只要记住相对直观有意义的主机名就行了。这就是DNS协议的功能。

在浏览器中输入www.baidu.com后执行的全部过程

1)客户端浏览器通过DNS解析到www.baidu.com的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.161.27.48,然后通过TCP进行封装数据包,输入到网络层。

2)在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。

3)客户端的网络层不用关系应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,我不作过多的描述,无非就是通过查找路由表决定通过那个路径到达服务器。

4)客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。

5. 进程和线程的区别:

1)进程(process)是一块包含了某些资源的内存区域,进程中所包含的一个或多个执行单元称为线程(thread)。

2)一个程序至少有一个进程,一个进程至少有一个线程。

3)进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。

6. 线程间通信:

1)为什么要进行线程间通信:多个线程并发执行时, 在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们希望他们有规律的执行, 那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据的目的,避免对同一共享变量的争夺。

2)什么是线程间通信,定义:多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作。就是多个线程在操作同一份数据时,避免对同一共享变量的争夺。由于线程没有独立的地址空间,多线程共享地址空间和数据空间,当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。

3)怎么做:等待唤醒机制:(wait()、notify())

就是在一个线程进行了规定操作后,就进入等待状态(wait), 等待其他线程执行完他们的指定代码过后 再将其唤醒(notify)

7. 线程间同步

所谓同步(synchronization)就是指一个线程访问数据时,其它线程不得对同一个数据进行访问,即同一时刻只能有一个线程访问该数据,当这一线程访问结束时其它线程才能对这它进行访问。同步最常见的方式就是使用锁(Lock),也称为线程锁。锁是一种非强制机制,每一个线程在访问数据或资源之前,首先试图获取(Acquire)锁,并在访问结束之后释放(Release)锁。在锁被占用时试图获取锁,线程会进入等待状态,直到锁被释放再次变为可用。

8. 进程通信:

进程间通信(IPC,Interprocess communication)是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能导致一个操作系统中多个进程的运行,进程之间必须互相通话。

进程间通信的8种方法:无名管道通信、高级管道通信、有名管道通信、消息队列通信、信号量通信、信号、共享内存通信、套接字通信

1)无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

2)高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。

3)有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

4)消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

5)信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

6)信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

7)共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

8)套接字( socket ) : 套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

9. 什么是socket

socket,即套接字是一种进程间通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行。也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信。

socket通信建立过程 :三次握手建立TCP连接,四次握手断开连接

详解见面试必考的计算机网络知识点梳理

1)三次握手

•客户端向服务器发送一个SYN J(调用connect函数)

•服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1(调用accept函数)

•客户端再向服务器发一个确认ACK K+1(connect返回,accept返回)

2)四次挥手

•某个应用进程首先调用close主动关闭连接,TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。

•服务器收到这个FIN,执行被动关闭,它发回一个ACK,对这个FIN进行确认,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。

• 服务器关闭客户端的连接,发送一个FIN给客户端。

•接收到这个FIN客户端发回ACK报文确认,并将确认序号设置为收到序号加1。

10. 为什么连接建立需要三次握手,而不是两次握手?

防止失效的连接请求报文段被服务端接收,从而产生错误。

PS:失效的连接请求:若客户端向服务端发送的连接请求丢失,客户端等待应答超时后就会再次发送连接请求,此时,上一个连接请求就是『失效的』。

若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态(打开),而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。

11. 为什么要四次挥手

因为TCP有个半关闭状态,假设A.B要释放连接,那么A发送一个释放连接报文给B,B收到后发送确认,这个时候A不发数据,但是B如果发数据A还是要接受,这叫半关闭。然后B还要发给A连接释放报文,然后A发确认,所以是4次。(服务端的ack和fin不能同时发送)

12. 为什么客户端要先进入TIME-WAIT状态,等待2MSL时间后才进入CLOSED状态?

为了保证服务端能收到客户端的确认应答。若客户端发完确认应答后直接进入CLOSED状态,那么如果该应答丢失,服务端等待超时后就会重新发送连接释放请求,但此时客户端已经关闭了,不会作出任何响应,因此服务端永远无法正常关闭。

猜你喜欢

转载自blog.csdn.net/u012991043/article/details/82556493