TCP协议
1.什么是TCP网络分层?
客户端:发送HTTP数据包
- 应用层:根据HTTP协议组装数据包
- 传输层:增加TCP头部(包含端口号、序列号等)
- 网络层:增加IP头部(包含源IP地址等)
- 网络接口层:增加以太网头部(包含MAC地址等)
服务端:接收HTTP数据包
- 应用层:HTTP报文解析
- 传输层:TCP报文解析
- 网络层:IP报文解析,传送数据包、确定路由
- 网络接口层:根据MAC地址判断包是不是发给自己的
2.TCP协议的三次握手为什么不能是两次?为什么不能是四次?
三次握手:
- 客户端向服务端发送连接请求:客户端发送请求报文将 SYN = 1 同步序列号和初始化序列号 seq = x 发送给服务端,发送完之后客户端处于
SYN_Send
状态 (确认客户端的发送能力、服务端的接收能力) - 服务端向客户端确认:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s)。同时会把客户端的 ISN + 1 作为ACK 的值,此时服务器处于
SYN_RCVD
的状态(确认服务端的发送能力、客户端的接收能力) - 客户端收到 SYN 报文之后,会发送⼀个 ACK 报文,当然,也是⼀样把服务器的 ISN + 1 作为ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于
ESTABLISHED
状态。服务器收到 ACK 报文之后,也处于ESTABLISHED
状态,此时,双方已建立起了连接 (客户端向服务端建立连接)
3.TCP为什么是四次挥手?
四次挥手:
- 第一次挥手:客户端请求断开(客户端发送FIN)
- 第二次挥手:服务端许可客户端断开连接(服务端回ACK,缓冲区写入
EOF
文件结束符,read读到EOF
会返回0,进入close_wait
状态) - 第三次挥手:服务器请求断开(服务端发送FIN)
- 第四次挥手:客户端许可服务端断开连接(发送ACK)
注:使用close(读写端都关闭)没有四次挥手,只有使用shutdown(关闭写端)时才有四次挥手
为什么不能是三次?
因为TCP的连接是全双工的,每个方向上的关闭都需要单独进行确认,否则一方关闭,另一方还在继续发送数据,会导致数据的丢失。
为什么第二次挥手和第三次挥手不能合成一次?
因为服务器上可能还有尚未处理完的数据,只有等数据都处理完毕之后,才能发出断开连接的请求
如果发生数据包丢失,会发生什么?
FIN包会重传,如果超出了所设置的最大重传次数,会直接断开。而ACK不会重传,ACK丢失会导致发送FIN包的一端不断重传,直至断开。
4.四次挥手为什么要有time_wait的状态?
防止旧数据包干扰新连接:如果一个 TCP 连接关闭后立即重新使用相同的源 IP、源端口、目标 IP 和目标端口(即相同的四元组)建立新的连接,那么之前滞留在网络中的旧数据包可能会被错误地认为是新连接的数据包。
TIME_WAIT
状态的作用是等待足够长的时间(通常是 2 倍的 MSL,Maximum Segment Lifetime),以确保所有可能的旧数据包都从网络中消失。- MSL 是指一个数据包在网络中能够存活的最长时间,通常设置为 30 秒到 2 分钟。因此,
TIME_WAIT
的持续时间一般为 2MSL(大约 1~4 分钟)。
确保对方收到最后的 ACK
- 在 TCP 四次挥手中,主动关闭连接的一方(通常是客户端)会发送最后一个 ACK 来确认对方的 FIN 包。然而,这个 ACK 可能会在网络中丢失。如果对方没有收到这个 ACK,它会重传 FIN 包。
5.为什么TIME_WAIT是 2MSL?
- 第一个 MSL:用于确保最后一个 ACK 能够到达对方。如果对方没有收到 ACK,它会重传 FIN 包。
- 第二个 MSL:用于确保对方重传的 FIN 包能够到达本方,并得到处理。
6.为什么SYN/FIN不包含数据却需要消耗一个序列号?
在TCP协议中,SYN(同步)和FIN(结束)标志位的报文虽然不包含应用层数据,但它们仍然需要消耗一个序列号。
这是因为:
凡是需要对端的确认,一定消耗TCP报文的序列号:TCP通过序列号和确认号来检测丢包并触发重传。如果无法区分重复的SYN或FIN报文。例如,如果网络中存在延迟的SYN报文,接收方可能会错误地认为这是一个新的连接请求。
7.什么是半连接队列?什么是SYN Flood攻击?
半连接队列:客户端伪造IP发送SYN包,而服务端回复的ACK+SYN去到了一个未知的IP地址,这会造成大量的连接无法正常建立,这样的连接会处于半连接状态,而服务器会在半连接队列中记录这样的尚未完成的连接请求。
SYN Flood(洪泛攻击): 服务器的半连接队列大小是有限的,如果半连接队列满,会无法处理正常的请求。
8.说说TCP快速打开(TCP Fast Open, TFO)原理
TCP快速打开(TCP Fast Open, TFO)是一种旨在减少TCP连接建立时间,从而加速网络数据传输的机制。
传统的TCP的缺陷:三次握手在每次建立连接时都需要完整地进行,这会引入一定的延迟,特别是在处理小数据量的请求时这种延迟尤为明显。
TFO的工作流程:
阶段一:首次连接(无TFO,获取Cookie)
- 客户端发送SYN并请求Cookie:普通SYN包,无数据,首选项表明支持TFO。
- 服务端生成Cookie并发送至客户端:服务端生成一个加密的Cookie(基于客户端IP、密钥等),通过
SYN-ACK
的TFO选项返回。 - 客户端存储Cookie:客户端保存该Cookie,用于后续连接。
阶段二:后续连接(启用TFO,加速握手)
客户端发送SYN + 数据 + Cookie:
在SYN包中直接携带应用数据(如HTTP请求)和之前存储的Cookie。
服务端验证Cookie:
- 若Cookie有效,服务端立即处理数据并返回
SYN-ACK
(同时携带响应数据)。 - 若无效,则回退到普通三次握手,丢弃SYN中的数据。
- 若Cookie有效,服务端立即处理数据并返回
客户端确认:发送
ACK
(若服务端已返回响应数据,此ACK可能已无实际数据,仅为确认连接的可靠性,否则退化为三次握手)
TFO性能收益:
- 延迟降低:短连接场景可减少1 RTT,平均延迟下降20%~30%。
9.TCP时间戳的作用?
核心作用:
- 计算往返时间
- 防止序列号回绕: 时间戳作为序列号的扩展,即使序列号回绕,接收方通过比较时间戳(严格递增)可区分新旧数据包,丢弃过期的重复包。
10.TCP的超时重传时间是如何计算的?
TCP具有超时重传机制,即间隔一段时间没有等到数据包的回复,就会重传这个数据包。这个重传间隔就是超时重传时间(RTO)。
经典方法:(平滑RTT来计算RTO)适用于RTT波动较小的情况
注:SampleRTT是新采样的RTT的值。
11.说一说TCP的流量控制
TCP发送数据的过程:发送方将数据放到发送缓冲区,再由发送缓冲区发送给接收方的接收缓冲区。
流量控制的目标:根据接收缓冲区的大小控制发送端的发送。如果接收缓冲区满了,发送方就不能再继续发送。
流量控制的基本原理:
- 窗口字段:每个TCP报文段头部都包含一个16位的窗口字段(在某些情况下,如使用窗口缩放选项时可以大于16位),该字段指示了其剩余未使用的接收缓冲区大小。
注:随着接收方处理数据并释放缓冲区空间,它可以向发送方发送具有更新后的窗口大小的新报文段,告知发送方现在可接受更多数据。
12.如何理解TCP的keep-alive原理?
TCP Keep-Alive机制用于检测长时间处于空闲状态的TCP连接是否仍然有效。在网络通信中,可能会出现由于网络故障或对端主机崩溃等原因导致的连接中断,而两端的应用程序并未意识到这种情况的发生。Keep-Alive机制通过在设定的时间间隔内没有数据传输时发送探测包来检查连接的状态,从而帮助应用程序及时发现并处理这些“死”连接。
13.A、B两个主机之间建立了一个TCP连接,A主机发给B主机两个TCP报文,大小分别是500和300,第一个报文的序列号是200,那么B主机接收两个报文后,返回的确认号是多少?
TCP序列号与确认号规则:
- 序列号(SEQ):标识发送方数据字节流的起始位置。
- 确认号(ACK):表示接收方期望收到的下一个字节的序列号(即已成功接收所有之前的数据)。
- 数据长度:TCP报文中实际携带的应用数据长度(不包含TCP头部)。
所以确认号为500+300+200=1000
14.收到IP数据包解析以后,它怎么知道这个分组应该投递到上层的哪一个协议(UDP或TCP)?
IP头中有协议字段来区分IP协议的上层协议
15.TCP和UDP的区别?
连接类型:
- TCP:面向连接的协议。在数据传输前需要通过三次握手建立连接,确保双方准备好进行通信。
- UDP:无连接的协议。发送数据之前不需要建立连接,直接将数据报发送到目标地址。
可靠性:
- TCP:提供可靠的数据传输服务。它保证数据包按顺序到达且不会丢失或损坏。如果出现问题,TCP会自动重传丢失的数据包,并确保数据完整性。
- UDP:不保证数据包的到达顺序、重复性或可靠性。数据可能丢失、重复或者乱序到达,但它的开销更小,速度更快。
流量控制与拥塞控制:
- TCP:内置了流量控制和拥塞控制机制,能够根据网络状况调整发送速率,避免网络过载。
- UDP:没有内置的流量控制或拥塞控制功能,依赖于应用层来管理这些问题。
应用场景:
- TCP:适用于对数据准确性和顺序有严格要求的应用,如文件传输(FTP)、电子邮件(SMTP)、网页浏览(HTTP/HTTPS)等。
- UDP:适合对实时性要求高但对少量丢包不太敏感的应用,如视频会议、在线游戏、语音通话(VoIP)、直播流媒体等。
16.设计一个系统,使得发送方能够向接收方发送 1GB 数据,但不知道接收方的 IP 地址。
- 发送方发送 UDP 广播寻找接收方
- 接收方回复 IP
- 建立 TCP 连接并传输
1 | # 1. 发送 UDP 广播寻找接收方 |
17.什么是网络拥塞?说一说TCP协议的拥塞控制?
网络拥塞:当网络中的流量过大时,可能会导致路由器或链路过载,进而引发丢包、延迟增加等问题。
TCP 的拥塞控制机制:
慢启动:
- 目的:逐步探测网络的可用带宽。
- 工作原理:
- 初始阶段,发送方将拥塞窗口(
cwnd
)设置为一个较小的值 - 每收到一个确认(ACK),
cwnd
值加倍(即指数增长) - 当
cwnd
达到慢启动阈值(ssthresh
)时,进入拥塞避免阶段
- 初始阶段,发送方将拥塞窗口(
- 缺点:可能导致初期传输效率较低
拥塞避免:
- 目的:平稳地增加发送速率,避免网络过载。
- 工作原理:
cwnd
不再指数增长,而是线性增长(每次增加 1 个 MSS)- 如果由于网络拥塞发生丢包,
ssthresh
被设置为当前cwnd
的一半,并重新进入慢启动阶段。
快速重传:
目的:快速恢复因丢包导致的传输中断。
工作原理:当发送方收到 3 个重复的 ACK 时,认为某个数据包丢失。发送方立即重传丢失的数据包,而不必等待超时。
快速恢复:
- 目的:在快速重传后快速恢复正常的传输速率。
- 工作原理:
- 当检测到丢包并触发快速重传后,
ssthresh
被设置为当前cwnd
的一半。 cwnd
被设置为ssthresh
,然后继续线性增长(拥塞避免)。
- 当检测到丢包并触发快速重传后,