Fluge Site

TCP是一个非常复杂的面向连接的协议,在很30多年来,各种优化变种争论和修改不断,所以我先从连接的建立和终止开始写TCP。后面应该还有几篇文章写TCP的另外几个特别重要的特性。
TCP最开始被我知道就先从很有特点的链接建立和终止—三次握手和四次挥手,基本上TCP协议的可靠性就是从保证连接的可靠性开始的。

TCP链接的建立—三次握手

对于三次握手,其实是TCP比较著名的东西了,在完全不了解这个TCP的时候就知道有这个东西了,但是开始的时候总有一点让我非常的疑惑:TCP为什么是三次握手,为什么不是两次或四次?

TCP 为什么是三次握手,为什么不是两次或四次?

要解释这个问题,首先明白TCP出现的价值和思路:是为了在不可靠的互联网络上提供一个可靠的端到端字节流而设计的,并且一个TCP连接是全双工。这是TCP很重要的一个设计理念:提供了一种可靠的,面向连接的字节流运输层服务,并且是双全工的。这里需要理解双全工的意思:就是两端之间进行通信,这两端既可以是数据的接收方,也可以是数据的发送方。
1、 可靠模型:但是为了数据的安全送达,就必须在发送数据前向另一个端口进行通信

数据发送端A:嘿,我想发送数据了,可以么。
数据接收端B:好的,这边允许接受。

然后数据的发送端就可以发送数据了,这里就基本保证你发的在接收方会正常的接受并不会发错。这是发送数据的基本可靠模型
2、 连接模型:在TCP的要求中,需要一种面向连接的通信:连接在我理解中就是相当于有一根空水管,连接两个水池(为两个水池传输东西),在水管中传输东西的效率肯定会高于用桶去一桶桶的装,来的方便。

TCP

原文
TCP的可靠性不止建立在建立一个稳固的链接上,还有就是数据包丢失的重传机制,和防止网络波动的拥塞处理机制,这些都是慢慢发展而来的。
要先了解TCP的重传和拥塞处理,需要先了解两个很常见的变量–RTT和RTO,这两个是对重传和拥塞很重要的概念。

RTT(Round Trip Time):就是发送一个数据包的往返时间的测量,由于路由器和网络流量均会变化,因此我们认为这个时间可能经常会发生变化,TCP应该跟踪这些变化并相应地改变其超时时间。
RTO(Retransmission TimeOut):重传超时时间,是根据RTT计算得到的。

重传

在重传机制中,首先在介绍重传的几个机制前,要注意。接收端给发送端的Ack确认只会确认最后一个连续的包。比如:发送端发了1,2,3,4,5一共五份数据,接收端收到了1,2,于是回ack 3,然后收到了4(注意此时3没收到,3丢失)此时的TCP会怎么办?我们要知道,因为正如前面所说的,SeqNum和Ack是以字节数为单位,所以ack的时候,不能跳着确认,只能确认最大的连续收到的包,不然,发送端就以为之前的都收到了。

TCP