计算机网络面试八股至臻总结版,一文带你彻底搞懂计网面试!

一、应用层

01 http1.0、http1.1、https、http2、http3区别

http2.0如何实现多路复用

HTTP/2.0 通过引入多路复用技术来解决 HTTP/1.x 中的队头阻塞问题。在 HTTP/1.x 中,每一次请求都需要创建一个 TCP 连接并发送一个 HTTP 请求,在服务器处理完一个请求后再处理下一个请求,因此如果前面的请求耗时较长,就会导致后面的请求被阻塞。而 HTTP/2.0 通过将多个请求打包在一个 TCP 连接中,使得它们可以同时进行传输,从而避免了队头阻塞问题。

实现多路复用的关键是在一个 TCP 连接上建立多个逻辑流(stream),每个流都对应一个独立的请求-响应序列。在 HTTP/2.0 中,每个流都有一个唯一的标识符,可以用于区分不同的请求。所有的数据帧都被封装在流中,由于在一个 TCP 连接中可以同时存在多个流,所以多个数据帧就可以同时发送和接收。

具体来说,HTTP/2.0 多路复用的实现过程如下:

  1. 客户端与服务器建立一条 TCP 连接,并通过 TLS 加密保护连接安全。
  1. 在 TCP 连接之上,客户端和服务器之间维护多个逻辑流,每个流都有一个唯一的标识符。客户端和服务器可以在任何时候创建、关闭和取消流。
  1. 在一个逻辑流中,客户端和服务器可以交替地发送数据帧(DATA frame)和控制帧(CONTINUATION frame、HEADERS frame、PRIORITY frame、RST_STREAM frame、SETTINGS frame、WINDOW_UPDATE frame、PING frame、GOAWAY frame)。
  1. 数据帧用于传输请求和响应中的实体数据。由于可以在任何流中发送和接收数据帧,因此多个请求和响应可以同时进行传输,并且不会相互干扰。
  1. 控制帧用于传输 HTTP/2.0 协议的控制信息,例如请求头、状态码、优先级和窗口大小等。这些控制信息可以控制数据流的传输和调度,从而实现多路复用和更好的性能。

总之,HTTP/2.0 的多路复用技术通过将多个请求打包在一个 TCP 连接中,使得它们可以同时进行传输,从而避免了队头阻塞问题。在客户端和服务器之间维护多个逻辑流,以及使用数据帧和控制帧来传输请求和响应数据,是实现多路复用的关键所在。

http1.1为什么不能实现多路复用

HTTP/1.1 中的长连接(keep-alive)实现了一定的复用效果。通过在一个TCP连接上持久保持连接,可以避免每个请求都需要建立一次TCP连接,从而降低了建立和关闭TCP连接的开销,提高了性能。

但是,HTTP/1.1 的长连接只能实现串行的请求和响应,即客户端发送一个请求后,必须等到服务器返回相应的响应后才能发送下一个请求。这样就会导致队头阻塞等问题。

而 HTTP/2.0 的多路复用技术则可以在一个TCP连接中同时发送多个请求,让它们并行地进行处理。这样,即使某个请求需要等待服务器的响应时,其他的请求也可以继续进行传输,避免了队头阻塞问题,提升了性能。

此外,HTTP/1.1 中长连接的实现依赖于服务器和客户端的协商。如果服务器不支持长连接,或者客户端在请求中设置了Connection: close头部,则长连接无法生效,仍然需要每次建立新的TCP连接。而 HTTP/2.0 的多路复用技术则是作为协议规范的一部分,无需另外协商,且所有的 HTTP/2.0 客户端和服务器都支持多路复用。

http断点重传

HTTP断点续传是一种在网络不稳定或下载大文件的情况下比较实用的技术,底层的实现原理如下:

  1. 首先,客户端发送一个HTTP请求到服务端,请求下载某个文件,同时客户端在请求中加上一个Range头部参数。该参数指定了从哪个字节开始下载文件。例如, Range: bytes=1024-2047 表示从第1024个字节开始请求下载直到第2047个字节结束。
  1. 服务端接收到请求后会解析这个Range头部参数,然后将文件按照请求的范围进行切割,只返回请求的那个范围的字节数组给客户端。客户端接收到服务器返回的数据后根据Range的值进行拼接存储。
  1. 当文件下载过程中出现网络异常、中断等情况时,客户端就可以从上次下载中断的地方继续下载,只需要重新向服务端发送一次带有Range头部参数的请求。服务端会根据Range的值返回相应的字节数组。
  1. 客户端接收到服务端返回的数据后就可以把这些数据和之前缓存下来的数据进行拼接,来达到断点续传的目的。

总之,HTTP断点续传的核心就是利用HTTP协议中的Range头部参数来指定下载的起始点和结束点,然后服务端返回指定范围内的数据给客户端,客户端接收到数据后拼接,从而实现断点续传。

02 长连接与短连接

在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。

但从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:

Connection:keep-alive

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。

HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

参考链接

短连接的操作步骤是:

建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接

长连接的操作步骤是:

建立连接——数据传输…(保持连接)…数据传输——关闭连接

长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。

例 数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短链好

http如何实现长连接

HTTP/1.1中长连接是通过连接重用来实现的。在HTTP/1.0中,每个请求都需要建立一个新的TCP连接;在HTTP/1.1中,可以在同一个TCP连接上发送多个HTTP请求,并且这些请求可以按照顺序依次进行,而无需每次都建立一个新的TCP连接。

为了实现长连接,客户端和服务端需要在进行通信时遵循以下步骤:

  1. 客户端发起一个HTTP请求,并在请求头部中添加"Connection: keep-alive"字段,表示请求完成后仍然保持连接。
  1. 服务端收到请求后,在响应头部中添加"Connection: keep-alive"字段,表示响应完成后仍然保持连接。
  1. 接着客户端可以在同一个TCP连接上发送新的HTTP请求,服务端会根据请求的先后顺序依次处理并响应请求。
  1. 当客户端不再需要保持连接时,需要在请求头部中添加"Connection: close"字段,表示请求完成后关闭连接。

需要注意的是,虽然HTTP/1.1中支持长连接,但是长时间的连接可能会导致资源浪费和服务器负载过高。因此,HTTP/1.1中规定了一些连接的超时时限,如"Keep-Alive:timeout=xx",以确保连接不会一直占用资源。

总之,HTTP/1.1实现长连接是通过在请求和响应头部中添加=="Connection:keep-alive"字段==来实现的,让客户端和服务端保持TCP连接并复用该连接进行多次请求和响应。

http短连接长连接,tcp短连接长连接,二者的关系

HTTP和TCP的长连接与短连接是不同的概念,虽然它们之间存在一定的关系。

HTTP的长连接和短连接是指客户端和服务器之间建立的 HTTP 连接的持续时间。在 HTTP 短连接中,每个请求/响应都需要建立一个新的连接,而在 HTTP 长连接中,多个请求/响应可以复用一个 TCP/IP 连接。HTTP的长连接通过在请求和响应头部添加 "Connection: keep-alive" 字段实现。

TCP的长连接和短连接是指两台设备之间建立的 TCP 连接的持续时间。在 TCP 短连接中,每次数据传输完成后会关闭连接,而在 TCP 长连接中,可以保持连接状态进行多次数据传输。TCP的长连接是在 TCP 协议层面上实现的,与 HTTP 无关。

HTTP 协议是基于 TCP 协议的,它使用 TCP 协议作为传输层协议进行数据传输。因此,在短连接模式下,每个 HTTP 请求/响应都需要经历一次 TCP 连接的建立和关闭过程;而在长连接模式下,多个 HTTP 请求/响应可以在一个 TCP 连接上进行,从而减少了连接的建立和关闭次数,提高了传输效率。

总之,HTTP和TCP的长连接和短连接是不同的概念,HTTP的长连接和短连接是在应用层实现的,TCP的长连接和短连接是在传输层实现的。HTTP的长连接需要依赖TCP长连接来实现,而TCP长连接不一定是HTTP长连接。

03 GET与POST区别

HTTP协议中的GET和POST是两种常用的方法,用于在客户端和服务器之间传输数据。它们有以下几个区别:

  • 语义: GET方法用于从服务器获取资源,而POST方法用于向服务器提交数据。
  • 请求参数: GET方法将数据附加在URL的查询字符串中,以key=value的形式出现在URL中,可以直接在浏览器地址栏中看到。POST方法将数据封装在请求体中,不会出现在URL中。
  • 安全性: GET方法的数据暴露在URL中,不适合传输敏感信息,因为URL可能被浏览器保存、缓存和记录。POST方法的数据在请求体中,相对更安全一些,但仍然需要进行适当的加密和身份验证。
  • 数据长度: GET方法对发送的数据长度有限制,通常受浏览器或服务器的限制,因为GET请求的参数是通过URL传输的。POST方法没有固定的长度限制,可以发送较大的数据量。
  • 幂等性: GET方法是幂等的,重复请求多次对服务器产生的影响相同,不会改变服务器状态;而POST方法不是幂等的,多次重复请求可能导致服务器状态改变。
  • 书签及浏览器历史: 由于GET请求的数据出现在URL中,可以被用户书签化或浏览器保存为历史记录。POST请求不会在URL中显示,因此不适合直接书签化或存储为历史记录。
  • 缓存: GET请求可以被浏览器缓存,下次请求相同的URL时,可能直接返回缓存的数据。POST请求默认不被浏览器缓存。
  • 可见性: GET请求的参数会出现在URL中,可以直观地看到,而POST请求的参数不会显示在URL中,用户无法直接看到提交的数据。

04 https如何建立

TLS 协议建立的详细流程:

1. ClientHello

首先,由客户端向服务器发起加密通信请求,也就是 ClientHello 请求。

在这一步,客户端主要向服务器发送以下信息:

(1)客户端支持的 TLS 协议版本,如 TLS 1.2 版本。

(2)客户端生产的随机数(Client Random),后面用于生成「会话秘钥」条件之一。

(3)客户端支持的密码套件列表,如 RSA 加密算法。

2. SeverHello

服务器收到客户端请求后,向客户端发出响应,也就是 SeverHello。服务器回应的内容有如下内容:

(1)确认 TLS 协议版本,如果浏览器不支持,则关闭加密通信。

(2)服务器生产的随机数(Server Random),也是后面用于生产「会话秘钥」条件之一。

(3)确认的密码套件列表,如 RSA 加密算法。

(4)服务器的数字证书。

3.客户端回应

客户端收到服务器的回应之后,首先通过浏览器或者操作系统中的 CA 公钥,确认服务器的数字证书的真实性。

如果证书没有问题,客户端会从数字证书中取出服务器的公钥,然后使用它加密报文,向服务器发送如下信息:

(1)一个随机数(pre-master key)。该随机数会被服务器公钥加密。

(2)加密通信算法改变通知,表示随后的信息都将用「会话秘钥」加密通信。

(3)客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要,用来供服务端校验。

上面第一项的随机数是整个握手阶段的第三个随机数,会发给服务端,所以这个随机数客户端和服务端都是一样的。

服务器和客户端有了这三个随机数(Client Random、Server Random、pre-master key),接着就用双方协商的加密算法,各自生成本次通信的「会话秘钥」

4. 服务器的最后回应

服务器收到客户端的第三个随机数(pre-master key)之后,通过协商的加密算法,计算出本次通信的「会话秘钥」。

然后,向客户端发送最后的信息:

(1)加密通信算法改变通知,表示随后的信息都将用「会话秘钥」加密通信。

(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要,用来供客户端校验。

至此,整个 TLS 的握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的 HTTP 协议,只不过用「会话秘钥」加密内容。

05 http的方法和状态码

http方法

Host 字段   客户端发送请求时,用来指定服务器的域名。

Content-Length 字段    服务器在返回数据时,会有 Content-Length 字段,表明本次回应的数据长度。

Content-Type 字段       Content-Type 字段用于服务器回应时,告诉客户端,本次数据是什么格式。

GET 与 POST

状态码

1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。

2xx 类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。

  • 200 OK」是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。
  • 204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。
  • 206 Partial Content」是应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。

3xx 类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向

  • 301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用==新的 URL ==再次访问。
  • 302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。

301 和 302 都会在响应头里使用字段 Location,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。

  • 304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,也就是告诉客户端可以继续使用缓存资源,用于缓存控制。

4xx 类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。

  • 400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。
  • 403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
  • 404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。

5xx 类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。

  • 500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
  • 501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
  • 502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
  • 503 Service Unavailable」表示服务器当前很忙,暂时无法响应客户端,类似“网络服务正忙,请稍后重试”的意思。

06 http报文结构

http报文通常分为  请求报文 和 响应报文

HTTP 协议主要由三大部分组成:

  • 起始行(start line):描述请求或响应的基本信息;      请求方式  +  URL + 版本号    GETPOST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE
  • 头部字段(header):使用 key-value 形式更详细地说明报文;  格式为“属性名:属性值”,服务端根据请求头获取客户端的信息,主要有cookie、host、connection、accept-language、accept-encoding、user-agent
  • 消息正文(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。

其中起始行和头部字段并成为 请求头 或者 响应头,统称为 Header;消息正文也叫做实体,称为 body。HTTP 协议规定每次发送的报文必须要有 Header,但是可以没有 body,也就是说头信息是必须的,实体信息可以没有。而且在 header 和 body 之间必须要有一个空行(CRLF),如果用一幅图来表示一下的话,我觉得应该是下面这样

07 对称加密和非对称加密

对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密。对称加密只有一个秘钥,作为私钥。

常见的对称加密算法:DES,AES,3DES等等。

非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。

常见的非对称加密算法:RSA,ECC

08 https四次握手过程

客户端:

(1)TLS版本号

(2)随机数

(3)支持的密码套件列表

服务端:

(1)确认TLS版本

(2)随机数

(3)确认密码套件列表

(4)发送数字证书

客户端:

(1)收到证书,拿到公钥

(2)随机数   公钥加密

(3)加密通信算法改变  会话密钥

(4)摘要

服务端:

(1)拿到公钥  生成会话密钥

(2)加密算法改变通知

(3)摘要

09 cookie和session的区别

  • 作用范围不同,Cookie 保存在客户端,Session 保存在服务器端。
  • 有效期不同,Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭或者 Session 超时都会失效。
  • 隐私策略不同,Cookie 存储在客户端,容易被窃取;Session 存储在服务端,安全性相对 Cookie 要好一些。
  • 存储大小不同, 单个 Cookie 保存的数据不能超过 4K;对于 Session 来说存储没有上限,但出于对服务器的性能考虑,Session 内不要存放过多的数据,并且需要设置 Session 删除机制。

HTTP 协议本身是无状态的,也就是说它不能维护客户端和服务器之间的交互状态。为了解决这个问题,Web 应用程序通常会使用 cookie 或 session 来维护用户的登录状态等信息。

Cookie 和 Session 都是用来在服务器和客户端之间存储信息的机制,它们的底层实现原理如下:

  1. Cookie 的底层实现原理

Cookie 是在客户端(浏览器)中保存数据的一种机制,具体实现方式是在 HTTP 响应报文中添加 Set-Cookie 头部,然后在 HTTP 请求报文中添加 Cookie 头部,这样浏览器就会将 Cookie 信息存储在本地。

当客户端再次向服务器发送请求时,浏览器会自动将保存的 Cookie 信息添加到 HTTP 请求头中发送给服务器。服务器可以读取 Cookie 生命周期内保存的数据,从而实现对客户端的识别和跟踪。

  1. Session 的底层实现原理

Session 机制是基于 Cookie 实现的。当客户端第一次访问服务器时,服务器会为该客户端创建一个唯一的会话 ID,并将该 ID 存储在服务端的数据库或缓存中。然后将该会话 ID 存储到客户端的 Cookie 中,并在响应报文中添加 Set-Cookie 头部,告知客户端保存该 Cookie。

当客户端再次访问服务器时,浏览器会自动将保存的 Cookie 发送给服务器,服务器可以从 Cookie 中获取到会话 ID,然后根据该 ID 从服务端数据库或缓存中获取相应的会话信息。通过会话机制,服务器可以保留客户端的状态并进行用户验证等操作。

需要注意的是,Cookie 是以明文的形式保存在客户端中,因此在安全性方面存在一定的风险。为了提高安全性,可以使用 HTTPS 协议来加密 Cookie 信息,或在 Cookie 中添加签名和时间戳等信息进行验证。而 Session 则是存储在服务器端的,相对来说更加安全,但也存在服务器压力大的问题。

总之,Cookie 和 Session 都是用来维护客户端和服务器之间状态的机制,它们的底层实现原理都是通过在请求和响应头部中添加特定字段实现,并且都依赖于 HTTP 协议的工作机制。Cookie 是在客户端维护状态,Session 则是在服务器端维护状态。

10 什么是数字证书、签名

服务端可以向证书颁发机构CA申请证书,以避免中间人攻击(防止证书被篡改)。证书包含三部分内容:证书内容、证书签名算法和签名,签名是为了验证身份。

服务端把证书传输给浏览器,浏览器从证书里取公钥。证书可以证明该公钥对应本网站。

     数字签名的制作过程:

  • CA使用证书签名算法对证书内容进行hash运算。
  • 对hash后的值用CA的私钥加密,得到数字签名。
    浏览器验证过程:
  • 获取证书,得到证书内容、证书签名算法和数字签名。
  • 用CA机构的公钥对数字签名解密(由于是浏览器信任的机构,所以浏览器会保存它的公钥)。
  • 用证书里的签名算法对证书内容进行hash运算。
  • 比较解密后的数字签名和对证书内容做hash运算后得到的哈希值,相等则表明证书可信。

11 http缓存机制

(1)浏览器每次发起请求都需要先在浏览器缓存中进行查询

(2)浏览器每次拿到返回的请求结果都会把该结果和缓存标志存入浏览器缓存中

强制缓存

强制缓存的缓存规则就是:当浏览器向服务器发送请求的时候,服务器会将缓存规则放入HTTP响应的报文的HTTP头中和请求结果一起返回给浏览器,控制强制缓存的字段分别是Expires和Cache-Control,其中Cache-Conctrol的优先级比Expires高。

协商缓存

协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程

12 端口及其对应的服务

13 数字证书

在说校验数字证书是否可信的过程前,我们先来看看数字证书是什么,一个数字证书通常包含了:

  • 公钥;
  • 持有者信息;
  • 证书认证机构(CA)的信息;
  • CA 对这份文件的数字签名及使用的算法;
  • 证书有效期;
  • 还有一些其他额外信息;

那数字证书的作用,是用来认证公钥持有者的身份,以防止第三方进行冒充。说简单些,证书就是用来告诉客户端,该服务端是否是合法的,因为只有证书合法,才代表服务端身份是可信的。

我们用证书来认证公钥持有者的身份(服务端的身份),那证书又是怎么来的?又该怎么认证证书呢?

为了让服务端的公钥被大家信任,服务端的证书都是由 CA (Certificate Authority,证书认证机构)签名的,CA 就是网络世界里的公安局、公证中心,具有极高的可信度,所以由它来给各个公钥签名,信任的一方签发的证书,那必然证书也是被信任的。

之所以要签名,是因为签名的作用可以避免中间人在获取证书时对证书内容的篡改。

数字证书的签发与验证过程

CA 签发证书的过程,如上图左边部分:

  • 首先 CA 会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包,然后对这些信息进行 Hash 计算,得到一个 Hash 值;
  • 然后 CA 会使用自己的私钥将该 Hash 值加密,生成 Certificate Signature,也就是 CA 对证书做了签名;
  • 最后将 Certificate Signature 添加在文件证书上,形成数字证书;

客户端校验服务端的数字证书的过程,如上图右边部分:

  • 首先客户端会使用同样的 Hash 算法获取该证书的 Hash 值 H1;
  • 通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使用 CA 的公钥解密 Certificate Signature 内容,得到一个Hash 值 H2;
  • 最后比较 H1 和 H2,如果值相同,则为可信赖的证书,否则则认为证书不可信。

14 http和https的区别

  • 数据传输方面

http 明文传输  不安全  https  采用了加密传输

  • 身份证书方面

https通常会向CA申请证书  来验证自己身份的可靠性   这样防止了假冒伪劣网站的可能性

  • 端口号

http端口号 80   http端口号 443

15 介绍一下http

  • http报文格式
  • http状态码
  • http版本

16 介绍一下QUIC协议

(3条消息) QUIC协议原理详解_LceChan的博客-优快云博客

  • 更快的连接建立  0 RTT   TCP需要4RTT

  • 更快的连接迁移  不再依赖Tcp四元组  而是ConnectionID

  • 多路流复用   解决队头阻塞
    不向Tcp一样有序确认  而是乱序确认 依靠StreamID和StreamOffset

17 http 和 rpc区别

  • 服务发现  http 80  rpc  zk
  • 底层连接方式  rpc 连接池
  • 传输的内容   protobuf  轻量  定制化

HTTP 协议和 RPC(Remote Procedure Call,远程过程调用)是两种不同的协议,它们在设计目的、传输方式、性能等方面都存在差异。

  1. 设计目的不同

HTTP 协议是一种通用的应用层协议,旨在实现客户端和服务器之间的数据传输和交互。它主要用于 Web 应用程序中,可以使用 GET、POST、PUT、DELETE 等方法对资源进行操作。

RPC 是一种通信协议,它用于在不同的进程或机器之间进行远程过程调用。RPC 旨在让远程调用就像本地调用一样简单,可以使用多种传输协议,例如 TCP/IP、HTTP、UDP 等。

  1. 传输方式不同

HTTP 协议采用文本格式的报文进行传输,报文中包含请求头、请求体、响应头和响应体等信息。HTTP 协议采用面向连接的方式进行通讯,即每次请求都需要建立一个连接,然后发送请求,等待响应,最后关闭连接。

RPC 协议采用二进制格式的数据进行传输,数据格式定义了请求和响应的结构和内容。RPC 协议采用面向消息的方式进行通讯,即通过发送消息进行调用,不需要建立和关闭连接,可以使用长连接来提高效率。

  1. 性能方面有所不同

由于 HTTP 协议的通讯方式是基于文本传输的,因此它的性能相对较低。而 RPC 采用二进制传输,可以降低数据传输量和传输延迟,因此性能较高,适用于分布式系统中的远程调用。

总之,HTTP 协议和 RPC 协议都是常见的网络协议,但它们的应用场景和设计目的不同。HTTP 协议主要用于 Web 应用程序的数据传输和交互,而 RPC 协议主要用于实现进程之间的远程调用。在传输方式和性能方面也存在差异,需要根据实际需求选择合适的网络协议。

二、传输层

01 三次握手、四次挥手、客户端和服务端状态变化

三次握手

三次握手过程

  • 客户端会随机初始化一个序列号,然后把次序号置于TCP首部的序列号字段中,同时把SYN标志位置为1,表示SYN报文,向服务器端发起连接,之后进入SYN_SENT状态
  • 服务器端收到客户端的SYN报文后,首先也随机初始化自己的序列号,然后将确认应答号设置为客户端序列号+1,再把SYN和ACK的标志位都置为1,然后处于SYC_ECVD状态,此时会维护一个半连接队列,connect函数返回
  • 客户端收到服务端报文后,首先将TCP首部的ACK标志位置为1,然后在确认应答号字段填入服务器端的序列号+1,最后把报文发送给服务器端,然后处于eatablished状态,此时也会维护一个全连接队列,accept函数返回

三次握手:

三次握手过程对应的socket函数

客户端 connect 成功返回是在第二次握手,服务端 accept 成功返回是在三次握手成功之后

全连接队列和半连接队列的作用以及区别

在 TCP/IP 协议中,服务器接收到客户端请求时,需要进行一系列处理,如建立连接、验证请求等操作。如果服务器无法立即处理请求,会将请求放到一个等待处理的队列中。这里的等待队列分为两种,即全连接队列和半连接队列。

  1. 全连接队列

全连接队列(Fully Established Queue)是指已经完成三次握手,建立了连接的 TCP 请求所排队的队列。当客户端向服务器发送 SYN 包并且服务器收到 SYN 包后,服务器会向客户端发送 SYN-ACK 包并等待客户端发送 ACK 包确认。在这个过程中,如果服务器正在忙于处理其他请求,就会将新请求放到全连接队列中等待处理。

全连接队列的大小是有限的,超过队列长度的请求将被服务器拒绝。这样做的目的是为了防止服务器被过多的请求拖垮,保证服务器的稳定性。

  1. 半连接队列

半连接队列(Half Established Queue)是指只完成了三次握手中的前两个步骤(即 SYN 和 SYN-ACK),还没有完成第三个步骤(即 ACK),因此还没有建立起连接的 TCP 请求所排队的队列。

半连接队列的作用是缓解短时间内大量连接请求造成的服务器负载压力。当服务器收到 SYN 包后,会向客户端发送 SYN-ACK 包,并将这个请求放到半连接队列中等待 ACK 包的到来。如果在一段时间内服务器没有收到 ACK 包,则会自动删除这个请求,避免占用过多系统资源。

区别:

全连接队列和半连接队列的主要区别在于队列中请求所处的状态不同。全连接队列中的请求已经建立了 TCP 连接,而半连接队列中的请求还没有完成 TCP 连接的建立。此外,全连接队列的大小通常比半连接队列的大小要小,因为建立连接需要消耗更多的系统资源。

为什么不是两次握手

TCP漫画解析: 为什么是三次握手,而不是两次或四次? - 知乎 (zhihu.com)

图解 TCP 重传、滑动窗口、流量控制、拥塞控制 - 知乎 (zhihu.com)

如果TCP只有两次握手,可能会出现以下问题:

  1. 客户端发送了请求,但请求丢失了,这时候客户端并不知道请求是否已经到达服务器,如果此时直接建立连接可能会导致数据传输出现混乱。

在两次握手的情况下,如果第一次握手的请求丢失,客户端并不知道,默认连接建立,继续传输数据会造成数据传输的混乱

如何随机生成随机序列号

在 TCP 三次握手中,通信的双方都需要选择一个初始的序列号(ISN,Initial Sequence Number)来标识自己的数据包。随机生成 ISN 是为了防止攻击者伪造数据包,并且使得序列号的重复概率尽可能小。

一般情况下,ISN 是由操作系统内核随机生成的。具体来说,操作系统可以利用当前时间、进程 ID、网络接口等信息来计算 ISN。由于 TCP 头部中序列号字段只有 32 位,因此 ISN 的取值范围是有限的。为了避免序列号在短时间内重复,ISN 的生成通常会考虑到之前使用的序列号,并加入一些额外的随机因素,比如伪随机数生成器(PRNG)。

需要注意的是,由于 ISN 是随机生成的,因此 TCP 通信双方必须要能够解读和理解对方的 ISN,否则可能导致连接失败。因此,在 TCP 三次握手中,双方需要交换彼此的 ISN,以便确认对方的身份并建立可靠的连接。具体来说,客户端会在第一个 SYN 报文段中发送一个随机生成的 ISN,服务器在收到这个报文段后,会在第二个 SYN 报文段中确认收到客户端的 ISN,并发送自己的随机生成的 ISN。客户端在收到第二个 SYN 报文段后,会确认收到了服务器的 ISN,并通知服务器连接已经建立成功,此时 TCP 三次握手完成。

四次挥手

四次挥手过程

  • 客户端打算关闭连接,会发送一个TCP首部的FIN标志位置为1的报文,也就是FIN报文,之后客户端进入FIN_WAIT1状态
  • 服务器端收到报文后,向客户端发送一个ACK应答报文,接着服务器端进入CLOSE_WAIT状态
  • 客户端接收到服务端的ACK报文后,进入FIN_WAIT2状态
  • 然后等待服务器端处理完数据后,也向客户端发送一个FIN报文,服务器端进入LAST_ACK状态
  • 客户端收到服务端的FIN报文后,回一个ACK报文,之后进入TIME_WAIT状态
  • 服务器端收到了ACK应答报文后,进入了closed状态,服务器端完成连接的关闭
  • 客户端经过2MSL后,自动进入closed状态,至此客户端也完成连接的关闭

四次挥手:

为什么不是三次挥手

服务器还有数据要处理 所以需要先回ACK 再回 FIN

02 tcp和udp区别

1. 连接

  • TCP 是面向连接的传输层协议,传输数据前先要建立连接。
  • UDP 是不需要连接,即刻传输数据。可以一个主机同时向多个主机发送消息、支持广播和组播

2. 字节流协议

  • TCP 是流式传输,没有边界,但保证顺序和可靠。
  • UDP 是一个包一个包的发送,是有边界的,但可能会丢包和乱序。

3. 可靠性

  • TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按序到达。
  • UDP 是尽最大努力交付,不保证可靠交付数据。

UDP因为实时性比较好,没有TCP那样冗余的可靠性保证机制,所以被广泛应用于一些对实时性要求比较高、数据量比较小、可靠性要求低的场景:在线游戏、音视频传输

03 TCP超时重传、滑动窗口、流量控制、拥塞控制

重传机制

面试头条你需要懂的 TCP 拥塞控制原理 - 知乎 (zhihu.com)

超时重传

在发送数据的时候,设置一个定时器,当超过指定的时间后,没有收到对方的ACK报文,就重复该数据

  • 数据包丢失
  • 确认应答丢失

RTO 超时重传时间应该设置略大于RTT报文往返时间

快速重传

快速重传不以时间为驱动,而是以数据为驱动重传

他会在收到三个相同的ACK报文时,重传丢失的报文。

比如传递报文1 2 3 4 5    1到了  回一个ACK报文2   然后 2没到  后面的 3 4 5都到了   服务器端会回复三次ACK报文为2     这样会进行一个快速重传

重传是立马重传还是过一段时间重传

过一段时间重传

滑动窗口机制、流量控制

  • TCP 是   发送应答机制   如果数据包的往返时间越长 通信效率越低       为了提高通信效率   引入了窗口这个概念
  • TCP 头里有一个字段叫 Window,也就是窗口大小。
    这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。
    所以,通常窗口的大小是由接收方的窗口大小来决定的。
    发送方发送的数据大小不能超过接收方的窗口大小,否则接收方就无法正常接收到数据。
  • TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。 TCP会话的双方都各自维护一个发送窗口和一个接收窗口。接收窗口大小取决于应用、系统、硬件的限制。发送窗口则取决于对端通告的接收窗口。接收方发送的确认报文中的window字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将接收方的确认报文window字段设置为 0,则发送方不能发送数据。

TCP头包含window字段,16bit位,它代表的是窗口的字节容量,最大为65535。这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。接收窗口的大小是约等于发送窗口的大小。

拥塞控制机制

前面的流量控制是避免「发送方」的数据填满「接收方」的缓存,但是并不知道网络的中发生了什么。

在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大.

于是,就有了拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络。

拥塞窗口 cwnd是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的

  • 慢启动

当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会指数级增加(翻倍增加)。

把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。每经过一个传输轮次,拥塞窗口 cwnd 就加倍。 为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。

当 cwnd < ssthresh 时,使用慢开始算法。

当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。

当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。

  • 拥塞避免

前面说道,当拥塞窗口 cwnd 「超过」慢启动门限 ssthresh 就会进入拥塞避免算法。

一般来说 ssthresh 的大小是 65535 字节。

那么进入拥塞避免算法后,它的规则是:每当收到一个 ACK 时,cwnd 增加 1/cwnd。

接上前面的慢启动的栗子,现假定 ssthresh8

  • 当 8 个 ACK 应答确认到来时,每个确认增加 1/8,8 个 ACK 确认 cwnd 一共增加 1,于是这一次能够发送 9 个 MSS 大小的数据,变成了线性增长。

让拥塞窗口cwnd缓慢地增大,每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢增长。

无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送 方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生 拥塞的路由器有足够时间把队列中积压的分组处理完毕。

  • 拥塞发生

当网络出现拥塞,也就是会发生数据包重传,重传机制主要有两种:

  • 超时重传
  • 快速重传

这两种使用的拥塞发送算法是不同的,接下来分别来说说。

当发生了「超时重传」,则就会使用拥塞发生算法。

这个时候,ssthresh 和 cwnd 的值会发生变化:

  • ssthresh 设为 cwnd/2
  • cwnd 重置为 1 (是恢复为 cwnd 初始化值,我这里假定 cwnd 初始化值 1)

接着,就重新开始慢启动,慢启动是会突然减少数据流的。这真是一旦「超时重传」,马上回到解放前。但是这种方式太激进了,反应也很强烈,会造成网络卡顿。

发生快速重传的拥塞发生算法

还有更好的方式,前面我们讲过「快速重传算法」。当接收方发现丢了一个中间包的时候,发送三次前一个包的 ACK,于是发送端就会快速地重传,不必等待超时再重传。

TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则 ssthreshcwnd 变化如下:

  • cwnd = cwnd/2 ,也就是设置为原来的一半;
  • ssthresh = cwnd;
  • 进入快速恢复算法

有时个别报文段会在网络中丢失,但实际上网络并未发生拥塞。如果发送方迟迟收不到确认,就会产生超时,就会误认为网络发生了拥塞。这就导致发送方错误地启动慢开始,把拥塞窗口cwnd又设置为1,因而降低了传输效率。

快重传算法可以避免这个问题。快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认,使发送方及早知道有报文段没有到达对方。

发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待重传计时器到期。由于发送方尽早重传未被确认的报文段,因此采用快重传后可以使整个网络吞吐量提高约20%。

  • 快速恢复

快速重传和快速恢复算法一般同时使用,快速恢复算法是认为,你还能收到 3 个重复 ACK 说明网络也不那么糟糕,所以没有必要像 RTO 超时那么强烈。

正如前面所说,进入快速恢复之前,cwndssthresh 已被更新了:

  • cwnd = cwnd/2 ,也就是设置为原来的一半;
  • ssthresh = cwnd;

然后,进入快速恢复算法如下:

  • 拥塞窗口 cwnd = ssthresh + 3 ( 3 的意思是确认有 3 个数据包被收到了);
  • 重传丢失的数据包;
  • 如果再收到重复的 ACK,那么 cwnd 增加 1;
  • 如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态;

当发送方连续收到三个重复确认,就会把慢开始门限ssthresh减半,接着把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。

在采用快恢复算法时,慢开始算法只是在TCP连接建立时和网络出现超时时才使用。 采用这样的拥塞控制方法使得TCP的性能有明显的改进。

04 TCP粘包与拆包

TCP粘包:socket读取时,读到了实际意义上的两个或多个数据包的内容,同时将其作为一个数据包进行处理。

TCP拆包:socket读取时,没有完整地读取一个数据包,只读取一部分。

为什么UDP不粘包

粘包拆包问题在数据链路层、网络层以及传输层都有可能发生。日常的网络应用开发大都在传输层进行,由于UDP有消息保护边界,不会发生粘包拆包问题,因此粘包拆包问题只发生在TCP协议中。

UDP不存在粘包问题,是由于UDP发送的时候,没有经过Negal算法优化,不会将多个小包合并一次发送出去。另外,在UDP协议的接收端,采用了链式结构来记录每一个到达的UDP包,这样接收端应用程序一次recv只能从socket接收缓冲区中读出一个数据包。也就是说,发送端send了几次,接收端必须recv几次(无论recv时指定了多大的缓冲区)。

UDP并不在意包的大小 只在意发生的次数 尽量保证每次发生udp的最大载荷1472

解决方案

对于粘包和拆包问题,常见的解决方案有四种:

  • 发送端将每个包都封装成固定的长度,比如100字节大小。如果不足100字节可通过补0或空等进行填充到指定长度;
  • 发送端在每个包的末尾使用固定的分隔符,例如\r\n。如果发生拆包需等待多个包发送过来之后再找到其中的\r\n进行合并;例如,FTP协议;
  • 将消息分为头部和消息体,头部中保存整个消息的长度,只有读取到足够长度的消息之后才算是读到了一个完整的消息;
  • 通过自定义协议进行粘包和拆包的处理。

05 Time_wait为什么是2Msl时间

MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为 TCP 报文基于是 IP 协议的,而 IP 头中有一个 TTL 字段,是 IP 数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减 1,当此值为 0 则数据报将被丢弃,同时发送 ICMP 报文通知源主机。

MSL 与 TTL 的区别: MSL 的单位是时间,而 TTL 是经过路由跳数。所以 MSL 应该要大于等于 TTL 消耗为 0 的时间,以确保报文已被自然消亡。

TTL 的值一般是 64,Linux 将 MSL 设置为 30 秒,意味着 Linux 认为数据报文经过 64 个路由器的时间不会超过 30 秒,如果超过了,就认为报文已经消失在网络中了

TIME_WAIT 等待 2 倍的 MSL,比较合理的解释是: 网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间

比如,如果被动关闭方没有收到断开连接的最后的 ACK 报文,就会触发超时重发 FIN 报文,另一方接收到 FIN 后,会重发 ACK 给被动关闭方, 一来一去正好 2 个 MSL。

可以看到 2MSL时长 这其实是相当于至少允许报文丢失一次。比如,若 ACK 在一个 MSL 内丢失,这样被动方重发的 FIN 会在第 2 个 MSL 内到达,TIME_WAIT 状态的连接可以应对。

为什么不是 4 或者 8 MSL 的时长呢?你可以想象一个丢包率达到百分之一的糟糕网络,连续两次丢包的概率只有万分之一,这个概率实在是太小了,忽略它比解决它更具性价比。

2MSL 的时间是从客户端接收到 FIN 后发送 ACK 开始计时的。如果在 TIME-WAIT 时间内,因为客户端的 ACK 没有传输到服务端,客户端又接收到了服务端重发的 FIN 报文,那么 2MSL 时间将重新计时

在 Linux 系统里 2MSL 默认是 60 秒,那么一个 MSL 也就是 30 秒。Linux 系统停留在 TIME_WAIT 的时间为固定的 60 秒

time_wait的状态过多会有什么缺点

06 udp如何可靠

[QUIC 是如何做到 0RTT 的 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/142794794#:~:text=client 在首次连接后,会把 server 的 config 存下,之后再次发起连接时,因为已经有 config,了,可以直接从上面的第 3 步开始,而这一步已经可以发送业务数据了,所以,非首次连接时,QUIC 可以做到 0RTT K1 存在的必要性)

跟坚哥学QUIC系列:加密和传输握手 - 知乎 (zhihu.com)

无队头阻塞

QUIC 协议也有类似 HTTP/2 Stream 与多路复用的概念,也是可以在同一条连接上并发传输多个 Stream,Stream 可以认为就是一条 HTTP 请求。

由于 QUIC 使用的传输协议是 UDP,UDP 不关心数据包的顺序,如果数据包丢失,UDP 也不关心。

不过 QUIC 协议会保证数据包的可靠性,每个数据包都有一个序号唯一标识。当某个流中的一个数据包丢失了,即使该流的其他数据包到达了,数据也无法被 HTTP/3 读取,直到 QUIC 重传丢失的报文,数据才会交给 HTTP/3。

而其他流的数据报文只要被完整接收,HTTP/3 就可以读取到数据。这与 HTTP/2 不同,HTTP/2 只要某个流中的数据包丢失了,其他流也会因此受影响。

所以,QUIC 连接上的多个 Stream 之间并没有依赖,都是独立的,某个流发生丢包了,只会影响该流,其他流不受影响。

package number

stream offset

更快的连接建立

对于 HTTP/1 和 HTTP/2 协议,TCP 和 TLS 是分层的,分别属于内核实现的传输层、OpenSSL 库实现的表示层,因此它们难以合并在一起,需要分批次来握手,先 TCP 握手,再 TLS 握手。

HTTP/3 在传输数据前虽然需要 QUIC 协议握手,这个握手过程只需要 1 RTT,握手的目的是为确认双方的「连接 ID」,连接迁移就是基于连接 ID 实现的。

但是 HTTP/3 的 QUIC 协议并不是与 TLS 分层,而是==QUIC 内部包含了 TLS,它在自己的帧会携带 TLS 里的“记录”,再加上 QUIC 使用的是 TLS 1.3,因此仅需 1 个 RTT 就可以「同时」完成建立连接与密钥协商,甚至在第二次连接的时候,应用数据包可以和 QUIC 握手信息(连接信息 + TLS 信息)一起发送,达到 0-RTT 的效果==。

如下图右边部分,HTTP/3 当会话恢复时,有效负载数据与第一个数据包一起发送,可以做到 0-RTT:

更快的连接迁移

在前面我们提到,基于 TCP 传输协议的 HTTP 协议,由于是通过四元组(源 IP、源端口、目的 IP、目的端口)确定一条 TCP 连接。

那么当移动设备的网络从 4G 切换到 WiFi 时,意味着 IP 地址变化了,那么就必须要断开连接,然后重新建立连接,而建立连接的过程包含 TCP 三次握手和 TLS 四次握手的时延,以及 TCP 慢启动的减速过程,给用户的感觉就是网络突然卡顿了一下,因此连接的迁移成本是很高的。

而 QUIC 协议没有用四元组的方式来“绑定”连接,而是通过==连接 ID==来标记通信的两个端点,客户端和服务器可以各自选择一组 ID 来标记自己,因此即使移动设备的网络变化后,导致 IP 地址变化了,只要仍保有上下文信息(比如连接 ID、TLS 密钥等),就可以“无缝”地复用原连接,消除重连的成本,没有丝毫卡顿感,达到了连接迁移的功能。

07 tcp报文首部都有哪些字段,作用是什么

  • 16位端口号:源端口号,主机该报文段是来自哪里;目标端口号,要传给哪个上层协议或应用程序
  • 32位序号:一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。
  • 32位确认号:用作对另一方发送的tcp报文段的响应。其值是收到的TCP报文段的序号值加1。
  • 4位头部长度:表示tcp头部有多少个32bit字(4字节)。因为4位最大能标识15,所以TCP头部最长是60字节。
  • 6位标志位:URG(紧急指针是否有效),ACk(表示确认号是否有效),PSH(缓冲区尚未填满),RST(表示要求对方重新建立连接),SYN(建立连接消息标志接),FIN(表示告知对方本端要关闭连接了)
  • 16位窗口大小:是TCP流量控制的一个手段。这里说的窗口,指的是接收通告窗口。它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
  • 16位校验和:由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意,这个校验不仅包括TCP头部,也包括数据部分。这也是TCP可靠传输的一个重要保障。
  • 16位紧急指针:一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此,确切地说,这个字段是紧急指针相对当前序号的偏移,不妨称之为紧急偏移。TCP的紧急指针是发送端向接收端发送紧急数据的方法。

08 tcp如何保证可靠性

  • 首先,TCP的连接是基于三次握手,而断开则是基于四次挥手。确保连接和断开的可靠性。
  • 其次,TCP的可靠性,还体现在有状态;TCP会记录哪些数据发送了,哪些数据被接收了,哪些没有被接受,并且保证数据包按序到达,保证数据传输不出差错。
  • 再次,TCP的可靠性,还体现在可控制。它有数据包校验、ACK应答、超时重传(发送方)、失序数据重传(接收方)、丢弃重复数据、流量控制(滑动窗口)和拥塞控制等机制。

09 tcpdump用法

tcpdump是一个常用的网络抓包工具,它可以通过监听网络接口来捕获网络数据包,并将捕获的数据包进行解析、分析与显示。

下面是tcpdump的一些常用用法:

  • 监听指定网络接口

sudo tcpdump -i [interface]

其中,[interface]表示要监听的网络接口名称,如eth0、wlan0等。

  • 指定捕获数据包的数量

sudo tcpdump -c [count]

其中,[count]表示要捕获的数据包数量。

  • 指定捕获数据包的大小

sudo tcpdump -s [size]

其中,[size]表示要捕获的数据包的最大字节数,可以使用K、M、G等后缀表示单位。

  • 指定捕获特定协议的数据包

sudo tcpdump [protocol]

其中,[protocol]可以是IP、TCP、UDP等协议名。

10 为什么dns用udp协议

  • 快速性能:UDP是一种面向无连接的协议,它在传输数据时没有建立和维护连接的开销。相比于使用TCP(Transmission Control Protocol)作为传输协议,UDP具有更低的延迟。由于DNS是一种需要快速响应的协议,使用UDP可以提供更快的查询和响应时间。
  • 较小的数据包:DNS查询和响应通常包含较小的数据包,包括查询请求和返回的IP地址等信息。UDP在传输数据时,不需要额外的连接控制信息,因此数据包的开销较小,使得数据传输更为高效。
  • 可靠性要求较低:相对于其他应用,DNS在传输中的可靠性要求相对较低。DNS查询通常是一个简短的请求-响应过程,对于丢失少量的数据包或者出现传输错误的情况,可以通过进行重试来解决。因此,使用UDP可以满足DNS的可靠性需求。

11 RTO、RTT和超时重传分别是什么

RTT 指的是数据发送时刻到接收到确认的时刻的差值,也就是包的往返时间。

超时重传时间是以 RTO (Retransmission Timeout 超时重传时间)表示。

12 udp特点

UDP(User Datagram Protocol)是一种无连接的传输层协议,它有以下几个主要特点:

  • 无连接性

UDP是一种无连接的协议,这意味着发送方发送数据包时不需要在发送之前建立连接。相反,它只是简单地将数据包发送到目标主机和端口,并期望目标主机能够正确接收它。因此,UDP比TCP更快,但它没有TCP的可靠性。

  • 轻量级

UDP数据包头部相对于TCP较小,只有8字节的头部,因此UDP的负载更小,数据传输更快。因为UDP没有像TCP一样复杂的握手、重传和流量控制机制,所以它的开销更小。

  • 面向数据报

UDP是一种面向数据报的协议,这意味着它对每个数据包进行独立处理,而不需要像TCP一样处理一个数据流。这样可以更容易地实现多路复用和多路分解。

  • 支持单播、广播和多播

UDP支持单播、广播和多播,可以用于各种网络应用程序,如视频和音频流、在线游戏等。

总的来说,UDP是一种轻量级、简单的协议,适合用于实时传输和实时数据处理。尽管它没有TCP的可靠性,但它具有快速的数据传输和较小的开销,适合用于一些需要快速响应和快速传输的应用程序。

13 syn攻击是什么

SYN攻击是一种DoS(Denial of Service)攻击,目的是使服务器无法响应正常的网络流量请求。SYN攻击利用TCP协议中的三次握手过程中的漏洞,向服务器发送大量的SYN请求,并且不完整地建立TCP连接。当服务器响应这些SYN请求时,它将保留一个等待确认的连接状态,这些保留连接状态将占用服务器的资源并导致其无法响应正常的请求。

SYN攻击的主要过程如下:

  1. 攻击者向服务器发送大量的SYN请求,这些请求来自假冒的IP地址或已被攻击者控制的僵尸机器上。
  1. 服务器接收到这些SYN请求,并发送一个SYN-ACK响应给源IP地址,以确认建立TCP连接。
  1. 攻击者不回复ACK响应,并且不完成三次握手过程,这使得服务器的连接队列中保留了一个未完成的连接状态。
  1. 当服务器的连接队列被填满时,它将无法再处理正常的连接请求,这会导致服务不可用的状态。

为了防止SYN攻击,可以采取以下几种措施:

  1. 启用SYN Cookies

SYN Cookies是一种防御SYN攻击的机制,它通过将随机生成的Cookie插入SYN响应中,使得服务器无需在接收到SYN请求时为其分配连接队列,从而减少了服务器的资源开销。

  1. 增加连接队列大小

通过增加服务器的连接队列大小,可以缓解SYN攻击的影响。这样可以使服务器能够处理更多的连接请求,同时降低了队列被填满的风险。

  1. 过滤假冒IP地址

可以使用IP地址过滤来过滤掉来自已知假冒IP地址的SYN请求,以减少攻击者的攻击效果。

  1. 使用硬件防火墙

硬件防火墙可以过滤掉恶意的SYN请求,从而保护服务器免受SYN攻击的影响。

总的来说,SYN攻击是一种常见的DoS攻击,但通过使用适当的防御措施,可以减轻其影响并保护服务器免受攻击。

14 MTU和MSS分别是什么

MTU和MSS是与TCP/IP协议栈相关的两个重要参数,它们分别表示网络的最大传输单元和最大分段大小。

  1. MTU(Maximum Transmission Unit)

MTU是指在某个网络中,可以通过一个数据包传输的最大数据量。它是一个网络的物理层特性,取决于传输介质的类型和最大帧大小。MTU通常以字节为单位进行度量,常见的MTU值包括1500字节(以太网)、576字节(拨号连接)等。如果一个IP数据包的大小超过了MTU,那么就会发生分片,数据包会被拆分成多个小的数据包进行传输。

  1. MSS(Maximum Segment Size)

MSS是指在TCP/IP协议栈中,TCP数据包的最大有效载荷大小。它是在TCP三次握手阶段进行协商的,每个连接的MSS值通常是双方协商后取得的较小值。MSS值包括TCP头部和TCP选项的长度,因此MSS值通常比MTU值小一些。例如,在以太网上,如果MTU为1500字节,则MSS值通常为1460字节。

由于TCP数据包中除了有效载荷还包括TCP头部和TCP选项等额外的数据,因此MSS值不能超过MTU值。否则,TCP数据包将被分成多个分段进行传输,这将导致网络传输效率下降。因此,在网络环境中,合理设置MTU和MSS值是非常重要的,它们直接影响着网络的数据传输效率和性能。

15 传输层有什么协议

  • tcp协议
  • udp协议

16 TCP保活机制

答:tcp通信中,若两端长时间没有数据往来,则这时候每隔一段时间,服务端会向客户端发送一个保活探测数据报,要求客户端进行回复。若连续多次没有收到响应,就认为连接已经断开。长时间默认为7200s,每隔一段时间默认为75s,连续多次无响应默认为9次。这些数据都可以在套接字中修改,接口:Setsockopt

17 TCP Tahoe 和 TCP Reno拥塞算法

TCP拥塞控制之Tahoe和Reno算法(修订)哔哩哔哩bilibili

TCP Tahoe和TCP Reno是两种拥塞控制算法,它们都是TCP协议中用于控制网络拥塞的一种实现方式。这两种算法的主要区别在于它们在响应拥塞事件时的策略不同。

  1. TCP Tahoe

TCP Tahoe是TCP的一种拥塞控制算法,它采用了一种被称为AIMD(增加-减小)的拥塞控制算法。在AIMD算法中,TCP Tahoe通过周期性地将拥塞窗口大小增加1,直到发生拥塞事件时将其减半。当发生拥塞事件时,TCP Tahoe会立即将拥塞窗口大小设置为1,并进行慢启动(slow start)阶段。这意味着在拥塞恢复过程中,TCP Tahoe只能发送一个数据包,这导致了网络吞吐量的大幅下降。

  1. TCP Reno

TCP Reno是TCP的另一种拥塞控制算法,它采用了一种称为“快速恢复”(fast recovery)的算法。当发生拥塞事件时,TCP Reno不会像TCP Tahoe那样将拥塞窗口大小减半,而是将其减少一个“拥塞窗口”的大小,并进入快速恢复阶段。在快速恢复阶段中,TCP Reno会尝试发送更多的数据包,直到发生新的丢包事件。如果发生了新的丢包事件,TCP Reno会放弃快速恢复,重新进行慢启动阶段。

总的来说,TCP Reno相对于TCP Tahoe具有更好的性能和鲁棒性。这是因为TCP Reno能够在拥塞事件中快速恢复,并且不会像TCP Tahoe那样降低网络吞吐量。但是,TCP Reno需要更多的资源和处理能力,因此在某些较为简单的网络环境中,TCP Tahoe仍然是一个有效的拥塞控制算法。

18 你怎么保证UDP下帧与帧间的有序性呢

UDP是一种无连接的传输协议,它不提供数据包的可靠性和有序性保证。因此,在使用UDP进行数据传输时,如果需要保证数据的有序性,需要在应用层进行实现。

有以下几种方法可以在应用层实现UDP数据的有序性:

  1. 序列号

在每个UDP数据包中添加一个序列号字段,用于标识数据包的顺序。在接收端,按照序列号对数据包进行排序后再处理,从而保证数据的有序性。

  1. 时间戳

在每个UDP数据包中添加一个时间戳字段,用于标识数据包的发送时间。在接收端,按照时间戳对数据包进行排序后再处理,从而保证数据的有序性。

  1. 应用层协议

在应用层实现自定义的协议,例如基于消息队列的方案,用于保证数据的有序性。在这种方案中,应用程序将要传输的数据包先放入消息队列中,接收端按照顺序从消息队列中取出数据包进行处理。

需要注意的是,这些方法都需要在应用层进行实现,因此会增加一定的开发和维护成本。在某些情况下,如果数据的有序性对应用程序的正确性不是很关键,可以不必过于关注UDP数据的有序性,从而减少系统开销。

19 delay_ack机制

20 TCP和UDP报文首部格式

21 QUIC 如何实现更快的连接建立

QUIC——快速UDP网络连接协议 - 知乎 (zhihu.com)

TCP的短板问题

  1. TCP+TSL握手占用时间(至少2.5RTT)
  1. TCP巨大的头部浪费带宽(20~60字节)

step1: 客户端发送Inchoate Client Hello消息(CHLO)请求建立连接。

step2: 服务器根据一组质数p以及其原根g和a(长期私钥)算出A(长期公钥),将Apg(通过CA证书私钥加密后)放在serverConfig里面,发到Rejection消息(REJ)到客户端;

服务器一开始不直接使用随机生成的短期密钥的原因就是因为客户端可以缓存下服务端的长期公钥,这样在下一次连接的时候客户端就可以直接使用这个长期公钥实现0-RTT握手并直接发送加密数据

setp3&4: 客户端在接收到REJ消息后,会随机选择一个数b(短期密钥),并用CA证书获取的公钥解密出serverConfig里面的p、A和b就可以算出初始密钥K,并将B(Complete client hello消息)和用初始密钥K加密的Data数据发到服务器。

step5: 服务器收到客户端发来的公开数B,再利用p、g计算得到同样的初始秘钥K,来解密客户端发来的数据。这时会利用其他加密算法随机生成此次会话密钥K' ,再通过初始密钥K加密K'发送给客户端(SHLO)(每次会话都是用随机密钥,并且服务器会定期更新a和A,实际上这就是为了保证前向安全性)

在密码学中,前向保密(Forward Secrecy)是密码学中通讯协议的安全属性,指的是当前使用的主密钥泄漏不会导致过去的会话密钥泄漏。

step6: 客户端收到SHLO后利用初始密钥K解出会话密钥K',二者后续的会话都使用K'加密。

22 Tcp长连接都有哪些参数

[TCP长连接,心跳机制介绍tcp 长连接 心跳VioletEvergarden丶的博客-优快云博客](https://blog.youkuaiyun.com/lzh824359508/article/details/115328250#:~:text=参数的具体意义 1 TCP_KEEPIDLE :这个参数是多久没有发送数据时,开始发送Keep-Alive包的时间,也就是链路空闲时间。 2 TCP_KEEPINTVL:这个参数是指发送Keep-Alive,probe后,对方多久没有回应,然后重新再发送keep alive probe的时间间隔 3 TCP_KEEPCNT:这个参数指,连续发送多少次keep alive probe,对方没有回应,认为连接已经失效的重试次数)

TCP长连接包含以下几个常见的参数:

  1. 超时时间(Timeout): 这是连接在没有活动时保持打开的最长时间。如果在超过此时间后没有发生任何数据交换,连接可能会被关闭。超时时间可以根据具体需求进行设置,以平衡连接的存活时间和资源利用率。
  1. 最大空闲时间(Idle Time): 这是连接在没有活动时保持打开的最长时间间隔。如果在该时间段内没有任何数据交换,连接可能被认为是空闲的,并关闭。最大空闲时间通常用于保持连接的活跃性,并且可以防止不必要的资源浪费。
  1. 最大请求数(Max Requests): 在一定的时间范围内,允许通过一个TCP长连接发送的最大请求数。一旦达到最大请求数,服务器可能会主动关闭连接。这个参数可以帮助控制每个连接上的请求数量,以避免连接过度使用。
  1. 缓冲区大小(Buffer Size): 这是在TCP连接中用于临时存储发送或接收数据的缓冲区大小。较大的缓冲区可以提高吞吐量和传输效率,但也会增加内存消耗。
  1. 保活机制(Keep-Alive): 这是一种用于保持连接活跃的机制,通过定期发送心跳或保活消息来检测连接状态。如果检测到连接问题或空闲时间太长,可以选择关闭连接。

这些参数的具体设置取决于应用程序的需求、网络环境以及服务器和客户端的配置。在实际应用中,根据性能要求、资源限制和可靠性需求等因素,可以进行适当调整和优化这些参数。

23 Tcp头部和Udp头部

UDP报文头部  8字节

TCP报文头部   20字节

IP报文头部   20字节

三、网络层

  • ARP    根据IP找MAC地址
  • NAT    内网IP转换为公网IP
  • ICMP   查看IP是否丢包
  • DHCP  配置IP、DNS、子网掩码

01 介绍一下NAT的种类

概念

NAT(Network Address Translation,网络地址转换)是将IP数据报文中的IP地址转换为另一个IP地址的过程。当内部IP想要访问外网时,NAT主要实现内部网络和外部网络之间IP的转换,这种通过使用少量的公网IP地址代表较多的私网IP地址的方式,将有助于减缓可用IP地址空间的枯竭。

NAT(Network Address Translation)是一种网络地址转换技术,主要用于解决IPv4地址不足的问题。常见的NAT种类如下:

  1. 静态NAT(Static NAT):在静态NAT中,将一个私有IP地址映射为一个唯一的公共IP地址。静态NAT通常用于一些对外服务的服务器,例如Web服务器、邮件服务器等,以保证从公网访问时其IP地址的唯一性。
  1. 动态NAT(Dynamic NAT):动态NAT可以使多个私有IP地址映射为一个或多个公共IP地址。动态NAT会动态分配一个可用的公共IP地址给私有网络,当网络中的计算机需要访问公网时,动态NAT会为其分配一个公共IP地址,一般用于家庭或办公室私有网络。
  1. 双向NAT(Bi-directional NAT):双向NAT是一种特殊的NAT方式,用于解决两个私有网络之间的通信问题。在双向NAT中,两个私有网络使用相同的IP地址范围,并且通过不同的网关进行通信。

总之,不同的NAT技术可以解决不同的网络地址转换问题。静态NAT和动态NAT适用于不同规模的企业或办公室网络,PAT可以减少公共IP地址的使用量,而双向NAT则解决了两个私有网络之间的通信问题。

02 讲一下VLAN作用

VLAN(Virtual Local Area Network)是一种网络虚拟化技术,可以将一个物理局域网(LAN)划分成多个逻辑上的虚拟局域网,每个VLAN相互隔离,彼此间的通信需要通过路由器进行。

VLAN的作用如下:

  1. 提高网络性能:VLAN可以将大型局域网分割成多个小型的子网,有效减少广播风暴和冲突域的范围,提高网络的性能和可靠性。
  1. 增强网络安全:VLAN可以实现逻辑上的隔离,将不同的用户、部门或者设备分离在不同的VLAN中,避免因安全漏洞导致攻击者获取访问整个网络的权限。
  1. 简化网络管理:通过VLAN,可以对不同的用户、部门或者设备进行灵活的管理,例如可以对不同的VLAN设置不同的IP地址、子网掩码、默认网关等,方便网络管理人员进行配置和维护。
  1. 支持虚拟机间通信:VLAN可以将不同的虚拟机划分到不同的VLAN中,在各自的VLAN内进行通信,同时也可以通过路由器实现不同VLAN之间的通信。

总之,VLAN作为一种网络虚拟技术,能够提高网络性能、增强网络安全、简化网络管理,并且支持虚拟机间通信等功能。

03 VLAN 0作用

VLAN 0是一种特殊的VLAN ID,通常被认为是默认的VLAN。在一些网络设备上,如果没有显式地将端口分配到某个VLAN中,那么这些端口可能会自动分配到VLAN 0中。

在一些设备上,VLAN 0实际上是不存在的,没有任何物理或者逻辑意义。但是在另外一些设备上,VLAN 0可以使用,并具有特定的作用。不同设备上VLAN 0的作用可能略有不同,这里列举一些常见的可能作用:

  1. 默认VLAN:当一些设备上未显式设置VLAN时,这些端口可能会自动分配到VLAN 0中。在这种情况下,VLAN 0相当于默认的VLAN。
  1. 禁止访问:在一些设备上,将端口分配到VLAN 0中相当于禁止该端口的所有访问,从而起到一定的安全保护作用。
  1. 空VLAN:在一些设备上,VLAN 0可以作为空VLAN,即不包含任何端口和设备。这种情况下,VLAN 0可以用来区分有VLAN ID和没有VLAN ID的数据帧。

需要注意的是,由于VLAN 0的作用在不同的设备上可能不同,因此在配置和使用时,需要仔细阅读设备的文档,了解该设备上VLAN 0的具体作用和使用方法。

04 通过交换机广播转发MAC,MAC有做绑定么?

交换机的端口安全,是一种交换机的过滤策略,即为交换机的某个端口绑定一个固定的mac地址,使其他的mac地址访问的时候触发策略,down掉端口或者拒绝服务。

05 常见的IP协议

06 ping 的原理

ICMP 主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。

IP 通信中如果某个 IP 包因为某种原因未能达到目标地址,那么这个具体的原因将由 ICMP 负责通知

ping 这个程序是使用了 ICMP 里面的 ECHO REQUEST(类型为 8 ) 和 ECHO REPLY (类型为 0)

ping,Packet Internet Groper,是一种因特网包探索器,用于测试网络连接量的程序。Ping是工作在TCP/IP网络体系结构中应用层的一个服务命令, 主要是向特定的目的主机发送ICMP(Internet Control Message Protocol 因特网报文控制协议) 请求报文,测试目的站是否可达及了解其有关状态。

用途:测试网络连通性

一般来说,ping可以用来检测网络通不通。它是基于ICMP协议工作的。假设机器A ping机器B,工作过程如下:

  • ping通知系统,新建一个固定格式的ICMP请求数据包
  • ICMP协议,将该数据包和目标机器B的IP地址打包,一起转交给IP协议层
  • IP层协议将本机IP地址为源地址,机器B的IP地址为目标地址,加上一些其他的控制信息,构建一个IP数据包
  • 先获取目标机器B的MAC地址。
  • 数据链路层构建一个数据帧,目的地址是IP层传过来的MAC地址,源地址是本机的MAC地址
  • 机器B收到后,对比目标地址,和自己本机的MAC地址是否一致,符合就处理返回,不符合就丢弃。
  • 根据目的主机返回的ICMP回送回答报文中的时间戳,从而计算出往返时间
  • 最终显示结果有这几项:发送到目的主机的IP地址、发送 & 收到 & 丢失的分组数、往返时间的最小、最大& 平均值

Ping命令还可以通过不断发送ICMP请求和接收回显应答的方式,来估算出当前网络的平均往返时间、最大往返时间、最小往返时间等数据

07 内网ip地址

08 ARP的过程讲一下

ARP解决了同一个局域网上的主机和路由器IP和MAC地址的解析。

  • 每台主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。
  • 当源主机需要将一个数据包要发送到目的主机时,会首先检查自己 ARP列表中是否存在该 IP地址对应的MAC地址,如果有,就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。
  • 网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个 ARP响应数据包,告诉对方自己是它需要查找的MAC地址。
  • 源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。
  • 如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

09 ICMP协议的功能

ICMP,Internet Control Message Protocol ,Internet控制消息协议。

  • ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。
  • 它是一个非常重要的协议,它对于网络安全具有极其重要的意义。它属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。
  • 当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。

比如我们日常使用得比较多的ping,就是基于ICMP的。

10 DHCP了解么

Discover-》Offer -》Request-》ACK

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一种网络协议,用于自动分配IP地址、子网掩码、默认网关、DNS服务器等网络参数,从而简化网络管理和配置。DHCP工作在应用层和传输层之间,使用UDP协议进行通信。

DHCP主要分为两种角色:DHCP服务器和DHCP客户端。DHCP服务器负责管理IP地址池和分配IP地址,而DHCP客户端在连接网络时向DHCP服务器请求网络参数。

DHCP的工作过程大致如下:

  1. DHCP客户端发送DHCP Discover(DHCP发现报文)报文广播(UDP广播)到局域网内的所有DHCP服务器,请求分配IP地址。
  1. DHCP服务器接收到DHCP Discover报文后,如果有可用的IP地址,就会向DHCP客户端发送DHCP Offer(DHCP提供报文)报文,包含可用的IP地址、子网掩码、默认网关、DNS服务器等信息。
  1. DHCP客户端接收到DHCP Offer报文后,可以选择接受其中的IP地址等信息,并向DHCP服务器发送DHCP Request报文进行确认。
  1. DHCP服务器接收到DHCP Request报文后,确认分配IP地址,并向DHCP客户端发送DHCP ACK报文进行确认。
  1. DHCP客户端接收到DHCP ACK报文后,完成IP地址的获取和配置,可以开始正常的网络通信。

DHCP协议的优点是可以节省大量的IP地址资源,同时也方便网络管理和配置,特别是在大规模的网络环境中。但是需要注意的是,DHCP服务器和客户端的可靠性和安全性是需要保证的,否则可能会对网络造成安全隐患和故障。

11 NAT协议的工作过程

NAT(Network Address Translation,网络地址转换)是一种网络协议,用于在不同网络之间进行地址转换,从而实现互联网连接和共享公网IP地址。NAT协议通常应用在企业内部网络和互联网之间、家庭网络和互联网之间等场景。依赖转换表

NAT的工作过程大致如下:

  1. 首先,当内部网络中的主机需要访问互联网时,它会向NAT设备发送一个请求,请求连接互联网。
  1. NAT设备接收到请求后,会记录下内部网络中的主机的IP地址和端口号,并为其分配一个公网IP地址和端口号。同时,NAT设备会修改请求中的源IP地址和端口号,以便在互联网中路由到正确的目的地。
  1. NAT设备将修改后的请求发送到互联网上的目标主机。
  1. 当目标主机返回响应时,响应的目标IP地址和端口号为NAT设备的公网IP地址和端口号。
  1. NAT设备接收到响应后,将其转发到内部网络中的主机,并还原源IP地址和端口号,以便主机能够正确地处理响应。

NAT协议的主要作用是将内部网络中的私有IP地址转换为公网IP地址,从而实现互联网连接。此外,NAT还可以隐藏内部网络的拓扑结构,增强网络安全性,但也会带来一定的局限性,例如不能直接访问内部网络中的主机等问题。

图中有两个客户端 192.168.1.10 和 192.168.1.11 同时与服务器 183.232.231.172 进行通信,并且这两个客户端的本地端口都是 1025。

此时,两个私有 IP 地址都转换 IP 地址为公有地址 120.229.175.121,但是以不同的端口号作为区分。

12 ip包重组的过程

IP包重组(IP packet reassembly)是指在网络中,当一个IP数据包太大以至于无法通过网络的MTU(最大传输单元)限制时,该IP数据包会被拆分成多个小的数据包,这些小的数据包称为分段(fragment),并通过网络传输。在到达目的地后,接收端的主机需要将这些分段重新组装成完整的IP数据包,这个过程就是IP包重组。

IP包重组的过程大致如下:

  1. 接收端主机接收到第一个IP分段时,会检查其标志位中的MF(More Fragment)位,判断是否还有其他分段需要接收。
  1. 如果MF位为1,则说明还有其他分段需要接收,接收端主机会将该分段存储在缓存中,并等待接收剩余分段。
  1. 如果MF位为0,则说明该分段是最后一个分段,接收端主机会将该分段存储在缓存中,并进入重组过程。
  1. 接收端主机会根据分段中的标识(Identification)、源IP地址(Source Address)、目的IP地址(Destination Address)和协议类型(Protocol)等信息,将所有分段进行匹配,并按照序列号(Sequence Number)进行排序,以便将它们组装成完整的IP数据包。
  1. 如果有任何分段丢失或者出现错误,则会导致IP数据包无法完整地重组,此时接收端主机会丢弃该数据包,并且可以向发送端主机发送一个ICMP差错报文(ICMP Error Message),以便发送端主机得知数据包没有被完整地接收。

IP包重组需要消耗一定的计算资源和存储资源,并且会增加网络的延迟,因此在实际应用中,尽量避免出现需要进行IP包重组的情况,可以通过MTU调整、分段优化等方式来优化网络传输。

13 什么是分组转发

分组转发(Packet forwarding)是指在计算机网络中,路由器将接收到的数据包从一个网络接口转发到另一个网络接口的过程。在分组转发的过程中,路由器会根据数据包中的目标IP地址和路由表等信息,选择合适的网络接口进行转发,以便数据包能够正确地到达目的地。

具体来说,分组转发的过程大致如下:

  1. 当路由器接收到一个数据包时,会先检查数据包的头部信息,包括源IP地址、目标IP地址、协议类型等,以便确定数据包的流向。
  1. 接着,路由器会根据自身的路由表,选择合适的出口接口和下一跳路由器,以便将数据包转发到下一个网络中。
  1. 在转发数据包之前,路由器会进行一些处理,如更新数据包的TTL(Time-to-Live)值、重新计算数据包的校验和等,以确保数据包能够正确地传输。
  1. 最后,路由器将数据包发送到选择的出口接口,并通过该接口将数据包转发到下一跳路由器或者目标主机。

分组转发是计算机网络中的一个基本操作,可以使得数据包在不同的网络之间进行转发和传输,实现网络之间的互联互通。在实际应用中,分组转发还可以通过路由策略、路由协议等方式进行优化和调整,以满足不同的网络需求。

14 ping的原理

Ping是一种网络工具,用于测试主机之间的连接是否正常。它的工作原理基于Internet控制消息协议(ICMP)。

当您在计算机上运行ping命令时,它会发送一个ICMP请求消息到指定的目标主机。这个消息包含一个随机数,以及发送时间和其他相关信息。当目标主机收到该消息后,它会回复一个ICMP响应消息,其中包含相同的随机数和时间信息。发送者计算时间差,以确定消息往返时间(RTT)。RTT可以用于衡量网络的延迟,通常以毫秒为单位。

如果目标主机没有回复ICMP响应消息,那么ping工具会显示==“请求超时”或“主机不可达”==的错误信息。这可能表示目标主机的网络连接存在问题或者目标主机不再可达。

总之,Ping的基本原理是通过ICMP协议发送请求消息,然后等待目标主机返回响应消息来测试网络连接。通过测量RTT可以获得网络延迟信息,以便评估网络质量。

15 ipv4 和 ipv6的区别

IPv4和IPv6都是互联网协议(IP),它们是不同版本的IP协议,主要区别在于以下几个方面:

  1. 地址长度:IPv4地址长度为32位,IPv6地址长度为128位。这意味着IPv6可以支持更多的设备和网络,以及更高效、更稳定的数据传输。
  1. 地址格式:IPv4地址采用点分十进制表示法,如192.168.1.1,而IPv6地址采用冒号分隔的16进制表示法,如2001:0db8:85a3:0000:0000:8a2e:0370:7334。
  1. 地址数量:IPv4地址总共有42亿个,而IPv6地址则有2的128次方个,数量级差异极大。IPv6地址数量的增加,使得每个设备都可以拥有一个全球唯一的IP地址,从而更好地支持移动设备、物联网等大规模设备连接。

综上所述,IPv6是IPv4的升级版,它具有更好的安全性、扩展性、可靠性和兼容性,并且可以支持更多的设备和应用场景。IPv6的推广和普及是一个长期的过程,但在未来的互联网发展中,IPv6将成为互联网核心协议。

四、网络接口层

01 交换机和路由器的区别

  1. 工作层次不同:交换机工作在第二层(数据链路层),而路由器工作在第三层(网络层)。交换机通过 MAC 地址表来转发数据帧,而路由器通过 IP 地址来转发数据包。一个工作在数据链路层 一个工作在网络层
  1. 处理数据的方式不同:交换机使用硬件来处理数据帧,数据转发速度较快,适合在局域网中使用;而路由器使用软件来处理数据包,数据转发速度较慢,但可以跨越不同网络进行数据通信。
  1. 工作方式不同:交换机在局域网中实现设备之间的直接通信,它们可以通过 MAC 地址找到需要通信的设备;而路由器在不同网络之间实现设备之间的通信,它们可以通过 IP 地址找到需要通信的目的地。

02 物理层有什么协议

网线、网口、水晶头

IEEE 802标准

03 交换机怎么区分二层转发和三层转发

  1. 端口类型:交换机上的端口可以分为访问端口和特殊端口。访问端口只能进行二层转发,而特殊端口可以进行二层和三层转发。通过配置特殊端口,可以实现交换机的三层转发功能。
  1. VLAN:交换机上可以配置 VLAN(虚拟局域网),将不同的物理端口划分到不同的虚拟局域网中。在 VLAN 的配置中,可以指定 VLAN 的二层或三层转发模式,从而实现交换机的三层转发功能。
  1. 路由器接口:交换机可以将某个端口配置为路由器接口,使其能够连接到路由器。通过路由器接口,交换机可以进行三层转发,实现不同网络之间的通信。

04 netlink知道么

Netlink是Linux内核中用于进程与内核之间通信的一种机制。Netlink可以被看作是Linux内核提供的一种全双工、异步的网络套接字,它不仅仅用于内核与用户空间之间的通信,还可以用于内核模块之间的通信。Netlink是Linux内核中非常重要的组件,许多用户空间程序(如ifconfig、route、ip等)都是通过Netlink与内核进行通信的。

Netlink提供了多种不同的协议族(Protocol Family)来支持不同的内核子系统,例如网络配置、路由、套接字、文件系统等。每个协议族都有自己的协议类型(Protocol Type),不同的协议类型之间可以进行不同的操作,例如添加或删除路由表项、配置网络接口等。

Netlink的特点包括:

  1. 异步通信:Netlink使用异步通信方式,内核和用户空间之间可以同时进行数据传输,不需要等待对方的响应。
  1. 多路复用:Netlink可以使用多路复用机制,将多个Netlink套接字合并到一个文件描述符集合中,方便用户程序进行管理。
  1. 高效性:Netlink采用二进制协议格式,相比于文本格式协议,可以减少数据传输的大小,提高效率。
  1. 安全性:Netlink提供了访问控制机制,可以控制哪些进程可以使用Netlink进行通信。

在Linux内核中,Netlink被广泛应用于网络配置、路由、网络安全等方面,通过Netlink可以方便地与内核进行通信,实现网络相关功能的管理和配置。同时,Netlink也可以被用于用户空间程序与内核模块之间的通信。

05 交换机数据传输怎么知道传输到对应的端口

在交换机中,数据传输到对应的端口是通过交换机的MAC地址表实现的。交换机会维护一个MAC地址表,用于记录设备的MAC地址与所连接的端口之间的对应关系。

当交换机收到一帧数据时,它会检查数据包中的目标MAC地址。它会在MAC地址表中查找该目标MAC地址对应的端口。如果该MAC地址已经存在于MAC地址表中,交换机将会将数据包转发到对应的端口,以便数据包能够被正确地交付给目标设备。

如果目标MAC地址不在MAC地址表中,交换机将进行广播(broadcast)操作。它会将数据包广播到所有其他端口,以便寻找目标设备。当目标设备响应后,交换机会学习到该设备的MAC地址,并将其记录在MAC地址表中,以便以后能够直接发送数据到目标设备所在的端口而不需要再进行广播。

通过不断地学习和更新MAC地址表,交换机能够有效地将数据包转发到正确的端口,实现网络中设备之间的通信。这种方式可以确保数据传输到对应的端口,并避免了数据在网络中的广播带来的冗余和拥堵。

需要注意的是,MAC地址表是根据数据包的源MAC地址和交换机所收到的数据包来动态学习和维护的。当网络中设备发生变化或新设备加入时,交换机会更新MAC地址表以反映最新的网络拓扑结构。

五、综合

01 DNS解析过程

浏览器缓存  =》  操作系统缓存  =》根dns服务器  =》  顶级域名服务器  =》  权威域名服务器 =》 ip地址  =》  缓存

浏览器首先看一下自己的缓存里有没有,如果没有就向操作系统的缓存要,还没有就检查本机域名解析文件 hosts,如果还是没有,就会 DNS 服务器进行查询,查询的过程如下:

  1. 客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并发给本地 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址)。
  1. 本地域名服务器收到客户端的请求后,如果缓存里的表格能找到 www.server.com,则它直接返回 IP 地址。如果没有,本地 DNS 会去问它的根域名服务器:“老大, 能告诉我 www.server.com 的 IP 地址吗?” 根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
  1. 根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:“www.server.com 这个域名归 .com 区域管理”,我给你 .com 顶级域名服务器地址给你,你去问问它吧。”
  1. 本地 DNS 收到顶级域名服务器的地址后,发起请求问“老二, 你能告诉我 www.server.com 的 IP 地址吗?”
  1. 顶级域名服务器说:“我给你负责 www.server.com 区域的权威 DNS 服务器的地址,你去问它应该能问到”。
  1. 本地 DNS 于是转向问权威 DNS 服务器:“老三,www.server.com对应的IP是啥呀?” server.com 的权威 DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。
  1. 权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。
  1. 本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。

至此,我们完成了 DNS 的解析过程。现在总结一下,整个过程我画成了一个图。

www.baidu.com和baidu.com为啥都可以被识别到

这两个域名被配置为指向同一个服务器

02 URL解析过程

http、dns   =>  tcp   => ip  =>  mac  =>  网卡  =》  交换机、路由器  =》  解析mac头部  =》  解析ip头部  =》  解析tcp头部  =》 获得http请求,进行http响应  =》 浏览器收到响应,渲染

1 用户输入 URL 地址。
2 对 URL 地址进行 DNS 域名解获得IP地址。
3 建立 TCP 连接(三次握手)。
4 浏览器向 web 服务器发送一个 HTTP 请求报文。
5 服务器返回 HTTP 响应报文给客户端。
6 关闭 TCP 连接(四次挥手)。
7 浏览器解析文档资源并渲染页面。

03 网络模型

OSI七层模型

OSI七层网络模型指的是开放式系统互联通信参考模型,它将计算机网络体系结构划分为七个抽象层,每一层都有特定的功能、任务和协议。以下是每个层次的简要介绍:

  1. 物理层(Physical Layer):物理层定义了如何在传输介质上传输比特流。其主要功能包括:数据传输速率、数据传输方式、电压等级、连接器类型等。    RS232
  1. 数据链路层(Data Link Layer):数据链路层负责将物理层的比特流转换成具有逻辑意义的帧,以及进行错误检测和纠正。其主要功能包括:封装成帧、透明传输、错误检测和纠正等。相邻节点
  1. 网络层(Network Layer):网络层提供了路由选择的功能,将网络层数据包从源地址传输到目标地址。其主要功能包括:路由选择、拥塞控制和数据包分片等。
  1. 传输层(Transport Layer):传输层提供了端到端的可靠传输,为应用层提供服务,同时隐藏了下层协议的复杂性。其主要功能包括:流量控制、差错控制、分段和重组等。
  1. 会话层(Session Layer):会话层建立、管理和终止会话,使应用程序之间能够建立和维护通信状态。其主要功能包括:对话控制和同步等。RPC
  1. 表示层(Presentation Layer):表示层负责将数据进行编码和解码,使得不同计算机上的应用程序能够相互通信。其主要功能包括:数据格式化、数据加密和压缩等。  TLS/SSL
  1. 应用层(Application Layer):应用层是用户直接使用的网络服务,提供了完整的应用程序。其主要功能包括:文件传输、电子邮件、远程登录和网页浏览等。

总之,OSI七层网络模型将计算机网络体系结构划分为七个抽象层,每一层都有特定的功能和任务,通过协议栈对网络通信进行层次化策略划分,提高了网络通信的可靠性和效率。

TCP/IP为什么要分层

(27条消息) 字节一面:“为什么网络要分层?每一层的职责、包含哪些协议?”计算机网络为什么要分层致守的博客-优快云博客

  1. 「各层之间相互独立」:各层之间相互独立,各层之间不需要关心其他层是如何实现的,只需要知道自己如何调用下层提供好的功能就可以了(可以简单理解为接口调用)「。这个和我们对开发时系统进行分层是一个道理。」
  1. 「提高了整体灵活性」 :每一层都可以使用最适合的技术来实现,你只需要保证你提供的功能以及暴露的接口的规则没有改变就行了。「这个和我们平时开发系统的时候要求的高内聚、低耦合的原则也是可以对应上的。」
  1. 「大问题化小」 :分层可以将复杂的网络间题分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。这样使得复杂的计算机网络系统变得易于设计,实现和标准化。 「这个和我们平时开发的时候,一般会将系统功能分解,然后将复杂的问题分解为容易理解的更小的问题是相对应的,这些较小的问题具有更好的边界(目标和接口)定义。」

04 抓包应用

  • tcpdump
  • wireshark
### 计算机网络面试常见问题及标准答案 #### 1. TCP 和 UDP 的区别是什么? TCP (Transmission Control Protocol) 是一种面向连接的协议,提供可靠的数据传输服务。UDP (User Datagram Protocol) 则是一种无连接的协议,不保证数据包按顺序到达或成功送达。 - **可靠性**:TCP 提供可靠的字节流服务,确保数据完整性和有序性;而 UDP 不保证数据包一定能够到达目的地[^4]。 - **速度**:由于 TCP 建立连接的过程较为复杂(三次握手),因此其开销较大,相对而言 UDP 更加轻量级,在某些场景下可以更快地发送数据[^4]。 - **应用场景**:对于实时性强的应用程序来说,如视频会议、在线游戏等通常会选择使用 UDP 协议;而对于文件下载这类对数据准确性有较高要求的服务,则更适合采用 TCP 协议[^4]。 ```java // Java 中创建 TCP Socket 连接 Socket socket = new Socket("example.com", 80); ``` #### 2. HTTP 请求的工作流程是怎样的? 当用户访问站时,浏览器会向服务器发起 HTTP 请求: - 浏览器构建请求报文并将其封装成 IP 数据包; - 客户端操作系统通过 DNS 解析域名得到目标主机 IP 地址; - 使用该地址建立到 Web Server 的 TCP 连接; - 发送 GET 或 POST 方法对应的 URL 及其他参数给对方; - 接收来自服务器返回的状态码以及实体主体部分的内容; - 断开连接结束本次交互过程[^5]。 ```http GET /index.html HTTP/1.1 Host: www.example.org Connection: close ``` #### 3. 如何理解 RTO 的 Jacobson/Karels 算法? RTO (Retransmission Timeout)重传超时时长算遵循 Jacobson/Karels 算法。此算法旨在动态调整每次重新尝试之前等待的时间间隔,以适应当前络状况的变化情况。具体做法如下: - 首先基于已有的样本估算平均往返时间 SRTT(Smoothed Round Trip Time)[^1]; - 同时记录偏差值 RTTVAR(RTT Variance),用来衡量实际测量值偏离预期的程度; - 根据上述两个指标设定合理的初始超时期限 RTO= SRTT + max(G, K*RTTVAR),其中 G,K 分别代表最小门限时间和比例系数[^6]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值