计算机网络面试Study Notes 程序员

计算机网络面试知识点总结

2016-09-17  本文已影响3175人  Mr希灵

1. 基础知识

1.1 3种常见的计算机体系结构划分

OSI分层(7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP分层(4层):网络接口层、网际层、运输层、应用层。
五层协议(5层):物理层、数据链路层、网络层、运输层、应用层。

每一层的作用如下:

1.2 常见的网络协议

网络层

传输层

应用层

2. 网际协议IP

IP协议的特点

2.1 IP首部

普通的IP首部长20个字节(不包含选项字段),包含协议版本号、首部长度、总长度、唯一标识、TTL、首部检验和、源IP地址和目的IP地址。


2.2 IP地址

IP地址一般有网络号和主机号组成(D类和E类无此分法)。网络号标志主机(或路由器)所连接到的网络,主机号则标志该网络下的主机或路由器。

由于一个路由器至少应当连接到两个网络(这样它才能将IP数据报从一个网络转发到另一个网络),因此一个路由器至少应当有两个不同的IP地址。路由器只根据目的站的IP地址的网络号进行路由选择。

上图中的A类、B类、C类地址都是单播地址(一对一通信),是最常用的。网络号字段的最前面有1-4位的类别位。其中有两个特殊的IP地址,主机号全为0的IP地址代表网络地址,主机号全为1的IP地址为广播地址。当向某个网络的广播地址发送消息时,该网络内的所有主机都能收到该广播消息。

A类地址:以0开头,第一个字节范围:0~127;
B类地址:以10开头,第一个字节范围:128~191;
C类地址:以110开头,第一个字节范围:192~223;
D类地址:以1110开头,第一个字节范围为224~239;

3个特殊的IP地址

2.3 划分子网

划分子网的方法是从主机号借用若干个位作为子网号subnet-id,而主机号host-id 也就相应减少了若干个位。于是两级IP地址在本单位内部就变为三级IP地址:网络号、子网号和主机号。

IP地址 ::= {<网络号>, <子网号>, <主机号>}

子网对外部路由器来说隐藏了内部网络组织的细节,在外部看来,不同子网的主机仍属于同一个网络。

凡是从其他网络发送给本单位某个主机的IP数据报,仍然是根据IP数据报的目的网络号net-id,先找到连接在本单位网络上的路由器。然后此路由器在收到 IP 数据报后,再按目的网络号 net-id 和子网号 subnet-id 找到目的子网。最后就将 IP 数据报直接交付目的主机。

如何正确地区分子网号和主机号是一个问题,这可以通过子网掩码来确定。将网络号和子网号全设为1的IP地址为子网掩码。给定IP地址和子网掩码以后,主机就可以确定IP数据报的目的地是本子网的主机,本网络中其他子网的主机,还是其他网络的主机。

2.4 ARP协议与RARP协议

RAP为IP地址到对应硬件地址之间提供动态映射;RARP则相反。RAP高效运行的关键是由于每个主机上都有一个RAP高速缓存,来存放最近Internet地址到硬件地址之间的映射记录。

ARP协议的工作原理

  1. 首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。
  2. 当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机 MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有源主机IP地址、源主机MAC地址、目的主机的IP地址。
  3. 当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC 地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址。
  4. 源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到 ARP响应数据包,表示ARP查询失败。

2.5 ICMP(Internet控制报文协议)

ICMP是IP层的一个组成部分,它传递差错报文以及其他需要注意的信息。ICMP报文是在IP数据报内部(IP首部+ICMP报文)被传输的。ICMP报文由类型字段、代码字段、检验和和其他字节组成,前两个字段决定了ICMP报文的类型。

ICMP地址掩码请求,用于无盘系统在引导过程中获取自己自己的子网掩码。该ICMP报文的类型字段为17或18,代码字段为0,并返回32位子网掩码。

ICMP端口不可达差错,如果收到一份UDP数据报而目的端口与某个正在使用的进程不相符,那么UDP返回一个ICMP不可达报文。ICMP报文必须包括生成差错报文的数据报IP首部,还必须至少包括跟在该IP首部后面的前8个字节。

2.6 ping程序

ping程序的目的是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答。它只利用ICMP回显请求和回显应答报文,而不经过传输层。

ping 127.0.0.1环回地址时,如果不能ping通说明当前机器的TCP/IP协议栈有问题,127本身是一个虚接口,任何时候都是直接上交到内核中处理的。

ping 192.168.1.X 本机的以太网地址,则是测试本机的网络适配器(就是网卡啦),一般是以太网驱动程序。
ping这两个地址时你会发现,但使用wireshark抓包时,是没有ICMP的回显请求发出的,这说明这两个ping程序是不会发送到网络中的(只在局域网中)。

ping 同一网段中的网络地址,不通则说明网络线路出现了故障,如果网络中还存在路由器,则应该先ping路由器在本网络的地址,不通则是本机和路由器之间的线路有问题。通了,则再ping路由器所在目标计算机网络所在网段的端口IP地址,不通则说明了路由器出现了故障,通了就再ping目标主机的IP地址。

如果ping www.baidu.com等网络地址ping不通时,则说明本机的DNS服务器设置错误。

3. TCP协议

3.1 TCP服务的特点

TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。TCP通过以下方式来提供可靠性:

3.2 TCP的首部

TCP虽然是面向字节流的,但TCP传送的数据单元却是报文段。一个TCP报文段分为首部和数据两部分,而TCP的全部功能都体现在它首部中各字段的作用。因此,只有弄清TCP首部各字段的作用才能掌握TCP的工作原理。TCP报文首部固定部分各字段的意义如下:

  1. 源端口和目的端口
    各占两字节,分别写入源端口号和目的端口号。TCP的分用也是通过端口实现的。

  2. 报文段序号
    占4字节。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置,首部中的序号字段值则是指本报文所发送的数据的第一个字节的序号。

  3. 确认号
    期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则表明到序号N-1为止的所有数据都已正确收到。

  4. 数据偏移
    指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,实际上指出了TCP报文段的首部长度。

  5. 6个控制位
    确认ACK:TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。
    复位RST:当RST=1时,表明TCP连接中出现严重错误,必须释放连接,然后再重新建立运输连接。
    同步SYN:在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使用SYN=1和ACK=1.
    终止FIN:用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

  6. 窗口
    窗口字段明确指出了现在允许对方发送的数据量,该值经常在动态变化着。例如,设确认号是701,窗口字段是1000。这就表明从701算起,发送此报文段的一方还有接收1000个字节数据的接收缓存空间。

3.3 TCP连接的建立与终止过程

三次握手
第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

四次握手
与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次握手”。
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。(与SYN相同,一个FIN占用一个序号)。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

TCP的半关闭
TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力,这就是半关闭。为了使用这一特性,编程接口必须为应用程序提供一中方式来说明“我们已经完成了数据传送,因此发送一个文件结束(FIN)给另一端,但我还想接收另一端的数据,直到它给我发送文件结束FIN”。

2MSL等待状态
TIME_WAIT状态也称为2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生存时间MSL,它是任何报文段被丢弃前在网络内的最长时间(RFC指出其为2min,实现中常用值还有30s和1min)。当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的2倍的MSL;这样可让TCP再次发送最后的ACK以防这个ACK丢失(另一方超时并重发最后的FIN)。

3.4 使用UDP和TCP的场景

UDP的典型应用:实时性,不需要重传机制,局域网(本身网络稳定性高)

TCP对应的协议

  1. FTP:定义了文件传输协议,使用21端口。常说某某计算机开了FTP服务便是启动了文件传输服务。下载文件,上传主页,都要用到FTP服务。
  2. Telnet:它是一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上,通过这种端口可以提供一种基于DOS模式下的通信服务。如以前的BBS是-纯字符界面的,支持BBS的服务器将23端口打开,对外提供服务。
  3. SMTP:定义了简单邮件传送协议,现在很多邮件服务器都用的是这个协议,用于发送邮件。如常见的免费邮件服务中用的就是这个邮件服务端口,所以在电子邮件设置-中常看到有这么SMTP端口设置这个栏,服务器开放的是25号端口。
  4. POP3:它是和SMTP对应,POP3用于接收邮件。通常情况下,POP3协议所用的是110端口。也是说,只要你有相应的使用POP3协议的程序(例如Fo-xmail或Outlook),就可以不以Web方式登陆进邮箱界面,直接用邮件程序就可以收到邮件(如是163邮箱就没有必要先进入网易网站,再进入自己的邮-箱来收信)。
  5. HTTP协议:是从Web服务器传输超文本到本地浏览器的传送协议。

UDP对应的协议

  1. DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
    DNS工作原理:当DNS客户机需要在程序中使用名称时,它会查询DNS服务器来解析该名称。客户机发送的每条查询信息包括三条信息:包括:指定的DNS域名,指定的查询类型,DNS域名的指定类别。该应用一般不直接为用户使用,而是为其他应用服务,如HTTP,SMTP等在其中需要完成主机名到IP地址的转换。
  2. SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
  3. TFTP(Trival File Transfer Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。

4. 超文本传送协议HTTP

HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。HTTP协议的主要特点可概括如下:

4.1 浏览网页的过程

浏览网页的过程其实就是浏览器作为一个浏览的“客户端”,向服务器端发送了 一次请求,把服务器端的文件“抓”到本地,再进行解释、展现。

4.2 统一资源定位符URL

URL是用来表示从因特网上得到的资源位置和访问这些资源的方法。URL给资源的位置提供一种抽象的识别方法,并用这种方法给资源定位。只要能够对资源定位,系统就可以对资源进行各种操作,如存取、更新、替换和查找其属性。URL相当于一个文件名在网络范围的扩展。因此,URL是与因特网相连的机器上的任何可访问对象的指针。由于访问不同对象使用的协议不同,URL还能之处读取某个对象时所使用的协议。URL的一般形式为:

 <协议>://<主机>:<端口>/<路径>

协议是指用哪种协议获取该万维网文档,如http,ftp;主机是指该网络文档所在主机的域名;端口和路径有时可以省略。对万维网的网点访问使用HTTP协议,HTTP的默认端口号是80,通常可省略。若在省略文件的路径,则URL就指到因特网上的某个主页。如: www.baidu.com

4.3 HTTP请求报文

HTTP规定在HTTP客户与HTTP服务器之间的每次交互,都由一个ASCII码串构成的请求和一个“MIME-like”的响应组成,HTTP报文通常都使用TCP连接传送。HTTP有两类报文:请求报文(从客户向服务器发送请求报文)和响应报文(从服务器到客户的回答)。HTTP请求报文和响应报文都是由三部分组成,两种报文格式的区别就是开始行不同。

  1. 开始行 用于区分是请求报文还是响应报文。开始行在两种报文中分别叫请求行状态行
  2. 首部行 用来说明浏览器或报文主题的一些信息。
  3. 实体主体 在请求报文中一般不用该字段,而在响应报文中也可能没有该字段。

请求行只有三个内容,即方法、请求资源URL和HTTP的版本。下表给出了请求报文中常用的几种方法。
GET:请求读取由URL所标志的信息。
POST:给服务器添加信息(如注释)。
HEAD:请求获取由Request-URI所标识的资源的响应消息报头。
PUT:在给定的URL下存储一个文档。
DELETE:删除给定的URL所标志的资源。

GET方法,在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源。POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。POST与GET的区别如下:

GET http://www.bilibili.com/video/douga.html  HTTP/1.1

下面是一个请求报文的例子


请求报文

HTTP响应报文

在接收和解释请求消息后,服务器返回一个HTTP响应消息。HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文。状态行格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF

其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求

常见状态代码、状态描述、说明:

200 OK      //客户端请求成功
400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
403 Forbidden  //服务器收到请求,但是拒绝提供服务
404 Not Found  //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

5. DNS域名系统

DNS是一中用于TCP/IP应用程序的分布式数据库,它提供域名到IP地址的转换。举例来说,如果你要访问域名math.stackexchange.com,首先要通过DNS查出它的IP地址是151.101.129.69 。

5.1 因特网的域名结构

因特网在命名时采用的是层次树状结构的命名方法。任何一个连接在因特网上的主机或路由器,都有一个唯一的层次结构的名字,即域名(domain name)。每一个域名都是有标号(label)序列组成,而各标号之间用点(小数点)隔开。如mail.cctv.com,这是中央电视台用于手法电子邮件的计算机的域名,它由三个标号组成,其中标号com是顶级域名,标号cctv是二级域名,标号mail是三级域名。

5.2 域名服务器

如果采用上述的树状结构,每一个节点都采用一个域名服务器,这样会使得域名服务器的数量太多,使域名服务器系统的运行效率降低。所以在DNS中,采用划分区的方法来解决。

一个服务器所负责管辖(或有权限)的范围叫做区(zone)。各单位根据具体情况来划分自己管辖范围的区。但在一个区中的所有节点必须是能够连通的。每一个区设置相应的权限域名服务器,用来保存该区中的所有主机到域名IP地址的映射。总之,DNS服务器的管辖范围不是以“域”为单位,而是以“区”为单位。区是DNS服务器实际管辖的范围。区 <= 域。

因特网上的DNS服务器也是按照层次安排的。每一个域名服务器只对域名体系中的一部分进行管辖。根据域名服务器所起的作用,可以把域名服务器划分为下面四种不同的类型。

5.3 域名的解析过程

主机向本地域名服务器的查询一般都是采用递归查询。所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。

本地域名服务器向根域名服务器的查询的迭代查询。迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。

下面举一个例子演示整个查询过程:
假定域名为m.xyz.com的主机想知道另一个主机y.abc.com的IP地址。例如,主机m.xyz.com打算发送邮件给y.abc.com。这时就必须知道主机y.abc.com的IP地址。下面是上图a的几个查询步骤:

  1. 主机m.abc.com先向本地服务器dns.xyz.com进行递归查询。
  2. 本地服务器采用迭代查询。它先向一个根域名服务器查询。
  3. 根域名服务器告诉本地服务器,下一次应查询的顶级域名服务器dns.com的IP地址。
  4. 本地域名服务器向顶级域名服务器dns.com进行查询。
  5. 顶级域名服务器dns.com告诉本地域名服务器,下一步应查询的权限服务器dns.abc.com的IP地址。
  6. 本地域名服务器向权限域名服务器dns.abc.com进行查询。
  7. 权限域名服务器dns.abc.com告诉本地域名服务器,所查询的主机的IP地址。
  8. 本地域名服务器最后把查询结果告诉m.xyz.com。

整个查询过程共用到了8个UDP报文。

为了提高DNS查询效率,并减轻服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛使用了高速缓存,用来存放最近查询过的域名以及从何处获得域名映射信息的记录。例如,在上面的查询过程中,如果在m.xyz.com的主机上不久前已经有用户查询过y.abc.com的IP地址,那么本地域名服务器就不必向根域名服务器重新查询y.abc.com的IP地址,而是直接把告诉缓存中存放的上次查询结果(即y.abc.com的IP地址)告诉用户。

6. 面试题精选

例题1:TCP和UDP有什么区别?

TCP是传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器批次交换数据前,必须建立TCP连接之后才能传输数据。TCP提供超时重传、丢弃重复数据、流量控制等功能,保证数据能从一端传到另一端。

UDP是用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,不保证数据能够到达目的地。由于UDP在传输数据前不用在客户和服务器之间建立连接,且没有超时重传等机制,故而传输速度很快。

例题2:TCP的可靠性如何保证?

TCP的可靠性是通过顺序编号和确认(ACK)来实现的。

例题3:在浏览器中输入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数据包到达服务器的地址。

例题4:牛客网由于访问客户量的增长,原来的服务器不足以维持请求,经常发生宕机的突发情况,因此为了解决这个问题,CEO决定新增加几台服务器,那么问题是这些接入WEB服务器第一次被访问到时,不同协议的发生顺序是下面中的(ARP -> DNS -> HTTP)。

解析:当你给WEB服务器接上网线的时候,它会自动发送一条ARP信息,使得接入网关能找的到它;网关上会形成一条MAC地址到IP地址的映射记录。如用户在浏览器中输入域名,如本地DNS缓存中没有,必然会进行一次DNS查询,以确定该域名的IP地址。获得DNS对应的IP地址以后,使用HTTP协议访问web服务器(不考虑TCP三次握手建立连接的阶段)。

例题5:将一个C类网络划分为3个子网,每个子网最少要容纳55台主机,使用的子网掩码是?(2017乐视实习生)

答:255.255.255.192

例题5:IP路由表包括哪几项内容?

IP路由表通常包括三项内容,他们是子网掩码、目的网络地址、到目的网络路径上“下一个”路由器的地址

上一篇下一篇

猜你喜欢

热点阅读