为什么TCP需要建立连接

其实很好理解这个问题,我们要发送东西给人家,那么肯定要先给人家打好招呼,这样对方才可以在收到东西之后给你反馈啊。

如何建立TCP连接

TCP连接需要经过“三次握手”的过程,我们先给出这个过程的示意图,如下图所示:
TCP三次握手_tcp

  1. 第一步:客户端A中的一个TCP进程要与服务器B中的一个TCP进程建立连接,首先是A中的TCP进程向B中的TCP进程发送特殊的TCP报文段(标志位SYN被置1,因此该报文段也称为:SYN报文段)。另外,客户端会随机地选择一个初始序号(client_isn),并且将这个序号作为该报文段中的“序号”字段的值。
  2. 第二步:B收到SYN报文段后,会为TCP连接分配TCP缓存和变量,并向该客户TCP进程发送允许连接的报文段(这里会引起:SYN洪泛攻击)。该允许报文段包括了三个主要的数据:标志位SYN和ACK被置1,确认号字段被赋值为:client_isn+1,服务器也选择自己初始序号(server_isn),并且把该初始序号放在允许报文段的序号字段。因此,允许报文段又称为:SYNACK报文段。
  3. 第三步:收到SYNACK报文段后,客户端也给该连接分配缓存和变量,并且还要发送一个确认报文段给服务器。这个报文段是建立连接发送的最后一个报文段,报文段中的ACK被置1,确认号为:server_isn+1,同时要注意:此时连接已经建立了,所以标志位SYN是被置为0的。OK,到这里TCP连接已经被建立了,可以进行数据传输了。
分析:为什么要“三次握手”,而不是两次或四次

为什么不是两次了,有两个原因

  1. 如果A向B请求连接,B同意了为此次连接分配了资源和变量,然后,会返回允许报文段给A,若B的应答没有到达A端,A认为连接未建立,而B认为建立了。B会在一段时间内保留分配的资源,如果大量A这样请求,B会崩溃(SYN洪泛攻击就是这个原理)。而“三次握手”的话,我们就可以知道这次连接是没有建立成功的。
  2. 为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。这个主要是因为SYN报文段在传输过程中耽误了太久的时间,客户端A就以为丢失了,已经重新发送了SYN报文段,建立好了连接。但是我们的服务器B不知道这个事情,同样会为它分配资源,并且返回确认报文,但是客户端收到后,看到后不会去理会它,这样就会出现和第一种一样的情况,,A认为连接未建立,而B认为建立了。B会在一段时间内保留分配的资源,如果大量A这样请求,B会崩溃。

为什么不是四次

这个很容易解释,我们三次可以搞定的东西,为啥还要四次了。

SYN洪泛攻击

原理

利用伪造的IP地址向被攻击者发送TCP连接请求,而被攻击者会为这些请求分配资源和变量并且会发送应答报文给发送者,但是这些报文永远都无法到达目的地。那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。如果攻击者发送大量的这样的TCP连接的话,就会造成服务器因为资源不够而崩溃。

防御方法

  1. 降低SYN timeout时间,使得主机尽快释放半连接的占用
  2. 采用SYN cookie设置,如果短时间内连续收到某个IP的重复SYN请求,则认为受到了该IP的攻击,丢弃来自该IP的后续请求报文
总结

TCP的三次握手目的是同步连接双方的序列号确认号并交换 TCP 窗口信息。其中我们需要知道SYN和RST两个标志位都是和建立TCP连接有关的。