三次握手
接下来我们来详细讲解下上图的过程:
- 客户主机发起连接请求,设置
SYN
标志位为1
,同时客户端随机
选择了一个初始序号client_isn
,并且存放在TCP报文
字段的序号
中,如下图:
第一次握手:SYN报文
- 接下来,当服务端接收到该报文后,会为其分配
TCP 缓存和变量
(这使得TCP容易受到被称为SYN 洪泛攻击
的拒绝服务攻击)紧接着,服务端会返回一个SYNACK 报文
到客户端,其中SYN
标志位为1
,确认号
设置为client_isn + 1
,并且选一个自己的初始序号server_isn
,并放置在序号
字段中,如下图:
第二次握手:SYNACK报文
- 当收到服务器发来的
SYNACK
报文段后,客户端也需要给该连接分配缓存和变量,然后再次发送一个确认报文给服务端,其中,SYN
标志位设置为0
,将确认号
设置为server_isn + 1
,另外,此次报文可以携带负载数据:
第三次握手:ACK报文
细节拓展
- 三次握手的状态转换图(建议达到能默写下来的熟练程度)
三次握手状态图
- 服务器为什么要使用特殊的初始序号
server_isn
?这为什么是必要的呢?
这个细节和问题深究第3题
是一致的,服务器使用特定的初始序列号 server_isn
(从源
和目的地IP
和端口
的散列
中获取)可以用来抵御SYN洪水攻击。具体为什么,以及什么是SYN 洪泛攻击
,问题深究部分我们会再详谈。
为了下文描述方便,我们将三次握手分别称为:
SYN 报文
、SYNACK 报文
、ACK 报文