19. TCP协议之三次握手


TCP创建的过程和释放的过程都是通过TCP/IP协议栈自动完成的. 本篇就主要是分析TCP创建过程.


TCP报文段首部格式

注意 : TCP虽然是面向字节流的, 但是TCP传送的数据单元却是报文段.

19. TCP协议之三次握手

本篇我们主要会涉及到TCP首部的 : 序号(初始序号), 确认号, ACK以及SYN.


三次握手的过程

19. TCP协议之三次握手

TCP协议的连接需要三次握手才能完成, 分别是 :

  1. 客户端先初始化一个随机初始序号(ISN)为X, 接着客户端将TCP首部的SYN标志位置为1, 最后向服务端发送该报文.
  2. 服务端监听, 直到收到一个SYN是被置为1的报文, 这时, 服务端才知道有用户可能要进行连接了, 服务端也随机初始化一个初始序号(ISN)为Y, 接着将首部的确认号改为X+1并将ACK和SYN置为1, 最后向客户端发送该报文. (此时服务端可能已经为该连接分配了TCP缓存和变量, 跟TCP/IP协议栈有关)
  3. 客户端当接收到服务端的“确认”报文后, 客户端就已经准备好了, 接着将报文中的确认号改为Y+1并将ACK置为1, 当然该报文也可以携带数据(一般第三次握手都没有携带数据), 最后发送该报文.(此时客户端也可能已经分配了TCP缓存和变量, 跟TCP/IP协议栈有关)
  4. 最后服务端接收到客户端的“确认”报文后服务端就与客户端连接好了, 接下来就可以通信了.

注意

客户端和服务端都要先初始化一个随机初始序号(ISN), 如果没有先初始化序号就执行确认, 导致向对端发送数据包时, 对端还没有初始化序号, 没有分配缓存, 也就并不知道将数据保存在哪一个位置, 可能导致数据会丢失. 其实握手的实质是初始化初始序号, 即确认ISN.

序号是随机的, 并不是规定每次从同一个数开始, 这样随机的好处就是保证安全. 如果规定某一个值黑客就更加的容易伪造TCP报文对你进行攻击.

只要操作系统支持也可以在第三次握手时发送数据, 这种技术叫做TFO技术.


为什么要三次握手

为什么要三次握手, 而不是两次握手, 甚至是四次握手, 偏偏是三次? 关于这个问题我们先假设只有两次握手.

如果只有两次握手. 从两种可能进行分析 :

  1. 在网络中不断的有部分数据会因为某些原因而滞留. 如果这个被滞留在网络中的刚好是SYN, 那么当他到达服务端时, 此时的服务端没有与客户端连接, 当接收到这个滞留的SYN, 立马向客户端进行确认并且建立起连接(因为只有两次握手), 等待客户端数据传输过来. 其实服务端根本不知道对端已经断开了 , 这只是一个滞留在网络中的SYN, 结果呢, 服务端就傻傻的等到超时后才能确认对方断开. 这样实现, 两次握手更加容易的消耗资源以及造成时间上大量的开销. 而三次握手中第三次握手就是为了确认对端发送的请求不是一个滞留的SYN.
  2. 同样, 当服务端的“确认”报文在网络中丢失. 报文丢失, 那么客户端一直没有收到, 也就没有建立连接; 而服务端无法确认对方收到没有, 只能假设对方已经收到. 此时服务端等待而客户端等待“确认”报文, 从而导致死锁. 有了第三次的ACK确认, 就可以避免这种死锁情况的发生.

三次握手是保证可靠传输的最小次数.


SYN洪泛攻击

SYN洪泛攻击也叫DOS攻击.

SYN攻击就是客户端在短时间内伪造大量不存在的IP地址, 向服务器不断地发送SYN包, 服务器回复确认包, 并等待客户的确认, 由于源地址是不存在的, 服务器需要不断的重发直 至超时, 这些伪造的SYN包将长时间占用未连接队列, 正常的SYN请求可能会被丢弃, 目标系统运行缓慢, 严重者引起网络堵塞甚至系统瘫痪.

一般现在的TCP/IP协议栈都对这一过程进行改善来防范SYN攻击, 修改TCP协议来实现. 主要方法有SynAttackProtect保护机制, SYN cookies技术, 增加最大半连接和缩短超时时间等. 但是不能完全防范SYN攻击 .


总结

重点需要掌握

  • 三次握手的过程
  • 三次握手的原因

参考

TCP连接管理

TCP三次握手四次挥手详解