TCPl建立连接的三次握手机制分析

来源:互联网 发布:真实的恐怖事件知乎 编辑:程序博客网 时间:2024/06/05 13:23

终端A(Client)和终端B(Server)之间建立TCP连接时,需要经历三次握手,过程如下:

1 A向B发送SYN消息,进入SYN_Send状态,表示已发送SYN消息,等待确认.SYN = synchronize Sequence Number,该消息对应的序列号是一个随机值,如SNA.

A->B

SYN

SEQ:SNA

ACK:0

2 B收到SYN消息后,产生一个新的SYN和ACK并发送给A,进入SYN_RECV状态,表示已经收到SYN. B产生的序列号为B自己选取的一个随机值如SNB,而ACK号为SNA+1.

B -> A

SYN,ACK

SEQ:SNB

ACK:SNA+1

3 A收到B发送的SYN+ACK消息后,向B发送ACK消息,进入Established状态.这次产生的序列号为SNA+1,ACK号为SNB+1.

A ->B

ACK

SEQ:SNA+1

ACK:SNB+1

至此完成三次握手,建立起了TCP连接

SYN的意义:表示初始化一个连接(connection)或者会话(session),A->B发送SYN包,表示要初始化A->B之间的连接.

ACK的意义:Acknowledgement,表示对收到消息(如SYN消息或SYN+ACK消息)的确认.

SEQ的值:表示发送者发送的该包的序列号,其初始序列号随机,之后每发送一个包将递增1.

ACK的值:表示接收者希望收到的下一个包的序列号,如第二步ACK为SNA+1,表示其收到了SNA包,希望收到SNA+1包.

为什么要三次握手呢?

TCP是双向连接,即A->B,B->A,面向连接就要求发送的数据需要确认;

创建A->B的连接需要A的SYN及B的ACK;

创建B->A之间的连接需要B的SYN及A的ACK.

第一步为A的SYN,

第三步为A的ACK,

第二步为B的ACK及SYN,所以需要三次握手.

 

为什么初始SEQ要取随机值呢?

首先这个随机值并不是随机的,而是可以预测的,

其次,它一般基于时钟产生,在rfc793中讲到"The generator is bound to a (possibly fictitious) 32  bit clock whose low order bit is incremented roughly every 4  microseconds."大概就是每4ms加1,这样ISN循环一次需要4.55小时,而一个连接中传送的Segment在网络中存在的最大时间小于4.55小时.如我们需要segment的Seq为1,则至少4.55小时前的Segment其Seq才可能为1,而segment不可能在网络中存在4.55小时,所以如果我们接收到Seq为1的segment则必然是我们需要的segment(恶意攻击除外^_^).

这样可以防止上一次连接产生的Segment被本次连接错误接收,同时也可以从某种程度上防止其它用户恶意攻击

0 0