计算机网络面试

目录)

TCP三次握手

为什么网络要分层?

网络分层的原则:每一层独立于其它层完成自己的工作,而不需要相互依赖,上下层之间通 过标准结构来互相通信,简单易用又具有拓展性。复杂的系统需要分层,因为每一层都需要专注于一类事情。我们的网络分层的原因也是一 样,每一层只专注于做一类事情。

OSI 参考模型与 TCP/IP 的关系

在这里插入图片描述
1、应用层

网络的具体应用

应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程间的通信和交互的规则。

应用层协议:域名系统DNS,支持万维网应用的 HTTP协议

我们把应用层交互的数据单元称为报文。

域名系统:它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。

HTTP协议: 超文本传输协议是互联网上应用最为广泛的一种网络协议。所有的 WWW(万维网) 文件都必须遵守这个标准

2、 表示层

表示层主要对接收的数据进行解释、加密、解密等,把计算机能够识别的内容转换成人能够识别的内容(图片、声音、文字)

3、会话层

在传输层的基础上建立连接和管理会话。

2、 运输层

运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。

运输层主要使用以下两种协议:

  • 传输控制协议 TCP(Transmission Control Protocol)–提供面向连接的,可靠的数据传输服务。
  • 用户数据协议 UDP(User Datagram Protocol)–提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。

3、网络层

在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。

在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报 ,简称 数据报。

4、数据链路层

两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。

在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。

5、物理层

在物理层上所传送的数据单位是比特

物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异, 使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。

HTTP 是哪一层的协议?http常见的状态码

HTTP 协议 属于应用层的协议。

HTTP 协议是基于 TCP 协议的,发送 HTTP 请求之前首先要建立 TCP 连接也就是要经历 3 次握手。目前使用的 HTTP 协议大部分都是 1.1。在 1.1 的协议里面,默认是开启了 Keep-Alive 的,这样的话建立的连接就可以在多次请求中被复用了。

另外, HTTP协议是无状态的协议,它无法记录客户端用户的状态一般我们都是通过Session 来记录客户端用户的状态。

301 永久性重定向
302 临时性重定向
4xx 客户端错误
500 服务器错误

HTTP 和 HTTPS 什么区别?

1、 端口80 , 443

2、安全性和资源消耗:HTTP 安全性没有 HTTPS高,但是 HTTPS 比HTTP耗费更多服务器资源。

  • HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。
  • ==HTTPS是运行在SSL之上的HTTP协议,SSL运行在TCP之上。==所有传输的内 容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。

讲一下对称加密算法和非对称加密算法?

对称加密密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称 加密算法有DES、AES等;

非对称密钥加密: 加密和解密使用不同的密钥。通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。可以更安全地将公开密钥传输给通信发送方;运算速度慢。典型的非对称加密算法有RSA、DSA等

HTTPS 采用的加密方式: HTTPS 采用混合的加密机制。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。

HTTP2.0讲一下

HTTP1.x有以下几个主要缺点:

  • HTTP/1.0一次只允许在一个TCP连接上发起一个请求,HTTP/1.1使用的流水线技术也只能部分处理请求并发,仍然会存在队列头阻塞问题,因此客户端在需要发起多次请求时,通常会采用建立多连接来减少延迟。
  • 单向请求,只能由客户端发起。
  • 请求报文与响应报文首部信息冗余量大
  • 数据未压缩,导致数据的传输量大

HTTP2.0

二进制帧:HTTP/2 厉害的地方在于将 HTTP/1 的文本格式改成二进制格式传输数据,极大提高了 HTTP 传输效率,而且二进制数据使用位运算能高效解析。

并发传输:HTTP/1.1 的实现是基于请求-响应模型的。同一个连接中,HTTP 完成一个事务(请求与响应),才能处理下一个事务,也就是说在发出请求等待响应的过程中,是没办法做其他事情的,如果响应迟迟不来,那么后续的请求是无法发送的,也造成了队头阻塞的问题。

HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。NIO

数据压缩:HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。

服务器推送:HTTP/1.1 不支持服务器主动推送资源给客户端,都是由客户端向服务器发起请求后,才能获取到服务器响应的资源。

当我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。

服务器端推送的这些资源其实存在客户端的某处地方,客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的。

在这里插入图片描述
在这里插入图片描述

HTTP报文详解?详细说一下请求报文,以及HTTP和TCP的区别

HTTP有两种报文:请求报文响应报文

HTTP请求报文主要包括请求行请求头部以及请求的数据(实体)三部分

  • 请求行(HTTP请求报文的第一行)请求行由方法字段、URL字段和HTTP协议版本字段。其中,方法字段严格区分大小写,当前HTTP协议中的方法都是大写,

  • 请求头部:位于请求行的下面, 是一个个的key-value值

  • 空行(CR+LF):请求报文用空行表示header和请求数据的分隔 请求数据:GET方法没有携带数据, POST方法会携带一个body

在这里插入图片描述

HTTP的响应报文包括:状态行响应头部相应的数据(响应体)

  • 状态行包括HTTP版本号,状态码和状态值组成。
  • 响应头:类似请求头,是一系列key-value值。是客户端可以使用的一些信息,如:Date(生成响应的日期)、Content-Type(MIME类型及编码格式)、Connection(默认是长连接)等等
  • 空白行:同上,响应报文也用空白行来分隔header和数据
  • 响应体:响应的数据

在这里插入图片描述

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

HTTP协议采用请求/响应模式,客户端向服务器发送一个请求报文,然后服务器响应请求。下面介绍一下一次HTTP请求的过程:

  1. 在浏览器中输入URL,并按下回车键
  2. 浏览器向DNS服务器请求解析该URL中的域名对应的IP地址(如果是IP请求,则不需要该步骤)
  3. 解析出IP后,根据IP和端口号,和服务器建立TCP连接
  4. 浏览器向服务器发送请求,该请求报文作为TCP三次握手的第三个报文发送给服务器
  5. 服务器做出响应,把数据发送给浏览器
  6. 通信完成,断开TCP连接
  7. 浏览器解析收到的数据并显示

HTTP长连接和短连接区别及应用场景

1、HTTP短连接

在 HTTP/1.0 中默认使用短连接。也就是说,客户端和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。

当客户端浏览器访问的某个 HTML 或其他类型的 Web 页中包含有其他的 Web 资源(如 JavaScript 文件、图像文件、CSS 文件等),每遇到这样一个 Web 资源,浏览器就会重新建立一个 HTTP 会话。

应用场景: WEB 网站的 http 服务一般都用短链接

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

2.HTTP长连接

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

Connection:keep-alive

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据 的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。

Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如 Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。 HTTP 协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接。

长连接的优缺点:

  • 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间
  • 对于频繁请求资源的客户来说,较适用长连接

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

TCP三次握手的过程,以及三次握手的原因?

假设 A 为客户端,B 为服务器端。

首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。

A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。

B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y。

A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。B 收到 A 的确认后,连接建立。

三次握手的目的是建立可靠的通信信道,三次握手最主要的目的就是双方确认自己与对方的 发送与接收是正常的。

第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。

TCP四次挥手的过程,以及四次挥手的原因?

假设 A 为客户端,B 为服务器端。

A 发送连接释放报文,FIN=1。

B 收到之后发出确认,它发回一 个 ACK确认报文,确认序号为收到的序号加1。此时TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。

当 B 不再需要连接时,发送连接释放报文,FIN=1。

A 收到后发出ACK 确认报文,并将确认序号设置为收到序号加1,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。

B 收到 A 的确认后释放连接。

CLOSE-WAIT 状态问题:

客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送FIN 连接释放报文。

TIME-WAIT 状态问题:

客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:

  • 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。

  • 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一 个新的连接不会出现旧的连接请求报文。
    通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态。

域名解析的工作流程

在这里插入图片描述
在这里插入图片描述

在浏览器中输入url地址 ->> 显示主页的过程(面试常客)

在这里插入图片描述

在这里插入图片描述

TCP 传输数据之前,要先三次握手建立连接

在这里插入图片描述
一开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态

1、客户端会随机初始化序列号(seq=x),同时把SYN标志位置1,表示SYN报文,接着把第一个SYN报文发送给服务端,表示向服务端发起连接,之后客户端处于SYN-SENT状态。
在这里插入图片描述

2、服务端收到客户端SYN报文后,首先服务端也随机初始化自己的序列号(seq=y),将此序号填入TCP首部的序列号字段种中,其次TCP首部的确认应答号字段填入客户端的序列号+1(ack=x+1),ACK、SYN标志位置1,最后把报文发给客户端,该报文也不包含应用层数据,之后服务端处于SYN-RCVD状态。
在这里插入图片描述
3、客户端收到服务端报文后,还要向服务端回应最后一个应答报文(服务端的确认号:seq=x+1),ACK标志位置1确认应答号字段填入服务端的序列号+1(ack=y+1),最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED 状态。

服务器收到客户端的应答报文后,也进入 ESTABLISHED 状态。

在这里插入图片描述

为什么是三次握手?不是两次、四次?

三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的

第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常

第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常

第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常

所以三次握手就能确认双发收发功能都正常,缺一不可。

相信大家比较常回答的是:“因为三次握手才能保证双方具有接收和发送的能力


接下来以三个方面分析三次握手的原因:

  • 三次握手才可以阻止历史重复连接的初始化(主要原因)

  • 三次握手才可以同步双方的初始序列号

  • 三次握手才可以避免资源浪费

原因一:避免历史连接

三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。

网络环境是错综复杂的,往往并不是如我们期望的一样,先发送的数据包,就先到达目标主机,反而它很骚,可能会由于网络拥堵等乱七八糟的原因,会使得旧的数据包,先到达目标主机,那么这种情况下 TCP 三次握手是如何避免的呢?

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

四次挥手(TCP 连接断开)

在这里插入图片描述
1、客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1 状态。

2、服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSED_WAIT 状态。

客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。

3、等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。

4、客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态

服务器收到了 ACK 应答报文后,就进入了 CLOSE 状态,至此服务端已经完成连接的关闭。

客户端在经过 2MSL 一段时间后,自动进入 CLOSE 状态,至此客户端也完成连接的关闭。

为什么挥手需要四次?

再来回顾下四次挥手双方发 FIN 包的过程,就能理解为什么需要四次了。

  • 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。

  • 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。

从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般都会分开发送,从而比三次握手导致多了一次。

为什么 TIME_WAIT 等待的时间是 2MSL?

MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

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

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

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

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

为什么需要 TIME_WAIT 状态?

主动发起关闭连接的一方,才会有 TIME-WAIT 状态。

TIME_WAIT 状态的连接,在主动方看来确实快已经关闭了。然后,被动方没有收到 ACK 报文前,还是处于 LAST_ACK 状态。

  • 防止具有相同「四元组」的「旧」数据包被收到;

  • 保证「被动关闭连接」的一方能被正确的关闭,即保证最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭;

原因一:防止旧连接的数据包
在这里插入图片描述
所以,TCP 就设计出了这么一个机制,经过 2MSL 这个时间,足以让两个方向上的数据包都被丢弃,使得原来连接的数据包在网络中都自然消失,再出现的数据包一定都是新建立连接所产生的。

原因二:保证连接正确关闭

也就是说,TIME-WAIT 作用是等待足够的时间以确保最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭。

在这里插入图片描述
如果 TIME-WAIT 等待足够长的情况就会遇到两种情况:

服务端正常收到四次挥手的最后一个 ACK 报文,则服务端正常关闭连接。

服务端没有收到四次挥手的最后一个 ACK 报文时,则会重发 FIN 关闭连接报文并等待新的 ACK 报文。

所以客户端在 TIME-WAIT 状态等待 2MSL 时间后,就可以保证双方的连接都可以正常的关闭。

如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP 有一个机制是保活机制。这个机制的原理是这样的:

定义一个时间段,在这个时间段内,如果没有任何连接相关的活动,TCP 保活机制会开始作用,每隔一个时间间隔,发送一个探测报文,该探测报文包含的数据非常少,如果连续几个探测报文都没有得到响应,则认为当前的 TCP 连接已经死亡,系统内核将错误信息通知给上层应用程序。

说一下 tcp 粘包是怎么产生的?

1、发送方产生粘包
在这里插入图片描述

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

TCP重传

在这里插入图片描述
常见的重传机制:

  • 超时重传
  • 快速重传
  • SACK
  • D-SACK

在这里插入图片描述
在这里插入图片描述
如果超时重发的数据,再次超时的时候,又需要重传的时候,TCP 的策略是超时间隔加倍

也就是每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送

超时触发重传存在的问题是,超时周期可能相对较长。那是不是可以有更快的方式呢?

于是就可以用「快速重传」机制来解决超时重发的时间等待。

在这里插入图片描述
所以,快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。

快速重传机制只解决了一个问题,就是超时时间的问题,但是它依然面临着另外一个问题。就是重传的时候,是重传之前的一个,还是重传所有的问题。

为了解决不知道该重传哪些 TCP 报文,于是就有 SACK 方法。

在这里插入图片描述
在这里插入图片描述
可见,D-SACK 有这么几个好处:

  • 可以让「发送方」知道,是发出去的包丢了,还是接收方回应的 ACK 包丢了;
  • 可以知道是不是「发送方」的数据包被网络延迟了;
  • 可以知道网络中是不是把「发送方」的数据包给复制了;

滑动窗口

引入窗口概念的原因
在这里插入图片描述
为解决这个问题,TCP 引入了窗口这个概念。即使在往返时间较长的情况下,它也不会降低网络通信的效率。

在这里插入图片描述
TCP 头里有一个字段叫 Window,也就是窗口大小。

这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。

在这里插入图片描述
在这里插入图片描述

流量控制

发送方不能无脑的发数据给接收方,要考虑接收方处理能力。

如果一直无脑的发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费。

为了解决这种现象发生,TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制。

在这里插入图片描述
窗口关闭

在前面我们都看到了,TCP 通过让接收方指明希望从发送方接收的数据大小(窗口大小)来进行流量控制。

如果窗口大小为 0 时,就会阻止发送方给接收方传递数据,直到窗口变为非 0 为止,这就是窗口关闭。
在这里插入图片描述
TCP 是如何解决窗口关闭时,潜在的死锁现象呢?
在这里插入图片描述

拥塞控制

在这里插入图片描述
那么怎么知道当前网络是否出现了拥塞呢?

其实只要「发送方」没有在规定时间内接收到 ACK 应答报文,也就是发生了超时重传,就会认为网络出现了用拥塞

拥塞控制有哪些控制算法?

  • 慢启动
  • 拥塞避免
  • 拥塞发生
  • 快速恢复
  1. 慢启动

在这里插入图片描述
拥塞避免算法

有一个叫慢启动门限 ssthresh (slow start threshold)状态变量。

当 cwnd < ssthresh 时,使用慢启动算法。

当 cwnd >= ssthresh 时,就会使用「拥塞避免算法」。

在这里插入图片描述
所以,我们可以发现,拥塞避免算法就是将原本慢启动算法的指数增长变成了线性增长,还是增长阶段,但是增长速度缓慢了一些。

就这么一直增长着后,网络就会慢慢进入了拥塞的状况了,于是就会出现丢包现象,这时就需要对丢失的数据包进行重传。

当触发了重传机制,也就进入了「拥塞发生算法」。

拥塞发生

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

  • 超时重传

  • 快速重传

在这里插入图片描述
在这里插入图片描述

TCP 协议如何保证可靠传输

  1. 应用数据被分割成 TCP 认为最适合发送的数据块。
  2. TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
  3. 校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
  4. TCP 的接收端会丢弃重复的数据。
  5. 流量控制: TCP 连接的每一方都有固定大小的缓冲空间, TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。 TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
  6. 拥塞控制: 当网络拥塞时,减少数据的发送。
  7. ARQ协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
  8. 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

ARQ协议

自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层和传输层的错误纠正协议之一。它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认帧,它通常会重新发送。 ARQ包括停止等待ARQ协议和连续ARQ协议。

停止等待ARQ协议

停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认(回复ACK)。如果过了一段时间(超时时间后),还是没有收到 ACK 确认,说明没有发送成功,需要重新发送,直到收到确认后再发下一个分组。

在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认。

连续ARQ协议

连续 ARQ 协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。

缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。 比如:发送方发送了 5条 消息,中间第三条丢失(3号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫 Go-Back-N(回退 N),表示需要退回来重传已经发送过的 N 个消息。

TCP滑动窗口是干什么的?TCP的可靠性体现在哪里?拥塞控制如何实现的?

TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。

滑动窗口:窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接 收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。

发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。接收窗口只会对窗口内 最后一个按序到达的字节进行确认。如果发送窗口内的字节已经发送并且收到了确认,那么 就将发送窗口向右滑动一定距离,直到第一个字节不是已发送并且已确认的状态;接收窗口 的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向滑动接收窗口。

流量控制如何实现:流量控制是为了控制发送方发送速率,保证接收方来得及接收。

接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送 速率。将窗口字段设置为 0,则发送方不能发送数据。

拥塞控制:如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞 程度更高。因此当出现拥塞时,应当控制发送方的速率。TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。

发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量。

  • 慢开始: 慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。 经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd初始值为1,每经过一个传播轮次,cwnd加倍。

  • 拥塞避免: 拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送放的cwnd加1.

  • 快重传与快恢复: 在 TCP/IP 中,快速重传和恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包。没有 FRR,如果数据包丢失了,TCP 将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。==有了 FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。==有了 FRR,就不会因为重传时要求的暂停被耽误。当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。


1. 慢开始与拥塞避免

发送的最初执行慢开始,令拥塞窗口大小为1,发送方只能发送1个报文段;当收到确认后,将拥塞窗口大小加倍。设置一个慢开始门限,当 拥塞窗口的大小大于慢开始门限 时,进入拥塞避免,每个轮次只将拥塞窗口加1。如果出现了超时,则令慢开始门限 = 拥塞窗口大小 / 2,然后重新执行慢开始。

2. 快重传与快恢复

在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。在 发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传, 立即重传下一个报文段。在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此 执行快恢复,令慢开始门限 = 拥塞窗口大小 / 2 ,拥塞窗口大小 = 慢开始门限 ,注意到此时直接进入拥塞避免。

TCP和UDP有什么区别?及其适用的场景。

用户数据报协议 UDP 是无连接的,远地主机在收到 UDP 报文后,不需要给出任何确认。 尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。

传输控制协议 TCP 在传送数据之前必须先建立连接,数据传送结束后要释放连接。 是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数 据块),每一条 TCP 连接只能是点对点的(一对一)。

​ TCP应用场景:

效率要求相对低,但对准确性要求相对高的场景。因为传输中需要对数据确认、重发、 排序等操作,相比之下效率没有UDP高。举几个例子:文件传输、接受邮件、远程登录、

UDP应用场景:

效率要求相对高,对准确性要求相对低的场景。举几个例子:QQ聊天、在线视频、网络语音电话、广播通信(广播、多播)。

UDP为何快?

  • 不需要建立连接
  • 对于收到的数据,不用给出确认
  • 没有超时重发机制
  • 没有流量控制和拥塞控制

udp如何实现可靠性传输?

实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。

实现确认机制重传机制窗口确认机制

Mac 地址和 ip 地址的区别?既然有了 Mac 地址,为什么还要 ip 地址呢?

MAC地址是烧录在网卡或者接口上的物理地址,具有全球唯一性,一般不能被改变。

IP地址是网络中的主机或接口在网络中的逻辑地址,在同一个网络内具有唯一性

当你打开一个电商网站,都需要经历哪些过程?分别用到了什么协议。

  1. 浏览器查找域名的IP地址 (DNS:获取域名对应的IP)
  2. 浏览器向web服务器发送HTTP请求(cookies会随着请求发送给服务器)
  3. 服务器处理请求 (请求 处理请求参数、cookies、生成一个HTML响应)
  4. 服务器返回HTTP报文,发回一个HTML响应。
  5. 浏览器解析渲染页面,浏览器开始显示HTML。
  6. 连接结束

使用的协议:
DNS: 获取域名对应的IP

TCP: 与服务器建立TCP连接

IP: 建立TCP协议时,需要发送数据,发送数据在网络层上使用IP协议

OSPF:IP数据包在路由器之间,路由选择使用OSPF协议

ARP:路由器在与服务器进行通信的过程中,将IP地址转换成MAC地址

HTTP:客户端浏览器与Web服务器之间的应用层通信协议,在TCP建立完成后,使用HTTP协议访问网页

电子邮件的发送过程?

一个电子邮件系统由三部分组成:用户代理、邮件服务器以及邮件协议。
邮件协议包含发送协议和读取协议,发送协议常用 SMTP,读取协议常用 POP3 和 IMAP。

  1. 用户A的邮箱是QQ邮箱,他要发往的邮箱是163邮箱,用户A写好一封邮件点击发送, 即提交到了QQ邮箱服务器,使用的是SMTP协议。
  2. QQ邮箱会对A发送邮件的收件地址进行解析,判断是否为内部邮箱的账号,如果也是QQ邮箱,会直接存储到自己的存储空间,如果不是则会发送到指定邮箱服务器,使用 的也是SMTP协议。
  3. 163的邮箱服务器收到邮件后会再次判断该邮件是否为自己的邮件,如果是则存到自己的存储空间,等待POP3服务去读取邮件。
  4. 用户B收到消息后,打开客户端访问163服务器,调用POP3服务。
  5. Pop3服务接到指令后,读取存储空间中发送给B的未读邮件服务。
  6. 将读取到的邮件返回给客户端软件。

DNS解析过程,DNS劫持了解吗?

DNS完成的工作是:域名到IP地址的解析。将域名和IP地址相互映射的一个分布式数据库。

第一步:客户机提出域名解析请求,并将该请求发送给本地域名服务器。

第二步:当本地域名服务器收到请求后,就先查询本地缓存,如果有该记录项,则本地域名服务器就直接把查询结果返回。

第三步:如果本地缓存中没该记录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根子域)主域名服务器地址。

第四步:本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自 己的缓存,如果没该纪录,则返回相关下级域名服务器地址。

第五步:重复第四步,直到找到正确纪录。

第六步:本地域名服务器把返回结果保存到缓存,以备下一次使用,同时还将结果返回给客 户机。

DNS劫持:在DNS服务器中,将www…com的域名对应的IP地址进行了变化。你解析出来的域名对应的IP,在劫持前后不一样。

HTTP劫持:你DNS解析的域名的IP地址不变。在和网站交互过程中的劫持了你的请求。在网站发给你信息前就给你返回了请求。

DNS在区域传输的时候使用TCP协议,其他时候使用UDP协议。

GET和POST有什么不一样

GET和POST是HTTP请求的两种基本方法

  1. GET在浏览器回退时是无害的,而POST会再次提交请求。
  2. GET产生的URL地址可以被Bookmark,而POST不可以。
  3. GET请求会被浏览器主动cache,而POST不会,除非手动设置。
  4. GET请求只能进行url编码,而POST支持多种编码方式。
  5. GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  6. GET请求在URL中传送的参数是有长度限制的,而POST么有。
  7. 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
  8. GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息
  9. GET参数通过URL传递,POST放在Request body中

session和cookie的问题?

Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式

Cookie 一般用来保存用户信息

我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了;

Session 的主要作用就是通过服务端记录用户的状态,典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。

Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果要在 Cookie 中存储一些敏感信息,不要直接写入 Cookie 中,最好能将Cookie 信息加密然后使用到的时候再去服务器端解密。

  • cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
  • session把用户的数据写到用户独占session中,服务端保存(保存重要的信息,减少服务器资源的浪费)
  • session对象由服务创建

HTTP是不保存状态的协议,如何保存用户状态?

HTTP 是一种无状态协议。HTTP 协议自身不对请求和响应之间的通信状态进行保存。主要通过session机制来进行解决,Session 的主要作用就是通过服务端记录用户的状态。典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了

在服务端保存 Session 的方法很多,最常用的就是内存和数据库(比如是使用内存数据库redis 保存)。既然 Session 存放在服务器端,那么我们如何实现 Session 跟踪呢?大部分情况下, 我们都是通过在 Cookie 中附加一个 Session ID 的方式来跟踪。

Cookie 被禁用怎么办? 最常用的就是利用 URL 把 Session ID 直接附加在URL路径的后面。

Arp协议?

Arp协议能通过接收端的ip地址解析到mac地址。

如果发送端和目标端的主机都在同一个网段,发送端发送数据帧前检查是否拥有接收端的 mac地址,如果没有,则启动arp,先检查缓存ip-mac表中是否有接收端的mac地址,如果有 则直接拿来即用,如果没有则在本网段(局域网)广播arp包,本网段各计算机都收到arp请 求,从发送来的数据中检查请求过来的ip地址与自己是否一致,如果不一致,则丢弃,如果 ip一致,则单播返回mac地址给请求的计算机,发送端便获取到了接收端的mac地址,接收 到接收端的mac地址它还会缓存一份,用于下次拿来即用。

如果请求端和目标端的主机不在同一个网段呢?arp广播的数据是被路由阻断的,不能跨到不同的网段进行广播的,因为这样广播会导致广播数据泛滥。如果不在同一个网段,则请求端 拿到的目标端的mac地址其实是它网关的mac地址,将数据帧给到网关再进行下一跳转发, 下一跳同样在自己的网段寻找到目标主机mac地址或再找到下一跳mac地址。

DDos攻击了解吗?

分布式拒绝服务,一般来说是指攻击者利用一些被控制的设备对目标网站在较短的时间内发 起大量请求,大规模消耗目标网站的主机资源,让它无法正常服务。

什么是 TCP 半连接队列和全连接队列?

在 TCP 三次握手的时候,Linux 内核会维护两个队列,分别是:

  • 半连接队列,也称 SYN 队列;
  • 全连接队列,也称 accepet 队列;

在这里插入图片描述

如何绕过三次握手?

三次握手建立连接造成的后果就是,HTTP 请求必须在一个 RTT(从客户端到服务器一个往返的时间)后才能发送。

在这里插入图片描述
在 Linux 3.7 内核版本之后,提供了 TCP Fast Open 功能,这个功能可以减少 TCP 连接建立的时延。

在这里插入图片描述
在客户端首次建立连接时的过程:

1、客户端发送 SYN 报文,该报文包含 Fast Open 选项,且该选项的 Cookie 为空,这表明客户端请求 Fast Open Cookie;
2、服务器生成Cookie,并将其置于 SYN-ACK 数据包中的 Fast Open 选项以发回客户端;
3、客户端收到 SYN-ACK 后,本地缓存 Fast Open 选项中的 Cookie。

所以,第一次发起 HTTP GET 请求的时候,还是需要正常的三次握手流程。

之后,如果客户端再次向服务器建立连接时的过程:

1、客户端发送 SYN 报文,该报文包含「数据」以及此前记录的 Cookie
2、支持 TCP Fast Open 的服务器会对收到 Cookie 进行校验:如果 Cookie 有效,服务器将在 SYN-ACK 报文中对 SYN 和「数据」进行确认。
3、如果服务器接受了 SYN 报文中的「数据」,服务器可在握手完成之前发送「数据」,这就减少了握手带来的 1 个 RTT 的时间消耗;

客户端在请求并存储了 Fast Open Cookie 之后,可以不断重复 TCP Fast Open 直至服务器认为 Cookie 无效(通常为过期)。

URI和URL的区别是什么?

  • URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。
  • URL(Uniform Resource Location) 是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

德玛西亚!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值