Skip to main content

TCP

什么是TCP

TCP是网络模型中传输层的通信协议。它拥有基于连接的,可靠的,面向字节的主要特征。 同时TCP是互联网中应用最多的底层协议之一,很多应用层协议(如:HTTP协议)都是基于TCP协议实现的。

TCP报文由什么组成

TCP报文组成是很复杂的,个人在学习过程中,一般仅关注几个点核心点。

首先,TCP报文中需要申明:源IP、源端口、目标IP、目标端口 这四个关键信息。 通过这一组信息,TCP可以唯一确认一组连接。

此外,TCP报文中还有标志位用于区分此次报文是属于SYN报文、ACK报文、FIN报文等。 对应的还有序列号,用于确保数据的有序性。还有窗口大小,用于协商滑动窗口大小。

如何查看 TCP 的连接状态?

netstat -napt

TCP三次握手

TCP三次握手由客户端和服务端共同完成,发起方为客户端,接收方为服务端。

  • 第一次握手
    • 客户端发送SYN报文,请求建立连接,并进入SYN_SENT状态
    • 报文中包含客户端初始化的随机序列号
  • 第二次握手
    • 服务端收到SYN报文,向客户端回应SYN+ACK报文,并进入SYN_RECV状态,此时会创建连接对象,并放入到SYN半连接队列中
    • 报文中包含服务端初始化的随机序列号,并将客户端的序列号作为确认号一并返回
  • 第三次握手
    • 客户端收到ACK报文,通过序列号确认是否属于自己的报文。
    • 然后向服务端回应ACK报文,报文中包含序列号和确认号,此时客户端进入ESTLIBALSI状态,表示连接已建立
    • 通常情况下,第三次ACK报文可以携带请求数据

TCP四次挥手

TCP三次握手由客户端和服务端共同完成,发起方可以是客户端,也可以是服务端。下面以客户端发起挥手作为示例。

  • 第一次挥手
    • 客户端发送FIN报文,请求释放连接,并进入FIN_WAIT_1状态
  • 第二次挥手
    • 服务端接收到FIN报文,向客户端回应ACK报文,并进入WAIT_CLOSE状态
  • 第三次挥手
    • 服务端确认无数据发送后,向客户端发送FIN报文,并进入LAST_ACK状态
  • 第四次挥手
    • 客户端接收服务端FIN报文后,向服务端发送ACK报文,并进入到TIME_WAIT状态
    • 服务端收到客户端ACK报文后,正式关闭连接,进入CLOSE状态

请分别介绍每次握手或挥手丢失的场景

不管是三次握手还是四次挥手,要分析丢失的场景,核心就是围绕着超时重传进行分析。

为什么需要TCP

通过互联网进行数据传输的过程中,受限于很多因素,比如:网咯波动,硬件等,每次传输过程其实都有一定概率是会丢失的。 而TCP就是为了解决这种问题而设计的一种,面向连接的、可靠的传输协议,可以极大的保障我们数据传输过程的可靠性。

什么是MTU和MSS

  • MTU:Maximum Transmission Unit,IP层能够传输的最大单元大小
  • MSS:Maximum Segment Size,TCP层能够传输的最大数据块大小

什么是SYN攻击

SYN攻击是一种网络攻击方式,它通过模拟TCP三次握手中的第一次握手报文,快速占据服务端大量资源, 从而导致服务端无法处理正常请求。

具体过程:

  • 服务端接收到TCP第一次握手报文,响应SYN+ACK报文,并创建连接对象加入到SYN半连接队列。
  • 由于是恶意伪造的SYN报文,因此服务端是不会接收到第三次握手报文的,因此服务端会认为第二次报文丢失了,触发超时重传机制,该过程通常最大可以持续60s
  • 因此服务端半连接队列大小将迅速被打满
  • 在半连接被打满后,新的SYN报文将直接丢弃

丢包是怎么产生的

  • SYN半连接队列被打满,新的SYN报文将直接丢弃
  • 开启了recycle机制

TCP 中常见的拥塞控制算法有哪些?

  • 慢启动:从1开始指数增长
  • 当达到增长阈值时,改为线性增长
  • 当触发快速重传时,降为原来的一半
  • 当触发超时重传时,重置为1

为什么会有TIME_WAIT状态

TIME_WAIT状态发生于TCP四次挥手的发起方,当发起方完成最后一次挥手后就会进入TIME_WAIT状态。

TIME_WAIT阶段主要作用就是为了避免历史报文被错误接收导致的紊乱。因此TIME_WAIT时间也默认为2次最大报文生命周期。

请分析下服务端产生大量的TIME_WAIT

出现大量TIME_WAIT状态,表示当前完成了第四次挥手。TIME_WAIT出现发主动发起断连的那一方。说明服务端大量的主动断开连接。

可能是因为没有使用长连接、服务端对长连接有的请求数量限制

请分析下服务端产生大量的CLOSE_WAIT

出现大量的CLOSE_WAIT状态,表示当前完成了第二次挥手,而服务端可能还有数据没有处理完,因此没有调用close,导致产生大量的CLOSE_WAIT状态。

如何解决这个问题?

这个问题可能并不一定是个问题。因此产生这个的原因是因为服务端没有调用close导致的。因此我们需要从业务的角度去分析为什么没有调用close,是不是业务存在缺陷,还是说业务设计上就是这样。

没有Accept是否能建立TCP连接

没有Listen是否能建立TCP连接

TCP如何保证可靠传输

主要基于超时重传和快速重传

超时重传

  • RTT(Round-Trip Time 往返时延):数据发送时刻到接收时刻的差值
  • RTO(Retransmission Timeout 超时重传时间):

因此,超时时间不是固定的。而是基于网络质量动态计算出来的。而超时时间RTO则是基于RTT进行动态指定的。

快速重传

当接收方接收到连续三次相同的低序列号报文时,就会触发快速重传。

什么是滑动窗口

滑动窗口是TCP协议中的一种流量控制机制。它通过在客户端和服务端之间的能力现状, 去动态的协商窗口大小,从而实现传输流量大小的控制。

窗口是一种抽象,它本质是定义了TCP传输中最大传输数据量大小。 这里需要区分下TCP中MSS大小,他是TCP单次传输数据量的最大限制。

什么是糊涂窗口综合症

在某些特殊场景下,比如服务端忙于接收请求。这时可能会发生,服务端接收几个字节,释放了窗口,客户端立即发送几个字节的数据过来。

因为TCP报文本身就会占据几十个字节,在糊涂窗口综合症场景下,可能每次TCP发送的请求数据都很小,这会极大的浪费网络资源。

解决方案:

服务端不告知小端口

当窗口大小小于MSS时,通知发送方窗口大小为0

延时机制

当单次发送数据较小时,延迟等待下次数据一起发送过去。

什么是流量控制

在网络传输中,发送数据一般是请求应答模型。即一次一次的发送数据,但这种串行的执行效率太低。 但发送数据不可能一次全部发送过去,因为服务端可能一次处理不了这么多数据。

因此需要有一种流量控制机制,去动态的协商发送发方和接收方之间的能力。

什么是拥塞控制

拥塞控制是TCP中基于网络质量而设计的一种流量控制机制。它维护有一个拥塞窗口,用于动态控制请求发送量。

当发送超时重传或者快速重传的时候,拥塞机制就会触发,他会减少同一时间段内发送请求量的大小。

为什么说TCP是慢启动

慢启动是TCP综合流量控制、网络质量实现的一种机制。也就是在第一次发送数据时,发送一个数据包, 当收到回应时,下一次将发送两个数据包,依次累增发送。

什么是ICMP

互联网消息控制协议,常用于:

  • 异常消息回传
  • 网络质量探测与优化