tcp是面向连接的,可靠的字节流传输协议。
传输的另一方是无法知道发送方传输了多少字节的内容。
5元组确定一个session:发送发ip,端口,接收方ip,端口,协议号
Nagle算法:当接收的一方收到数据后,并不会立即返回ack,而会等待200毫秒后回复;
-
发送放在没有收到一个分组的返回ack时,不会发送下一个分组;
-
而是在这段时间内,会收集零散的tcp报文,在收到ack后一起发送。
好处:在发送大量小数据报的时候,能够减少发送的次数。
坏处:在某些情况下,会造成极大的时延。
TCP可靠性传输的方式
TFTP协议:停止等待协议,在未收到ack之前不会发送下一个分组。(由于效率低tcp未使用)
tcp采用滑动窗口的方式。
一般情况下采用隔一个报文进行一次确认。
流量控制:快的发送方和慢的接收方。(两个终端)
采用滑动窗口的机制,当 接收通过设置报文中的窗口大小来通知发送方的发送数据的多少。
- 滑动窗口的左边沿:ack中的相对序号(ack序号-初始号)
- 滑动窗口的右边沿:ack+win
拥塞控制:互联网传输速度较慢的情况。(取决于中间网络的阻塞成都)
采用慢启动的方式。慢启动为发送发添加另一个窗口:拥塞窗口cwnd
**拥塞窗口是发送方使用的流量控制,而通告窗口是接收方发送的流量控制。**发送方取拥塞窗口和通告窗口中较小的一个为发送上限。
慢启动算法:
-
增长:
- 拥塞窗口的增长方式是以指数级增长的。慢动门限为65535
-
增长上限:
- 当某些节点上达到了互联网的容量,发送方检测到丢包时,慢启动门限设置为当前窗口的一般。
拥塞避免算法:
- 增长:
- 线性增长方式,在一个RTT时间内,窗口增加1.
慢启动和拥塞避免进行拥塞控制:
- 开始时kwnd设置为1,使用慢启动方法;
- 当kwnd大于慢启动门限的时候,进行拥塞避免算法;
- 若发生拥塞,慢启动门限设置为当前窗口(拥塞窗口和通告窗口的)的一半;若是超时引发的拥塞,则cwnd设置为1,进入慢启动阶段;若是收到重复的ack引发的拥塞,采用快速重传和快速恢复算法。
分组丢失的两种指示:超时和收到三个重复的ack
快重传:接收端收到3个及以上的重复的ack时,很有可能是有一个报文丢失,就开始重传丢失的报文段,而无需等待超时定时器溢出。
快速恢复:收到3个重复的ack时,发送端会将发送速度设置到慢启动门限,然后使用拥塞避免算法进行传输。(原因:因为收到3个重复的ack时,网络状态可能还能传输,只是某个数据报丢失,不想采用慢启动这种方式来减少数据流。)
**定时器:**分为4中
重传计时器:
- 发送方在一段时间内没有收到接收方的确认报文时,进行重传
坚持定时器:
- 当ack中win窗口大小为0后,发送端持续进行探测窗口大小。(5,6,12,24,48,60)
保活定时器:
- 在双方都不进行数据交换时,双方会发送探测报文。(一般情况下由应用程序来完成),每75秒发送一个。
Time_wait计时器:
- 在断开连接过程中,客户端进入time_wait状态,并等待两个最大报文存活时间,防止服务端无法无法关闭的情况。
5秒发送一个。
Time_wait计时器:
- 在断开连接过程中,客户端进入time_wait状态,并等待两个最大报文存活时间,防止服务端无法无法关闭的情况。