【面试题】网络TCP(第三篇)

1. 什么是TCP协议?

TCP(Transmission Control Protocol)即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。它由IETF的RFC 793定义,为互联网中的数据通信提供了稳定的传输机制。

2. TCP的特点是什么?

TCP的特点主要包括:

  • 面向连接:在数据传输之前需要建立连接,通信结束后会断开连接。
  • 可靠传输:通过序列号、确认应答、重传机制等技术确保数据包正确无误地从源点传送到目的地。
  • 全双工通信:允许数据在两个方向上同时传输,提高了通信效率。
  • 流量控制:通过滑动窗口机制进行流量控制,避免快速发送方压倒慢速接收方。
  • 拥塞控制:实施拥塞控制策略来避免网络拥塞,如慢启动、拥塞避免、快速重传和快速恢复等。
  • 有序传输:保证数据按发送时的顺序到达接收端。

3. TCP如何保证数据的可靠性?

TCP通过以下机制保证数据的可靠性:

  • 序列号:每个数据包都有一个唯一的编号,以便接收方可以按照正确的顺序重新组合数据。
  • 确认应答:接收方会向发送方发送确认信号,表示已经接收到数据。如果发送方没有收到确认信号,会重传数据。
  • 重传机制:当数据包在传输过程中丢失或出错时,TCP会重新发送这些数据包。

4. TCP和UDP的区别是什么?

TCP和UDP是两种不同的传输层协议,它们的主要区别包括:

  • 连接性:TCP是面向连接的协议,需要在传输数据之前建立连接;而UDP是无连接的协议,可以直接发送数据。
  • 可靠性:TCP提供可靠的数据传输服务,保证数据的顺序和完整性;UDP不提供可靠的数据传输服务,不保证数据的顺序和完整性。
  • 应用场景:TCP适用于需要可靠传输的应用场景,如文件传输、邮件发送等;UDP适用于不需要可靠传输的应用场景,如音频、视频流等。

5. TCP三次握手的过程是什么?

TCP三次握手的过程包括:

  1. 第一次握手:客户端发送一个SYN包(SYN=1,seq=x)到服务器,并进入SYN_SENT状态,等待服务器确认。
  2. 第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=1,ack=x+1),同时自己也发送一个SYN包(SYN=1,seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态。
  3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包(ACK=1,ack=y+1,seq=x+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

6.TCP三次握手为什么不是二次?

1. 防止失效的连接请求

  • 背景:假设在两次握手的情况下,客户端发送了一个连接请求(SYN包),但由于网络延迟或其他原因,这个请求在一段时间后才到达服务器。在请求到达之前,客户端由于未收到服务器的响应,可能会再次发送连接请求。
  • 问题:如果此时服务器收到了第一次的请求并回复了确认(ACK),那么两者将建立连接并开始数据传输。但之后,第一次的请求由于网络通畅最终也到达了服务器,服务器将再次回复确认,并尝试建立连接。然而,此时客户端并没有再次发送确认,这会导致服务器上有一个无用的连接,浪费了资源。

2. 确保双向通信的可靠性

  • 双向传输:TCP是一个双向传输协议,需要确保双方都能够发送和接收数据。
  • 两次握手的不足:在两次握手的情况下,只能确保客户端发送的数据能够到达服务器,但服务器发送给客户端的数据是否能够达到则无法保证。
  • 三次握手的必要性:通过第三次握手,客户端发送对服务器SYN的确认(ACK),服务器能够确保客户端已经收到了自己的SYN+ACK包,从而确保了双向通信的可靠性。

3. 总结

  • TCP采用三次握手而不是两次握手,主要是为了确保连接的可靠性和有效性,防止失效的连接请求导致资源浪费,并确保双向通信的可靠性。通过三次握手,客户端和服务器能够确认彼此的状态和序列号,为后续的数据传输打下坚实的基础。

7.三次握手过程中交换了哪些数据?

滑动窗口的大小以及序号

8.三次握手过程中服务器向客户端传递了几次数据?

1次

9.请简述一下滑动窗口

滑动窗口(Sliding Window)是TCP协议中一种重要的流量控制机制,用于调节发送方和接收方之间的数据传输速率,以避免网络拥塞并提高传输效率。以下是关于滑动窗口的详细解释:

1. 基本概念

  • 定义:滑动窗口是一种流量控制技术,允许发送方在不等待确认应答的情况下连续发送多个数据段,从而提高了网络的利用率。
  • 位置:滑动窗口不仅存在于数据链路层,也存在于传输层,如TCP协议。

2. 工作原理

  • 发送窗口:发送方维护一个发送窗口,表示可以连续发送的数据段的范围。发送窗口的大小取决于网络的情况和接收方的能力。
  • 接收窗口:接收方维护一个接收窗口,表示可以接收的数据段的范围。接收窗口的大小取决于接收方的缓冲区大小和处理能力。
  • 滑动操作:随着数据的发送和接收,发送窗口和接收窗口会不断滑动。当接收方成功接收到数据后,会将窗口向前滑动,通知发送方可以发送更多的数据。当发送方收到接收方的确认后,也会将发送窗口向前滑动。

3. 流量控制

  • 接收方控制:接收方通过调整接收窗口的大小来控制发送方的发送速率。如果接收方的缓冲区已满或者处理能力有限,可以减小接收窗口的大小,通知发送方减缓发送速率。如果接收方的缓冲区有足够的空间,可以增大接收窗口的大小,提高发送速率。

4. 主要优点

  • 提高传输效率:滑动窗口允许发送方连续发送多个数据段,而不需要等待确认应答,从而提高了网络的利用率和传输效率。
  • 减少延迟:通过滑动窗口机制,发送方和接收方之间可以实现并行的数据传输,从而减少了传输延迟。
  • 灵活性:滑动窗口的大小是动态调整的,可以根据网络的情况和接收方的能力来调整,从而适应不同的网络环境和传输需求。

5. 示例(假设发送窗口尺寸为2,接收窗口尺寸为1)

  • 初始态:发送方没有帧发出,发送窗口前后沿相重合。接收方0号窗口打开,等待接收0号帧。
  • 发送数据:发送方打开0号窗口,表示已发出0帧但尚未确认返回信息。此时接收窗口状态不变。随后,发送方打开0、1号窗口,表示0、1号帧均在等待确认之列。
  • 接收与确认:接收方收到0号帧后,0号窗口关闭,1号窗口打开,表示准备接收1号帧。发送方收到接收方发来的0号帧确认返回信息后,关闭0号窗口,并继续发送数据。

6. 归纳

滑动窗口是TCP协议中关键的流量控制机制,通过动态调整发送窗口和接收窗口的大小,实现了发送方和接收方之间数据传输速率的动态调节,有效避免了网络拥塞,提高了传输效率和稳定性。

11. TCP四次挥手的过程是什么?

TCP四次挥手的过程包括:

  1. 第一次挥手:客户端发送一个FIN包(FIN=1)用来关闭客户端到服务器的数据传送,客户端进入FIN_WAIT_1状态。
  2. 第二次挥手:服务器收到FIN包后,发送一个ACK包(ACK=1,ack=x+1)给客户端,确认序号为收到序号+1,服务器进入CLOSE_WAIT状态。
  3. 第三次挥手:服务器发送一个FIN包(FIN=1)用来关闭服务端到客户端的数据传送,服务器进入LAST_ACK状态。
  4. 第四次挥手:客户端收到FIN包后,进入TIME_WAIT状态,接着发送一个ACK包(ACK=1,ack=y+1)给服务器,确认后,服务器进入CLOSED状态,客户端经过2MSL(报文最大生存时间)后也进入CLOSED状态。

12.TIME_WAIT状态的作用?

TIME_WAIT状态在TCP协议中扮演着重要的角色,其主要作用包括:

  1. 确保可靠关闭连接
    • 当TCP连接关闭时,通信双方会交换FIN(结束)和ACK(确认)报文段。进入TIME_WAIT状态的一方会等待一段时间(通常是2MSL,即报文段最大生存时间的两倍),以确保对方也正确地接收并处理了FIN和ACK报文段。这样可以防止在网络存在延迟的情况下,对方未收到ACK报文段而导致的连接异常终止。
    • 例如,如果服务器发送了FIN包,但客户端的ACK包在传输过程中丢失,服务器会重发FIN包。在TIME_WAIT状态下,客户端能够重发丢失的ACK包,确保连接的正常关闭。
  2. 防止旧报文段干扰新连接
    • 在TCP连接关闭后,可能会有延迟的报文段在网络中滞留。如果这些旧的报文段被错误地应用于新的连接,可能会导致连接混乱或数据损坏。
    • TIME_WAIT状态可以确保有足够的时间让旧的报文段从网络中消失。具体来说,等待的2MSL时间通常足够让旧的报文段在网络中消逝,从而避免对新连接的干扰。
  3. 实现TCP全双工连接的终止
    • 在TCP全双工连接中,关闭连接的过程需要四次挥手。TIME_WAIT状态允许客户端在发送最后一个ACK包后继续等待一段时间,以确保服务器正确地处理了连接关闭的请求。
  4. 允许老的重复分节在网络中消逝
    • TCP分节可能由于网络故障而"迷途",并在网络修复后被送到最终目的地。为了避免这些迷途的分节被误解为新的连接的一部分,TIME_WAIT状态可以确保这些分节在网络中消逝,从而避免对新连接的干扰。

归纳

TIME_WAIT状态在TCP连接的生命周期中占据重要位置,它通过确保连接的可靠关闭、防止旧报文段对新连接的干扰以及实现TCP全双工连接的终止,保证了TCP通信的稳定性和安全性。同时,它也允许网络中的旧报文段有足够的时间消逝,避免了潜在的连接混乱和数据损坏。

相关推荐
单音GG9 分钟前
推荐一个基于协程的C++(lua)游戏服务器
服务器·c++·游戏·lua
SoraLuna16 分钟前
「Mac玩转仓颉内测版7」入门篇7 - Cangjie控制结构(下)
算法·macos·动态规划·cangjie
我狠狠地刷刷刷刷刷19 分钟前
中文分词模拟器
开发语言·python·算法
鸽鸽程序猿20 分钟前
【算法】【优选算法】前缀和(上)
java·算法·前缀和
九圣残炎26 分钟前
【从零开始的LeetCode-算法】2559. 统计范围内的元音字符串数
java·算法·leetcode
安步当歌38 分钟前
【WebRTC】视频发送链路中类的简单分析(下)
网络·音视频·webrtc·视频编解码·video-codec
YSRM38 分钟前
Experimental Analysis of Dedicated GPU in Virtual Framework using vGPU 论文分析
算法·gpu算力·vgpu·pci直通
shitian081141 分钟前
用轻量云服务器搭建一个开源的商城系统,含小程序和pc端
服务器·小程序·开源
Biomamba生信基地1 小时前
Linux也有百度云喔~
linux·运维·服务器·百度云
韭菜盖饭1 小时前
LeetCode每日一题3261---统计满足 K 约束的子字符串数量 II
数据结构·算法·leetcode