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
互联网消息控制协议,常用于:
- 异常消息回传
- 网络质量探测与优化