tcp协议需要经过三次握手,才能建立连接,而像sctp协议,则必须经过四次握手,才能建立连接。不禁我们要问了,为什么tcp不是两次握手,或者四次握手来建立连接呢?
tcp协议需要经过三次握手,才能建立连接,而像sctp协议,则必须经过四次握手,才能建立连接。不禁我们要问了,为什么tcp不是两次握手,或者四次握手来建立连接呢?
tcp是一种可靠的传输控制协议,它必须做到两点,一是保证数据的可靠传输,二是尽可能提高传输效率,三次握手正是为了做到这两点才出现的。
[[397071]]
可靠性的实现
假设a、b双方欲建立tcp连接。
首先,由操作系统随机选取一个32位序列号,假设a的初始序列号为1000,接着对所要发送的数据进行编号,1001,1002,1003...
a会把初始序列号isn告诉给b,让b知道,什么样的编号数据是合法的,什么样的编号数据是非法的,比如接收到一个编号999的数据,那就是非法的。
b也会对a每一个编号数据进行确认,如果收到编号为,1001-说明有1000个字节已经安全到达。
同理,b也会进行类似的操作。如果b的初始序列号isn为,b也会开始编号,,...
b再将初始序列号isn告诉a,a同样可以确认b发送了多少个字节,这些数据合不合法。
通过以上步骤,不难发现,tcp协议握手的本质是通信双方数据原点的序列号,从而实现可靠性。
传输效率
实现数据可靠传输,为什么刚好需要三次握手呢?如果两次握手,行不行?
两次握手:
- a发送同步信号syn+a的初始序列号
- b发送同步信号syn+b的初始序列号+b的ack序列号
两次握手会产生一个问题,b没办法知道a是不是已经接收了自己的同步信号。一旦这个同步信号丢了,a和b就b的初始序列号将无法达成一致。
显然,两次握手是不可取的。
那么四次握手又如何呢?
- a发送同步信号syn+a的初始序列号
- b确认收到a的同步信号,并记录a的isn到本地,命名b的ack序列号
- b发送同步信号syn+b的初始序列号
- a确认收到b的同步信号,并记录b的isn到本地,命名a的ack序列号
显然,并不需要四个步骤,2和3和可以合并,提高连接的速度和效率。
tcp协议需考虑到可靠性和传输效率,明白了这一点,我们也就明白了为什么只能是三次握手,而不是两次或者四次了。