探秘TCP可靠传输(1)

95 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情

TCP上连接应用层,下连接IP层,应用层就看具体的实现,有些软件产品上层会有一些判断协议,也能保证可靠传输,下面的IP层是不可靠的传输,因为TCP需要在不可靠的IP层来实现端到端的传输,为了保证可靠传输,TCP层就需要通过一定的协议来保证可靠传输。TCP是通过检验和,序号和确认序号,应答,流量控制,定时器和拥塞控制来确保可以把数据正确的,按序的交付给接收方,下面我们具体看一下。

  1. 检验和 这个比较好理解,在TCP数据组包格式中,会按照下图的格式对应用层传递的数据进行封装,从下图的红色方框中可以看到有一个16位的校验和,发送方会填充检验和字段,接收方进行检验时,若检验发现异常,则丢弃该报文,并且也不会进行确认的回复。检验方式也是比较简单的,就是求和取反,若是溢出会回卷

12334.png

  1. 序号,确认序号 这个就好比两个人打电话时,一个人A说了一句话,另一个人B进行回应,TCP层也有这种发送接收回应的操作。当两个人通话是一来一往的,网络上无法保证是一来一往,因此在使用TCP时,对发送的数据进行编号,这个编号就是我将要说的序号和确认序号。

一个报文段的序号是该报文段首字节的字节流的编号,而不是报文段的编号,举个例子就明白了,假如A要发送5000个字节,但由于MSS = 1000,那第一个报文段中的序号是0,第二个报文段的序号就是1000,第三个报文段的序号就是2000。

一个报文段中的确认序号,是该主机期望从对端主机收到的下一个字节的序号,这也是为什么有些人说确认序号上次已成功收到数据字节序号加1,再举个例子就好理解了,假如A已经收到了B发来的0-600的字节,那么接下来,A期望收到的是601以及之后的数据,此时A会在报文段中填充确认序号为601。

说到此处了,有人朋友可能想到,万一接收方接收到了0-100,200-300的字段,但中间字段丢失了,这种情况网络上是如何处理的,这个时机上RFC中没有规定,可以丢弃200-300的字段,或者接收方只进行缺失字节填充等,具体的就看编程人员的实现细节了。