对于将要连接或初始化的连接,两个TCP必须和对方的初始序列号同步 。这通过交换一个控制位SYN和初始序列号完成 。我们把带有SYN的数据段称为"SYNs" 。同步的获得过程这里就不重复了,每方必须发送自己的序列号并返回对对方序列号的确认 。
1) A --> B SYN 本方序列号是X
2) A <-- B ACK 本方序列号被确认
3) A <-- B SYN 对方序列号是Y
4) A --> B ACK 确认对方序列号
上面的第2步和第3步可以合并,这时可以成为3阶段,所以我们可以称它为三消息握手 。这个过程是必须的,因为序列号不和全局时钟关联,TCP也可以有不同的机制选择ISN 。接收到第一个SYN的接收方不可能知道这个数据段是不是被延时,除非它记住了在连接上使用的最近的序列号(这通常是不可能的),因此它必须要求发送者确认 。
为了保证TCP获得的确认是刚才发送的段产生的,而不是仍然在网络中的老数据段产生的,因此TCP必须在MSL时间之内保持沉默 。在本文中,我们假设MSL=2小时,这是出于工程的需要,假如用户觉得可以,他可以改变MSL 。请注重假如TCP重新初始化,而内存中的序列号正在使用,不需要等待,但必须确认使用的序列号比当前使用的要大 。
假如一台主机在未保留任何序列号的情况下失败,那么它应该在MSL时间之内不发出任何数据段 。下面将会这一情况进行说明 。TCP的实现可以不遵守这个规定,但是这会造成老数据被当成新数据接收,而新数据被当成老数据拒绝的情况 。
每当数据段形成并进入输出队列,TCP会为它指定序列空间中的一个值 。TCP中多复本检测和序列算法都依靠于这个地址空间,在对方发送或接收之前不会超过2的32次方个包存在于输出队列中 。所有多余的数据段都会被删除 。假如没有这个规定,会出现多个数据段被指定同一个序列号的情况,会造成混乱 。数据段中序列号的多少和数据段中的字节数一样多 。
在通常情况下,TCP保留下一个要发送的序列号和还未确认的最老的序列号,不要在没有确认的时候就再次使用,这样会有些风险,也正是因为这样的目的,所以序列空间很大 。对于2M的网络,要4.5小时来耗尽序列空间,因为一个数据段可能的最大生存时间也不过十几分之一秒,这就留下了足够的空间;而在100M的网络上需要5.4分钟,虽然少了点,但也可以了 。
假如在实现TCP时没有为保存序列号留下空间,那清除多余的包可能就不能实现了,因此推荐这种类型的TCP实现最好在失败后等待MSL时间,这样保证多余的包被删除 。这种情况有时候也可能会出现在保留序列号的TCP实现中 。假如TCP在选择一个另一个TCP连接正在使用的序列号时,这台主机忽然失败了,这就产生了问题 。这个问题的实质在于主机不知道它失败了多久,也不知道多余的复本是不是还在网络中 。
处理这种问题的方法是等待MSL时间,假如不这样就要冒着对方错误接收数据的危险,要等待的时间也就称为“沉默时间” 。实现者可以让用户选择是不是等待,但是无论用户如何也不见得非要等待MSL时间 。
3.4. 建立一个连接
建立连接应用的是三消息握手 。假如双方同时都发送SYN也没有关系,双方会发现这个SYN中没有确认,于是就知道了这种情况,通常来说,应该发送一个"reset"段来解决这种情况 。三消息握手减少了连接失败的可能性 。下面就是一个例子,在尖括号是的就是数据段中的内容和标记 。其它的就不多说了 。
在第2行,TCP A发送SYN初始化序列号,表示它要使用序列号100;第3行中,TCP B给出确认,并且期待着A的带有序列号101的数据段;第4行,TCP A给出确认,而在第5行,它也给出确认,并发送了一些数据,注重第4行的序列号与第5号的一样,因为ACK信息不占用序列号空间内的序列号 。同时产生请求的情况如下图所示,只复杂一点 。
推荐阅读
- 高压锅压绿豆汤需要多少时间
- 高温消毒多长时间最佳
- 宿迁有高铁吗 宿迁有没有高铁
- 如何提高鸡种蛋受精率
- 年龄大的人还会出现心梗吗,人到一定年龄,心脏也渐渐显老态,高血压,冠心病,糖尿病,心经梗塞纷纷找上门来,如何预防这类病症的
- 螃蟹能带上高铁吗 可以带螃蟹上高铁吗
- k火车时速一般多少
- 稻城亚丁有高原反应吗
- 什么是高热量食物有哪些 高热量食物有哪些
- 高利贷需要偿还吗
