i

iCurry

V1

2023/03/22阅读:18主题:默认主题

计算机网络

1. 说下 ARP 协议的工作过程?

​ ARP(Address Resolution Protocol) 地址解决协议 。

​ 主要功能为:以IP地址为线索,通过ARP请求包和ARP响应包来确定下一个应该接收数据分包的网络设备对应的 MAC地址。

​ 其通信过程如下:1、主机A希望和主机B (IP :172.168.0.1)通信 。(主机A会通过广播发送一个ARP请求包)

​ 2、主机A 发送ARP请求包,包的内容大致为IP : 172.168.0.1 MAC = ? 。(同一链路上的所有主机都会收到该ARP请求包)

​ 3、主机B收到主机A发送的ARP请求包。(主机B在收到ARP请求包,会将包中的IP地址与自己的IP地址相匹配,若相同则准备发送ARP响应包,若不相同,则丢弃。)

​ 4、主机B向主机A发送ARP响应包 ,内容大致为IP :为172.168.0.1 的 MAC地址为 (具体地址)。

备注:ARP 请求包还有一个作用,就是把自己的MAC地址告诉对方。

疑问:主机A是如何知道主机B发送的响应包是发送给自己的?

2. ICMP 协议的功能?

​ ICMP (Internet Control Message Protocol ) 网络控制报文协议

​ ICMP的主要功能 :1、确认 IP 是否成功送达目标地址

​ 2、通知在发送过程中IP包被废弃的具体原因,改善网络设置。

​ 基于以上功能,ICMP可以做到 判断网络是否正常、设置是否有误、设备具体的异常信息,便于进行问题诊断。

​ ICMP 包的内容 大致分为两类。 1、通知出错原因的消息 。 2、用于诊断的查询消息。

3. IP 协议的定义和作用?

​ IP协议的定义 :

​ IP协议的作用 : 因为IP协议的存在,使得消息可以跨越不同的数据链路,在不同的数据链路上也可以实现不同

节点间的数据包传输。

4. 详细说一下 TCP 的三次握手机制。

​ TCP 建立连接是通过三次握手完成的,即可以认为 当完成三次握手后,客户端和服务端都处于 ESTABLISHED 状态下,TCP 连接建立 完成 ,可以进行通讯。

​ 其建立连接的过程大致如下

​ 1、 初始,客户端和服务端都处于Close 状态 。但服务端会监听某些端口,此时的服务端可以认为是处于 Listen 状态。

​ 2、 客户端发送 SYN 报文,表示向服务端请求建立连接 (此报文除必要的头部信息外,不携带其他数据)。客户端发送报文时,会随机初始化自己的序列号(Client_isn),并把SYN 标志位记为1。 此时客户端处于 SYN_SENT 状态。

​ 3、 服务端在收到客户端发送的 SYN 报文后,也随机初始化自己的 序列号 (server_isn),同时把TCP首部的 确认应答号 设置为 Client_isn + 1. 并把 标志位的 ACK 和 SYN 设置为 1。 然后将报文 发送给 客户端 。 此时服务端 处于 SYN_RCVD 状态。此次也不可以携带数据。

​ 4、 客户端在收到服务端的报文后,把自己的确认序列号设置为 server_isn , 并把 ACK 设置为 1 。之后 客户端将处于 ESTABLISHED 状态 。 服务端在收到 报文后 也将处于 ESTABLISHED 状态 ,此时可以认为 TCP 连接建立完成。则吃可以携带数据。

5. TCP 握手为什么是三次,为什么不能是两次?不能是四次?

​ 为什么是三次握手?

因为: 1、三次握手才可以阻止 重复历史连接的初始化。

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

​ 3、三次握手才可以避免资源浪费。

1、为什么三次握手能阻止 重复历史连接的初始化 ?

​ 我们不妨设想一个这样的场景。 当 客户端 给服务端发送一个 SYN (SYN = 50)报文。紧接着 客户端待机了,而且 该报文还被网络阻塞了。当 客户端重启后,又发送了一个新的 SYN (SYN = 100) 报文 。 (此为前提)

​ 假设 服务端 先收到 旧的 SYN ( SYN = 50 ), 在服务端收到 SYN 报文后,会向 客服端发送一个 SYN(50+1) + ACK 报文 。

​ 客户端收到报文后 发现自己希望收到确认号 是 101 (100+1), 不是 51,此时 客户端会发送 RST 报文,将 RST 置为 1。

​ 服务端收到 RST 报文 后 就会断开连接。后续就是新的 SYN 报文到达 服务端,服务端 与 客户端 经过 三次握手 建立起连接。

备注 : 如果 服务端在收到 RST 报文前 先收到了 新的 SYN 报文 会怎么样?

​ 如果 服务端收到新的 SYN 报文 ,并不会发送新的 确认号 ,而是发送先前发送过的确认号。当 客户端收到确认号 与自己期望的报文号不一致的时候,就会 接着向服务单 发送 RST 报文 。

​ 如果是两次握手是怎么样的?

​ 客户端 向 服务端 发送报文 。由于是两次握手,因此 在服务端收到 客户端 发送的 SYN 报文后 ,立刻进入 ESTABLISHED 状态。 此时 服务端可以向 客户端发送数据, 但此时的 客户端 还未处于 ESTABLISHED 状态,假设这次连接是上文提到的连接,客户端在判断为历史连接后,会向 服务端 发送 RST 报文 ,服务端 在收到 RST 报文后才会终止连接。但 在终止连接前 服务端 已经处于 ESTABLISHED 状态,甚至还有可能已经向客户端发送了数据。由此可见,两次握手 是有可能浪费掉大量的网络资源,同时 还不能阻止可能发生的历史连接的初始化

2、为什么三次握手可以同步双方的初始序列号。

​ 序列号是保证 TCP 能够 可靠传输协议的 重要因素。

​ 有了序列号 : 1、接收方可以去除重复的数据

​ 2、接收方可以根据数据包的序列号按顺序接收。

​ 3、可以标识发送出去的数据包中,哪些是已经被对方接收到呢。(通过 ACK 报文中的序列号可以得知) 。

​ 由此可以看出 序列号 在 TCP 协议中的重要性,因此有必要确定 双方是否 收到了序列号。

不妨模拟下 客户端 和服务端 是如何 确保 对方是否收到 序列号的。

​ 1、 客户端向 服务端 发送 SYN 报文。

​ 2、 服务端 在接收到 客户端 的 SYN 报文后, 向 客户端 发送 ACK 报文 ,告知 客户端 自己已经收到 了 客户端发送的 SYN 报文。

​ 3、服务端 向 客户端 发送 SYN 报文。

​ 4、客户端 在收到 服务端 的 SYN 报文后 ,向服务端发送 ACK 报文 ,告知 服务端 自己已经收到了 服务端 发送的 SYN 报文。

​ 以上就是 客户端 、 服务端 双方 为了 确定 各自的 序列号 而产生的四次 握手

​ 2、3 两步是可以同时完成的,这也就是 三次握手中 ,服务端 向客户端 发送的 SYN + ACK 报文。

​ 但 两次握手是没有办法确定客户端和服务端双方是否收到了各自的序列号。

3、 三次握手可以避免资源浪费。

​ 假设是两次握手。

​ 客户端向服务端 发送 SYN 报文,但 SYN 报文在网络中被阻塞。客户端 收不到 ACK 报文 就会 重发 SYN 报文。这样 客户端就有可能发送很多个 SYN 报文。 而由于是 两次握手,服务端在收到 SYN 报文后,就会 主动建立起一个连接。由于 客户端发送了很多个 相同的 SYN 报文, 服务端就会建立起很多个连接 ,这样就造成网络资源的极大浪费。

总而言之 :

[ 两次握手 ] : 无法阻止历史连接的建立 ,无法保证 双方都收到对方的序列号,会造成网络资源的浪费。

[ 四次握手 ] : 三次握手就已经能完成要求,建立起可靠的连接,没必要进行四次握手。

ㅤㅤ

ㅤㅤ

ㅤㅤ

ㅤㅤ

ㅤㅤ

ㅤㅤ

ㅤㅤ

ㅤㅤ

分类:

后端

标签:

后端

作者介绍

i
iCurry
V1