协议格式
TCP建连(三次握手)和TCP断连(四次挥手)
同时打开
同时关闭
TCP顺序性(流式)
原理:分片组包、序列号
TCP是流状态协议:不一定顺序接收,但是一定会顺序返回给应用层。比如A write 两次(123、456)。B Read了两次,可能一次过收到123456、也可能分两次接收12、3456
如果源主机使用同样的连接发送另一个报文段,那么这个报文段的序列号等于前一个报文段的序列号与前一个报文段中数据字节的数量之和。例如,假设源主机发送3个报文段,每个报文段有100字节的数据,且第一个报文段的序列号是1000,那么第二个报文段的序列号就是1100(1000+100),第三个报文段的序列号就是1200(1100+100)。
TCP可靠性
原理:超时重传,得不到ACK就重新发送数据,直到对方确认为止。
重传方式:
1、 一个包对应一个ack
2、连续ARQ协议
累积确认:接收方一般采用累积确认的方式。即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了。累积确认有的优点是:容易实现,即使确认丢失也不必重传。缺点是:不能向发送方反映出接收方已经正确收到的所有分组的信息。
Go-back-N:如果发送方发送了前 5 个分组,而中间的第 3 个分组丢失了。这时接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次。这就叫做 Go-back-N(回退 N),表示需要再退回来重传已发送过的 N 个分组。可见当通信线路质量不好时,连续 ARQ 协议会带来负面的影响。
3、选择确认 SACK(Selective ACK)
如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方,使发送方不要再重复发送这些已收到的数据。如果要使用选择确认,那么在建立 TCP 连接时,就要在 TCP 首部的选项中加上“允许 SACK”的选项,而双方必须都事先商定好。如果使用选择确认,那么原来首部中的“确认号字段”的用法仍然不变。只是以后在 TCP 报文段的首部中都增加了 SACK 选项,以便报告收到的不连续的字节块的边界。由于首部选项的长度最多只有 40 字节,而指明一个边界就要用掉 4 字节,因此在选项中最多只能指明 4 个字节块的边界信息。
4、D-SACK(Duplicate SACK)告诉发送方有哪些数据被重复接收了
5、快速重传。发送方连续收到3次相同的ack,则启动快速重传。拥塞窗口下降一半,反应相对没那么激烈。
定时器
定时过长会造成网络利用率不高。太短会造成多次重传,网络拥塞。
-
坚持定时器 收到0滑动窗口报文时,启动定时器,超时后向对端查询窗口是否增大。如果仍然是0则再次开启定时器(定时时间间隔为指数退避1、2、4、8、16……64)
-
保活定时器 检测TCP连接是否可用
-
重传定时器 TCP 每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段。
-
2MSL定时器 TimeWait相关。
提高发送效率和减轻网络负担的方法
- 回复数据附带ACK
- Nagle算法
- quick ack
tcp发送ack有两种方式:quick ack和 delayed ack
quick ack:收到数据包后,立即发送ACK给对端。
delayed ack:收到数据包后,不会立即发送ACK,而是启动延时确认定时器,在此期间:
- 本端有数据包要发送给对端。就在发送数据包的时候捎带上此ACK。
- 本端没有数据包要发送,定时器超时后发送ACK给对端。
Nagle算法的做法是先把第一个小包发送出去,后面的小包都缓存起来,直到收到前一个数据段的ack,或者缓存数据长度已经达到mss大小才发送。
根据算法的描述可以看到:nagle算法和delayed ack都是为了减少小数据包在网路中传输的数量,优化网络性能。 连接刚启动的时候,拥塞算法使用的是慢启动,必须尽快发送ack,发送方才可能尽快增大发送窗口,发送更多的数据。
滑动窗口(解决一条连接的网络问题)
本质描述接收方的TCP缓冲大小。如果发送方收到接收方的窗口大小为0的TCP数据包,那么发送方将停止发送数据。
拥塞窗口(解决广域网的网络问题)
慢启动、拥塞避免、拥塞发生、快速重传和快速恢复,详情请看。
上述是老的TCP拥塞控制算法。现已被其他算法取代
- 基于丢包反馈的TCP协议(Tahoe、Reno、New Reno、SACK)
- 基于延时反馈的TCP协议(Vegas、Westwood)
- 基于丢包反馈的高速带宽算法(HSTCP、STCP、BIC-TCP、CUBIC)
TCP 报文段的发送时机
- 第一种机制是 TCP 维持一个变量,它等于最大报文段长度 MSS。只要缓存中存放的数据达到 MSS 字节时,就组装成一个 TCP 报文段发送出去。
- 第二种机制是由发送方的应用进程指明要求发送报文段,即 TCP 支持的推送(push)操作。
- 第三种机制是发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过 MSS)发送出去。