本博文基本覆盖互联网公司关于网络协议的所有知识点,只要这里面的协议、算法、特性都好好记住,面试中的网络协议环节基本能够对答如流。
本博文所有内容均在面试中出现过,没有多余信息。
OSI分层(7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP分层(4层):网络接口层、网际层、运输层、应用层。
五层协议:物理层、数据链路层、网络层、运输层、应用层。
每一层对应的协议如下:
注:交换机位于数据链路层,路由器位于网络层。
每一层的作用:
TCP/IP协议簇其中比较重要的有SLIP协议、PPP协议、IP协议、ICMP协议、ARP协议、TCP协议、UDP协议、FTP协议、DNS协议、SMTP协议等,下面会挑几个比较重要的做详细介绍。
ICMP(Internet Control Message Protocol)协议,即Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
ping
命令(Win、Unix兼有)基于ICMP协议,用于测试网络通信情况。traceroute
(Unix)、tracert
(Win)基于ICMP协议,追踪路由路径。Windows ping
:
Microsoft Windows [版本 10.0.18362.900]
(c) 2019 Microsoft Corporation。保留所有权利。
C:\Users\wangh>ping www.baidu.com
正在 Ping www.a.shifen.com [182.61.200.6] 具有 32 字节的数据:
来自 182.61.200.6 的回复: 字节=32 时间=31ms TTL=44
来自 182.61.200.6 的回复: 字节=32 时间=32ms TTL=44
来自 182.61.200.6 的回复: 字节=32 时间=28ms TTL=44
来自 182.61.200.6 的回复: 字节=32 时间=29ms TTL=44
182.61.200.6 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 28ms,最长 = 32ms,平均 = 30ms
Windows tracert
C:\Users\wangh>tracert www.baidu.com
通过最多 30 个跃点跟踪
到 www.a.shifen.com [182.61.200.6] 的路由:
1 2 ms 1 ms <1 毫秒 192.168.1.1
2 13 ms 12 ms 24 ms 59.78.194.1
3 2 ms 2 ms 1 ms 10.100.120.1
4 3 ms 28 ms 6 ms 202.120.95.226
5 3 ms 2 ms 2 ms 202.120.95.254
6 18 ms 27 ms 27 ms 10.255.16.1
7 4 ms 17 ms 12 ms 10.255.249.253
8 3 ms 2 ms 2 ms 10.255.38.254
9 3 ms 3 ms 9 ms 202.112.27.1
10 10 ms 8 ms 7 ms 101.4.115.105
11 101 ms 22 ms 22 ms 101.4.117.30
12 32 ms 54 ms 48 ms 101.4.116.118
13 28 ms 30 ms 29 ms 101.4.112.69
14 43 ms 41 ms 72 ms 219.224.103.38
15 63 ms 69 ms 57 ms 101.4.130.38
16 49 ms 72 ms 37 ms 182.61.255.32
17 * 31 ms 31 ms 182.61.255.45
18 * * * 请求超时。
19 * * * 请求超时。
20 * * * 请求超时。
21 29 ms 34 ms 31 ms 182.61.200.6
跟踪完成。
Ubuntu ping:
steve@steve:~$ ping www.baidu.com -c 5
PING www.a.shifen.com (182.61.200.6) 56(84) bytes of data.
64 bytes from 182.61.200.6: icmp_seq=1 ttl=44 time=29.9 ms
64 bytes from 182.61.200.6: icmp_seq=2 ttl=44 time=30.8 ms
64 bytes from 182.61.200.6: icmp_seq=3 ttl=44 time=31.0 ms
64 bytes from 182.61.200.6: icmp_seq=4 ttl=44 time=31.0 ms
64 bytes from 182.61.200.6: icmp_seq=5 ttl=44 time=31.1 ms
--- www.a.shifen.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 29.927/30.797/31.119/0.455 ms
Ubuntu下的ping
指明了使用ICMP协议,过程中有icmp_seq
,即icmp_序列号
。
Ubuntu traceroute
steve@steve:~$ traceroute www.baidu.com
traceroute to www.baidu.com (182.61.200.6), 30 hops max, 60 byte packets
1 192.168.1.1 (192.168.1.1) 1.589 ms 3.941 ms 8.143 ms
2 59.78.194.1 (59.78.194.1) 44.159 ms 44.641 ms 44.782 ms
3 10.100.120.1 (10.100.120.1) 44.920 ms 45.046 ms 45.182 ms
4 202.120.95.226 (202.120.95.226) 45.355 ms 45.491 ms 45.642 ms
5 202.120.95.254 (202.120.95.254) 46.064 ms 46.206 ms 46.339 ms
6 10.255.16.1 (10.255.16.1) 46.721 ms 2.502 ms 2.763 ms
7 10.255.249.253 (10.255.249.253) 3.370 ms 3.736 ms 3.888 ms
8 10.255.38.254 (10.255.38.254) 4.078 ms 4.991 ms 5.415 ms
9 202.112.27.1 (202.112.27.1) 8.243 ms 8.379 ms 8.512 ms
10 101.4.115.105 (101.4.115.105) 5.502 ms 6.001 ms 6.751 ms
11 101.4.117.30 (101.4.117.30) 26.087 ms 26.196 ms 26.281 ms
12 * 101.4.116.118 (101.4.116.118) 26.735 ms 28.027 ms
13 101.4.112.69 (101.4.112.69) 30.100 ms 30.475 ms 31.273 ms
14 219.224.103.38 (219.224.103.38) 32.299 ms 32.602 ms 32.731 ms
15 101.4.130.38 (101.4.130.38) 33.548 ms 101.4.130.34 (101.4.130.34) 35.711 ms 101.4.130.38 (101.4.130.38) 33.663 ms
16 182.61.255.0 (182.61.255.0) 33.790 ms 182.61.255.2 (182.61.255.2) 29.172 ms 182.61.255.28 (182.61.255.28) 29.144 ms
17 182.61.255.51 (182.61.255.51) 45.775 ms 182.61.255.45 (182.61.255.45) 133.638 ms 133.732 ms
18 * * *
19 * * *
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
类型 | 面向连接 | 传输可靠性 | 传输形式 | 传输效率 | 所需资源 | 应用场景 | 首部字节 |
---|---|---|---|---|---|---|---|
TCP | 面向连接 | 可靠 | 字节流 | 慢 | 多 | 要求通讯数据可靠(文件传输、邮件传输) | 20-60 |
UDP | 无连接 | 不可靠 | 数据报文段 | 快 | 少 | 要求通信速度快(域名转换) | 8个字节 |
TCP提供面向连接的服务。数据传送之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播或者多播服务。
TCP的可靠性体现在传递数据之前,会有三次握手来建立连接,数据传递时,有确认、窗口、重传、拥塞控制机制,数据传送完毕后,还会有四次挥手断开链接。
UDP报文的最大长度为512字节,而TCP则允许长度超过512字节。当DNS查询超过512字节时,协议的TC标志出现删除标志,这时则使用TCP标志。通常UDP的报文不会大于512字节。
DNS同时占用UDP和TCP端口53,这种单个应用协议同时使用两种传输协议的情况在TCP/IP栈中也算另类。
DNS在进行区域传输(zone transfer)的时候使用TCP协议,其他时候使用UDP协议。
注:
辅域名服务器定时(一般3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动则执行一次区域传送,进行数据同步。区域传送将使用TCP而不是UDP,因为数据同步传送的数据量比一个请求和应答的数据量要多得多。
失效的连接请求的特殊情况:
采用三次握手是为了防止失效的连接请求报文段突然又传送到主机B,因而产生错误。考虑这样一种特殊情况,主机A第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到主机B,主机B以为是主机A又发起的新连接,于是主机B同意连接,并向主机A发送确认,但是此时主机A根本不会理会,主机B就一直在等待主机A发送数据,导致主机B的资源浪费。
三次握手的缺陷:
第二次握手时候会出现:SYN Timeout.
典型的Dos式攻击,向服务器发送大量的连接请求,在收到服务端的SYN报文后不作出任何响应,导致服务器开启了大量半连接资源耗尽。这时候如果有正常的客户端向服务发出第一次握手请求建立连接,会出现SYN Timeout的错误,因为服务器无法响应。
对比三次挥手和四次握手的过程,四次挥手多了一次的原因在于,客户端需要服务器发送两个确认报文,对应两个FIN-WAIT状态。这样设计的原因是:客户端需要等待服务器一段时间,服务器有可能在这段时间再发送一些数据。
(1) 为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL(Maxumum Segment Lifetime),而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。
(2) 等待已失效的报文段从网络中消失。客户端在发送最后一个ACK之后,再经过经过2MSL,就可以使本链接持续时间内所产生的所有报文段都从网络中消失。从保证在关闭连接后不会有还在网络中滞留的报文段去骚扰服务器。
服务器忙于读写,无法及时发送FIN-ACK报文。
⾃动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层和传输层的错误纠正协议之⼀。它通过使⽤确认和超时重传这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送⽅在发送后⼀段时间之内没有收到确认帧,它通常会重新发送。
ARQ包括停止等待ARQ协议和连续ARQ协议。
停止等待ARQ协议:基本原理时每发完一个分组就停止发送,等待对方确认。收到确认后再发下一个分组。
连续ARQ协议:指发送方维持着一个一定大小的发送窗口,位于发送窗口内的所有分组都可连续发送出去,而中途不需要等待对方的确认。这样信道的利用率就提高了。而发送方每收到一个确认就把发送窗口向前滑动一个分组的位置。
接收方一般都是采用积累确认的方式。这就是说,接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,这就表示:到这个分组为止的所有分组都已正确收到了。
发送端向网络一次连续写入的数据量,记为SWND
(Send Window,发送窗口)。由于发送端最终以TCP报文段来发送数据。这些TCP报文段的最大长度(仅数据部分)称为SMSS(Sender Maximum Segment Size,发送端最大段大小),其值一般等于MSS。
发送端需要选择合适大小的SWND
,如果SWND太小,会引起明显的网络延迟;反之,如果SWND
太大,则容易导致网络拥塞。所以还需要引入一个拥塞窗口(Congestion Window,CWND)的状态变量。
慢启动:
发送方维持一个拥塞窗口CWND
的状态变量。它的大小取决于网络的拥塞程度,并且在动态变化,发送方会让自己的发送窗口等于这个拥塞窗口。
发送方控制拥塞窗口的原则是:
(1) 只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去;
(2) 但只要网络出现拥塞,拥塞窗口就减小一些,以减小注入到网络中的分组数。
慢启动算法:由于不清楚网络状况,所以需要进行试探,将发送窗口逐渐增大,也即逐渐增大拥塞窗口的数值。在刚开始发送的时候,先把拥塞窗口CWND
设置为最大报文段MSS
,每收到一个对新报文段的确认后,就把拥塞窗口最多增加一个MSS
数值。这种逐步增大的方法可以使分组注入到网络的速率更加合理【指数增长】。
为了防止拥塞窗口过大引起网络拥塞,我们需要设置一个慢开始门限ssthreth
状态变量。当CWND
<ssthreth
时,使用慢开始算法;当CWND
>ssthreth
时,使用拥塞控制算法;如果两者相等,慢开始和拥塞控制都可以使用。
慢启动的“慢”并不是指CWND
增长速率慢而是说在TCP开始发送报文时,先设置CWND=1
,使发送端开始时只发送一个报文段进行探测。
拥塞避免:就是让拥塞窗口缓慢增大,即每经过一个往返时间RTT
就使CWND+1
,这种线性增长的速率慢很多。
只要发送方判断出网络拥塞,不论在慢开始还是拥塞控制阶段,都要把慢开始门限值设置为出现拥塞时发送窗口大小的一半,但不能小于2,然后CWND
重新设置为1,执行慢开始算法。
门限值减半,CWND
重置为1,目的是减少发送到网络中的分组数,使得发生拥塞的路由器能够有时间把队列中积压的分组处理掉。
发送端判断网络拥塞的依据:
(1) 传送超时,即TCP重传定时器溢出。
(2) 收到重复的确认报文。
快重传:快重传算法要求接收方每收到一个失序的报文段之后就立即发出重复确认,而不要等到自己发送数据才进行捎带确认。发送方只要收到3个同样的确认报文段就应当立即重传数据报,不必等到报文段的重传计时器到期。
快恢复:把慢开始门限减半,“乘法减小”,将CWND
设置为新的慢开始门限值,继续执行拥塞避免算法,加法增大。
相同点:提高网络性能。
不同:
2-5 包含协议:
IP:建立TCP协议时,需要发送数据,在网络层使用IP协议
ARP:路由器在与服务器通信时,需要将IP地址转化为MAC地址,该过程使用ARP协议
OSPF:IP数据包在路由器之间,路由器选择使用OSPF协议(类似协议有RIP协议、IGRP(cisco私有)、EIGRP(cisco私有)
TCP:与服务器建立连接
HTTP:TCP连接建立完成后,使用HTTP协议访问网页
浏览器缓存 → \rightarrow →系统缓存 → \rightarrow →路由器缓存 → \rightarrow →ISP DNS缓存 → \rightarrow →递归搜索
先从缓存里面找,找不到借助域名服务器执行递归搜索。
执行递归搜索时,先向本地域名服务器进行递归查询,如果没有,则从根域名服务器开始,按域名层级依次查找。
有些公司会问的很细,比如505是什么意思?
状态码 | 类别 | 原因短语 |
---|---|---|
1xx | Information(信息性状态码) | 接收的请求正在处理 |
2xx | Success(成功状态码) | 请求正常处理完毕 |
3xx | Redirection(重定向状态码) | 需要附加操作以完成请求 |
4xx | Clien Error(客户端错误状态码) | 服务器无法处理请求 |
5xx | Server Error(服务器错误状态码) | 服务器处理请求出错 |
全部状态码列表参见这里。
这里只列举面试常考的,但请注意,面试官非常也有可能问特别偏的,500开头的,即服务端错误要求全部记住。
状态码 | 英文名称 | 中文解释 |
---|---|---|
100 | Continue | 继续,客户端继续其请求。 |
200 | OK | 请求成功。 |
301 | Moved Permanently | 请求的资源已被永久移动到新的URI。 |
307 | Temporary Redirect | 临时重定向。 |
401 | Unauthorized | 进行的请求要求用户进行认证,未取得授权。 |
403 | Forbidden | 拒绝执行请求。 |
404 | Not Found | 请求的资源未找到。 |
500 | Internal Server Error | 服务器内部错误。 |
501 | Not implement | 当前所请求的功能还未实现。 |
502 | Bad Gateway | 网关或者代理服务器从远程服务器接收到了一个无效响应。 |
503 | Service Unavailable | 由于超载或者维护,服务器暂时无法处理请求。 |
504 | Gateway Time-out | 网关或者代理服务器接收远程服务器响应超时 |
505 | HTTP Version not supported | 服务器不支持请求的HTTP版本 |
使用Session和Cookies。
Cookies和Session都是用来跟踪浏览器用户身份的会话方式,应用场景不太一样。
Cookies一般用来保存用户信息:
(1)保存上次登录信息,下次自动填充;
(2)下次访问不需要重新登陆;
(3)登录一次网站后访问同网站其他页面不需要重新登录。
Session主要作用通过服务端记录用户的状态(典型场景购物车)。
Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。
Cookie 存储在客户端中,⽽Session存储在服务器上,相对来说 Session 安全性更⾼。如果要在Cookie 中存储⼀些敏感信息,不要直接写⼊ Cookie 中,最好能将 Cookie 信息加密然后使⽤到的时候再去服务器端解密。
长连接:HTTP/1.0使用短链接,每次请求都要建立一次连接;HTTP/1.1使用长连接,默认开启Conection: keep-alive
。持续连接分为流水线方式和非流水线方式。流水线是指,客户端在收到HTTP响应报文前就能接着发送新的请求报文;非流水线则是指客户端收到响应之后才能发送下一个请求。
HTTP/1.1新增了24个错误状态响应码。如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
缓存处理:HTTP/1.1新增了更多的缓存头来控制缓存控制策略。
带宽优化及网络连接的使用:HTTP/1.1允许只请求资源的某个部分,以此节省带宽。
推断数据传输是否达到了Content-Length
仅仅是判断大小。动态生成的文件没有Content-Length
,它是分块传输(chunked)。分块传输的数据最后会是一个空的chunked
块,表示本次传输的结束。
长链接的过期时间:
client的长链接不可能无限期的维持,有下面两种关闭长链接的方式:
Keep-Alive
指明timeout时间或者max最大事务数。服务器端推送的这些资源其实存在客户端的某处地方,客户端直接从本地加载这些资源就可以,不需要走网络,速度自然会快很多。
优点:能够在带宽资源充足的情况下同一时刻建立多个HTTP连接,加快页面的载入速度。
缺点:并行连接在带宽资源不足的情况下会使得连接竞争资源,效率反而下降。
同一时刻建立多条连接会大量消耗内存。
对server来说。大量的用户产生大量的连接可能会超过server的处理能力,因此server一般可以关闭来自特定client的超量连接。
优点:重用已对目标server打开的空暇持久连接,就能够避免缓慢的连接建立阶段。同一时刻,已经打开的连接还能够避免慢启动的拥塞适应阶段,以便更快地进行数据传输,
如今的web应用程序都是并行连接+持久连接。
能够在持久连接上使用的可选的请求管道。相当于流水线的功能。在回应到达之前,能够将多条请求放入队列。
管道化连接的限制:
新的请求可以在上次建立的TCP连接上发送,连接可以复用。
优点:减少重复进行TCP三次握手的开销,提高效率。
注意:在同一个TCP连接中,新的请求需要等上次请求收到相应后,才能发送。
HTTP/1.1协议中一共定义了八种方法(有时也叫"动作"),来表明Request-URL指定的资源不同的操作方式。
HTTP1.0定义了三种请求方法:GET
、POST
和HEAD
。
HTTP1.1新增了五种请求方法:OPTION
、PUT
、DELETE
、TRACE
和CONNECT
方法。
方法 | 描述 |
---|---|
GET | 请求指定的页面信息,并返回实体主体 |
HEAD | 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源建立和/或已有资源的修改。 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容 |
DELETE | 请求服务器删除指定的页面 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器 |
OPTIONS | 允许客户端查看服务器的性能 |
TRACE | 回显服务器收到的请求,主要用于测试或者诊断 |
[]
HTTP 响应报文由状态行、响应头部、空行和响应体 4 个部分组成。
[]
HTTPS(Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP协议,即HTTP协议的安全版。HTTPS是在HTTP的基础上与SSL/TLS协议结合起来的一种协议,保证了传输过程中的安全性,减少了被恶意劫持的可能。很好的解决了解决了http的三个缺点(被监听、被篡改、被伪装)。
HTTP存在三大风险:
SSL/TLS协议是为了解决这三大风险而设计的,他可以:
SSL/TLS协议位于TCP/IP协议与各种应用层之间,为数据通讯提供安全支持。
TCP/IP模型分四层:应用层,传输层,网络互联层,网络接口层。
SSL协议可以分为两层:
首先三次握手建立TCP连接,然后以以下步骤建立SSL/TLS连接
使用HTTPS之前需要确保服务端配置了对应的安全证书,握手阶段包含三次握手:
a
,发送请求到服务端,包含随机数a
,自己支持的加密协议,加密方法及版本,。b
。如果版本无法一致,服务端将关闭加密通信;如果达成一致,服务端发送随机数b
以及服务器证书,证书内含公匙,。c
,使用证书中的公匙加密,发送给服务器端。c
,随后以abc
三个随机数作为参数使用加密算法需要发送的数据加密。握手阶段完成,客户端与服务器进入加密通信,即完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。
abc
作为参数使用协商好的加密算法,对数据进行解密并且解析数据并呈现。HTTPS采用公开密匙加密(非对称加密)和共享密匙加密(对称加密)两者并用的混合加密。若密匙能够安全交换,那么有可能会考虑仅使用公开密匙加密来通信,但是这样的安全并不能保证。其次,公开密匙加密和共享密匙加密相比其处理速度要慢。
在该过程中,握手阶段客户端和服务端交换随机数c
时,是非对称加密(客户端公匙加密该随机数,服务端私钥解密),确保密匙无法被第三方获知。会话阶段,数据传输时加密使用的是对称加密(服务端和客户端都使用随机数私钥加密解密)。
HTTPS连接建立这样设计的理由是充分利用对称和非对称加密解密的优点,同时避开他们的缺点。在握手阶段,我们仅仅是要交换一下客户端生成的随机数,所以使用非对称加密保证绝对的安全;而在会话阶段我们要发送大量的数据,非对称加密代价很高,这个时候使用来对称加密提高加密速度。
常见的对称加密算法有DES
、3DES
、Blowfish
、IDEA
、RC4
、RC6
和AES
。
常见的非对称加密算法有RSA
、ECC
、Diffie-Hellman
、EI Gmaal
、DSA
。
JavaGuide面试突击版,百度可得最新版本,有删改修正和扩充。
HTTP1.0 HTTP 1.1 HTTP 2.0主要区别
HTTP请求方式中8种请求方法(简单介绍)
HTTPS 建立连接的详细过程
SSL/TLS协议运行机制的概述
http连接优化
HTTPS原理和通信流程
SSL协议到底工作在OSI模型中的哪一层?
《图解HTTP》-上野宣(日)著
DNS查找域名的过程
DNS域名解析使用的是TCP协议还是UDP协议?