写在最前面:本文章所有内容是本人从网络上以及《计算机网络第七版整理》整理而得,内容非原创~


另一部分参见:计算机网络面试常考总结(一)



简述DNS域名系统及其工作原理。

DNS:Domain Name System,域名系统,是互联网使用的命名系统,用来便于把人们使用的机器名字转换为IP地址。

5d3a5c6a9457872609如上图,m.xyz.com需要查找y.abc.com的IP地址:

  • 主机m.xyz.com向本地域名服务器进行递归查询。

    主机向本地域名服务器查询时一般使用递归查询。

    • 递归查询:就是如果本地域名服务器没有所需域名的IP地址,本地域名服务器就以客户的方式向其他根域名服务器继续查询,而不是主机自己进行查询。

    本地域名服务器向其他根域名服务器进行查询的时一般使用迭代查询。

    • 迭代查询: 当某个根域名服务器收到本地域名服务器的请求报文时,要么告诉它所需域名的IP地址,要么告诉它下一步应该向哪个服务器发起询问。然后让本地域名服务器自己去查询。
  • 本地域名服务器迭代查询,先向一个根域名服务器查询。

  • 根域名服务器告诉本地域名服务器,下一步应该向顶级域名服务器dns.com查询。

  • 顶级域名服务器dns.com告诉本地域名服务器,下一步查找权限域名服务器:dns.adc.com。

  • 本地域名服务器向权限域名服务器发起查询。权限域名服务器告诉本地服务器所需的IP地址,本地服务器在告诉给本地主机。

补充——域名服务器的分类:

  • 根域名服务器: 最高层也是最重要的域名服务器,所有的根域名服务器都知道所有的顶级域名服务器的域名地址和IP地址。例如:a.rootserver.net。

  • 顶级域名服务器: 这些域名服务器负责管理在该顶级域名服务器上注册的所有的二级域名。例如:com

  • 权限域名服务器: 负责一个区的域名服务器,如果当前权限域名服务器不能给出所需的IP地址,则返回客户应该找哪一个权限服务器。

  • 本地域名服务器: 本地DNS一般是指你电脑上网时IPv4或者IPv6设置中填写的那个DNS。这个有可能是手工指定的或者是DHCP自动分配的。当一台主机发送DNS请求报文时,这个查询报文就发送给本地域名服务器。


简述HTTP协议以及一次HTTP操作的。

HTTP 是面向事务的(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。

  • HTTP 是面向事务的客户服务器协议。

  • HTTP 1.0 协议是无状态的(stateless)。

  • HTTP 协议本身也是无连接的,虽然它使用了面向连接的 TCP 向上提供的服务。

5d3e522382fd145179

一次HTTP操作的过程:

  • 浏览器分析超链指向页面的 URL。

  • 浏览器向 DNS 请求解析 www.tsinghua.edu.cn 的 IP 地址。

  • 域名系统 DNS 解析出清华大学服务器的 IP 地址。

  • 浏览器与服务器建立 TCP 连接

  • 浏览器发出取文件命令:GET /chn/yxsz/index.htm。

  • 服务器给出响应,把文件 index.htm 发给浏览器。

  • TCP 连接释放。

  • 浏览器显示“清华大学院系设置”文件 index.htm 中的所有文本。


HTTP报文的格式?

HTTP报文分为两类:请求报文和响应报文。它们都由三部分组成:开始行、首部行、实体主体。区别就是开始行不同。

5d3e5c39f101f64538

  • 首部行: 用来说明服务器、浏览器、或报文主体的一些信息。

  • 实体主体: 一般不用。

  • 开始行:对于请求报文来说,就是请求行。对于响应报文来说,就是状态行。

    请求行: 包括三个内容:方法,URL以及HTTP的版本。后面有关于方法的详解。

    状态行: 包括三个内容:HTTP版本、状态码以及状态码的简单短语。后面有关于状态码的详解。


HTTP请求报文中的方法有哪些?

5d3e537d38ae253055


HTTP1.0、HTTP1.1和HTTP2.0的区别?

原博文——HTTP各版本之间的区别

HTTP1.0与HTTP1.1区别:

HTTP1.0最早在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上,而HTTP1.1则在1999年才开始广泛应用于现在的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为广泛的HTTP协议。 主要区别主要体现在:

  • 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

  • 带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。

  • 错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

  • Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。

  • 长连接、持续连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。

HTTP1.1与HTTP2.0的区别:

  • 新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。

  • 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。

  • header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。

  • 服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能


HTTP的状态码以及代表的意思?

原博文——常见的14种HTTP状态码

1XX——表示通知信息,如请求收到了或正在进行处理

2XX——表明请求被正常处理了

  • 200 OK:请求已正常处理。

  • 204 No Content:请求处理成功,但没有任何资源可以返回给客户端,一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。

  • 206 Partial Content:是对资源某一部分的请求,该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。

3XX——表明浏览器需要执行某些特殊的处理以正确处理请求

  • 301 Moved Permanently:资源的uri已更新,你也更新下你的书签引用吧。永久性重定向,请求的资源已经被分配了新的URI,以后应使用资源现在所指的URI。

  • 302 Found:资源的URI已临时定位到其他位置了,姑且算你已经知道了这个情况了。临时性重定向。和301相似,但302代表的资源不是永久性移动,只是临时性性质的。换句话说,已移动的资源对应的URI将来还有可能发生改变。

  • 303 See Other:资源的URI已更新,你是否能临时按新的URI访问。该状态码表示由于请求对应的资源存在着另一个URL,应使用GET方法定向获取请求的资源。303状态码和302状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源,这点与302状态码有区别。当301,302,303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。

  • 304 Not Modified:资源已找到,但未符合条件请求。该状态码表示客户端发送附带条件的请求时(采用GET方法的请求报文中包含If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since中任一首部)服务端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回304。

  • 307 Temporary Redirect:临时重定向。与302有相同的含义。

4XX——表明客户端是发生错误的原因所在。

  • 400 Bad Request:服务器端无法理解客户端发送的请求,请求报文中可能存在语法错误。

  • 401 Unauthorized:该状态码表示发送的请求需要有通过HTTP认证(BASIC认证,DIGEST认证)的认证信息。

  • 403 Forbidden:不允许访问那个资源。该状态码表明对请求资源的访问被服务器拒绝了。(权限,未授权IP等)

  • 404 Not Found:服务器上没有请求的资源。路径错误等。

5XX——服务器本身发生错误

  • 500 Internal Server Error:貌似内部资源出故障了。该状态码表明服务器端在执行请求时发生了错误。也有可能是web应用存在bug或某些临时故障。

  • 503 Service Unavailable:抱歉,我现在正在忙着。该状态码表明服务器暂时处于超负载或正在停机维护,现在无法处理请求。


简述HTTPS以及实现过程。(为什么要使用HTTPS、HTTPS基本概念、加密方式、实现过程)

为什么需要HTTPS(HTTP Secure 或者 HTTP over SSL):

HTTP有很多安全漏洞

  • 通信使用明文(不加密),内容可能会被窃听。

  • 不验证通信方的身份,因此有可能遭遇伪装。

  • 无法证明报文的完整性,所以有可能已遭篡改。

也就是说:HTTP+加密+认证+完整性保护=HTTPS


HTTPS是身披SSL外壳的HTTP:

  • HTTPS并非是应用层的一种新协议。只是通信接口部分用SSL和TLS协议代替而已。

  • 通常情况下,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信。


加密方式:对称加密与非对称加密

  • 对称加密:加密和解密都是同一个密匙。

    对称加密速度快,适合Https加密算法,但是服务器和浏览器之间传递密钥的过程被人监听,相当明文传输。

  • 非对称加密:密钥成对出现,分为公钥和私钥,公钥加密需要私钥解密,私钥加密需要公钥解密。

    服务端只将公钥暴露,浏览器使用公钥对消息进行非对称加密,服务端用私钥解密。但是服务端向浏览器回复的时候,只能用私钥进行加密,浏览器只能用公钥解密。但是:公钥是所有人都知道的,所有人都可以读取服务端回复的消息来进行解密,所以解决不了服务端向浏览器传递消息

HTTPS加密方式:混合加密方式,对称加密与非对称加密结合使用。

  • 使用非对称加密方式安全地交换在稍后的共享密钥加密中要使用的密钥。

  • 确保交换的密钥是安全的前提下,使用共享密钥加密方式进行通信。


HTTPS工作流程:

5d3e9cdc64fcb16806

步骤 1: 客户端通过发送 Client Hello 报文开始 SSL 通信。报文中包含客户端支持的 SSL 的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)。

步骤 2: 服务器可进行 SSL 通信时,会以 Server Hello 报文作为应答。和客户端一样,在报文中包含 SSL 版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。

步骤 3: 之后服务器发送 Certificate 报文。报文中包含公开密钥证书。

步骤 4: 最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL 握手协商部分结束。

步骤 5: SSL 第一次握手结束之后,客户端以 Client Key Exchange 报文作为回应。报文中包含通信加密中使用的一种被称为 Pre-master secret 的随机密码串。该报文已用步骤 3 中的公开密钥进行加密。

步骤 6: 接着客户端继续发送 Change Cipher Spec 报文。该报文会提示服务器,在此报文之后的通信会采用 Pre-master secret 密钥加密。

步骤 7: 客户端发送 Finished 报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。

步骤 8: 服务器同样发送 Change Cipher Spec 报文。

步骤 9: 服务器同样发送 Finished 报文。

步骤 10: 服务器和客户端的 Finished 报文交换完毕之后,SSL 连接

就算建立完成。当然,通信会受到 SSL 的保护。从此处开始进行应用层协议的通信,即发送 HTTP 请求。

步骤 11: 应用层协议通信,即发送 HTTP 响应。

步骤 12: 最后由客户端断开连接。断开连接时,发送 close_notify 报文。上图做了一些省略,这步之后再发送 TCP FIN 报文来关闭与 TCP 的通信。


简述HTTPS与HTTP的区别?

原博文——HTTPS与HTTP的区别

HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

  • HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。

  • HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。

  • HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

  • HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。


IP数据报格式?

5d4234f6c54cb34330

IP数据报首部可以分为固定长度(20字节)和可选长度。固定长度是所有IP数据报所必须的。固定部分个字段的意义如下:

  • 版本: 占4位,指IP协议的版本,通信双方的协议版本必须一致。

  • 首部长度: 占4位,可表示的最大十进制数是15(1111)。它的单位是4字节(也就是32位),因此首部长度最小值为5(固定长度部分),可选长度最长为40字节。

  • 区分服务: 占8位,用来获得更好的服务。

  • 总长度: 占16位,首部和数据部分的总长度,单位为字节。因此IP数据报的最大长度为2^16-1。

  • 标识: 占16位。当数据报的长度超过网络的最大传送单元使,就给该数据报的所有分片赋值相同的标识,相同的标识字段的值使分片后的各数据报片能正确的重装成原来的数据报。

  • 标志: 占3位,但是只有两位具有意义。

    • 标记字段中的最低位记为MF。MF=1表示后面还有分片,MF=0表示这是最后一个分片。

    • 标志字段中间的一位记为DF,意思是能否分片,只有DF=0时才能分片。

  • <stron> 占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,数据片相对于初始位置的距离。单位是8字节。因此,除去最后一个数据片,每个数据片的长度都是8字节的倍数。</stron>

  • 生存时间: 占8位,TTL(Time To Live),单位为跳数,跳数表明该数据报至多能在互联网中经过多少个路由器,每经过一个路由器就减1。

  • 协议: 占8位,协议字段指出该数据报携带的数据是使用哪种协议,以便使目的主机的IP层知道应将数据部分上交给哪个协议进行处理。

    协议名 ICMP IGMP IP TCP EGP IGP UDP IPv6 ESP OSPF
    协议字段值 1 2 4 6 8 9 17 41 50 89
  • 首部校验和: 占16位,这个字段只检验数据报的首部,但是不包括数据部分。

    5d423d384cdf496110

    • 在发送方,先把数据报划分为许多16位的字的序列,并把校验和字段置为0,。

    • 用反码算术运算(从低位到高位计算,0+0等于0,0+1等于1,1+1等于0,但是要进1。)把所有的16位字相加后,将得到的反码写入校验和字段。

    • 接收方接收到数据报之后,将首部的所有16位字再使用反码运算相加一次,将得到的和取反码,即得出接收方的检验和的计算结果。如果结果全为0,则代表首部未发生变化,保留该数据报,反之则丢弃。

    参考:原码、补码、反码详解

  • 源地址: 占32位。

  • 目的地址: 占32位。


UDP数据报格式?

原博文——UDP数据报格式

UDP用户数据报分为 = 首部字段 (8个字节,4个字段,每个字段2个字节)+ 数字字段。

首部字段:

  • 源端口: 源端口号。在需要对方回信的时候选用,不需要填0。

  • 目的端口: 目的端口号。必填。

  • 长度: UDP用户数据报的长度。最小为8。

  • 检验和:检测UDP用户数据报传输过程中是否有错。有错就丢弃。

5d3524ef4841844167

补充:UDP检验首部校验和的方法:

在计算检验和时,需要在用户数据报之前加12字节的伪首部。

所谓伪首部,是指他并不是UDP用户数据报的真正首部,只是在计算检验和的时候,临时加上的,检验和就是按照这个临时的用户数据报计算的。既不下传也不向上提交。伪首部的格式如上图。

UDP计算检验和与IP数据报类似,只是UDP的首部校验和把首部和数据一起都检验了。步骤如下:

  • 在发送方,首先先把全零放到检验和字段;

  • 再把伪首部和UDP用户数据报看成是由许多16位的字串连接起来的;

  • 然后按二进制反码计算出这些16位字的和,并将此和的反码写入检验和字段后,就发送这样的用户数据报。

  • 在接收方,把收到的UDP用户数据报连同伪首部(以及可能的填充全零字节)一起,按二进制反码求这些16位字的和。

  • 若无差错时其结果应全为1;否则就是有差错出现,可以选择丢失,可以上传(但是要附上错误信息)。

5d354dcc35e6338961


TCP报文段格式?

原博文——TCP报文首部格式

TCP虽然是面向字节流的,但是TCP传输的数据单元却是报文段。一个报文段可以分为首部和数据两部分。

TCP报文段的首部的前20个字节是固定的,后面的4n字节是需要增加的选项。因此TCP首部的最小长度是20字节。

5d356311a685317386)5d356311a685317386

首部部分字段的意义如下:

  • 源端口和目的端口:各占2个字节,分别写入源端口号和目的端口号。TCP的分用功能也是通过端口号实现的。

  • 序号:占4字节。在TCP连接中传送的字节流中的每一个字节都按照顺序编号。首部中的序号字段值则代表本报文段所发送的数据的第一个字节的序号。

  • 确认号:占4字节。代表期望收到对方下一个报文段的第一个数据字节的序号。需要注意:若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到

  • 数据偏移:占4位。他指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。一般情况下为20字节,但是首部中还有不确定的选项字段。它的单位是4字节,而它的最大值是15,因此数据偏移最大值为60字节,也就是说选项不能超过40字节。

  • 保留:占6位。以防后续使用。

    下面是6个控制位,每个占一位:

  • 紧急URG:当URG=1时,表明紧急字段有效,它告诉系统此报文中有紧急数据,应该尽快传送。

  • 确认ACK:仅当ACK=1时确认号字段才有效。

  • 推送PSH:当两个应用进程进行交互式的通信时,有时一端的应用进程希望在键入一个命令后立即就能收到对方的相应,这时设置PSH=1。

  • 复位RST:当RST=1时,表明TCP连接中出现严重错误,必须释放连接,再重新建立运输连接。RST=1还可以用来拒绝一个非法的报文段或拒绝打开一个连接。

  • 同步SYN:在建立连接时用来同步序号。当SYN=1,ACK=0时代表是连接请求报文段。若对方同意建立连接,则应在相应报文段中使SYN=1,ACK=1。也就是说,SYN=1代表连接请求或者连接接受报文。

  • 终止FIN。用于释放一个连接。当FIN=1时,代表此报文段的发送方的数据已发送完毕,并且请求释放运输连接。

    控制位到这结束。

  • 窗口:占2字节。窗口值告诉对方:从本报文段中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以设置这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其窗口大小的依据。

  • 检验和:占2字节。检验的范围包括首部字段和数据字段。和UDP检验的方法一样,只不过把伪首部第四个字段的17改成6.

  • 紧急指针:占2字节。只有在紧急URG=1时才有效,它指出本报文段中的紧急数据的字节数。

  • 选项:长度可变,最大40字节

    TCP最初只规定了一种选项,即最大报文长度MSS。MSS是每一个TCP报文段中的数据字段的最大长度,而并不是整个TCP报文段的长度。


以太网MAC帧格式?

5d424c85e043a98902

以太网MAC帧较为简单,由五个字段组成,前两个字段分别为6字节长的目的地址源地址。第三个字段是2字节的类型字段,用来标志上一层使用的是什么协议,以便把收到的MAC帧的数据上交给上一层的这个协议。第四个字段是数据字段,其长度为46~1500字节(46字节是因为最小长度64字节减去18字节的首部和尾部)。最后一个字段是4字节的帧检测序列FCS(使用CRC检测)。