
因为数据在传输过程中,可能会出现**“先发后到”的现象,所以就需要引入序号来标识数据的先后顺序**。

确认应答是TCP协议中,保证数据可靠性传输的核心。
数据在网络中传输时,可能由于网络的不稳定,导致数据的丢失。
丢包会导致网络十分卡顿。
丢包的两种情况:

如果数据发出去一段时间了,但是并没有收到确认应答,就说明可能发送了丢包现象,此时就需要重新传一下数据。


如图所示:超时时间随着丢包次数的增多而增加。
如多丢包次数过多(超过三次),就说明大概率是连接出了问题,此时就可以放弃连接。
详见这篇文章:
滑动窗口的引入是为了提供TCP传输数据时的效率。 滑动窗口的本质就是批量发送,滑动窗口的大小就是一次性批量发送的数据量多少。
在前面我们所举的例子当中,数据都是以这种方式进行传输的:

但是,在这种传输方式中,大多数的时间都是发送方等待接收方的确认应答,效率极其不高。
所以,我们便改进位下面的传输方式:

这样的话,就可以减少等待时间。
这就好比:去小吃街买吃的


这里的确认号表示:该序号之前的所有数据都收到了


这种情况发生时,并不会有太大的影响,只要ACK别丢的太多就行。
如图:ACK=1001丢了,滑动窗口最左侧就不会滑动到1001,但是ACK=2001被主机A正常接收到,此时滑动窗口最左侧就会直接滑动到2001,后者的ACK=2001就包含了ACK=1001所表示的含义。

流量控制就是:根据接受方的接收能力,来限制发送方滑动窗口的大小。

把B的TCP的接收缓冲区想象成一个水池
A就相当于水池的入水口
B读取数据就相当于出水口

在报文段中就有一个”窗口大小“的字段,接受方通过这个字段的反馈就可以知道接受方的接收能力了。


由上图可知,“TCP窗口大小” 为16位,16位表示的最大数是65535,那么TCP窗口最大就是65535字节吗?
其实并不是,因为TCP首部的40字节选项中,包含了一个窗口扩大因子M,实际窗口大小是 窗口字段值左移M位。
在数据传输的过程中,除了有发送方和接收方以外,还有许多的网络设备:

这些设备的数据传输能力参差不齐,所以发送方在传输数据时,如果不考虑这些设备的传输能力,就容易造成网络环境的拥塞。
MSS:数据报
cwnd:拥塞窗口

让窗口在保证可靠性的基础上,尽量更大一点,从而提高效率。
下面,我们用一个例子展示以下下延时应答的优点:


对比一下就能知道:延时应答时,送货方第二次运输来的货物就比立即应答更多一点,这就相当于是增大了发送端的cwnd。
采用延时应答就会延时上面的这种好处,从而提高了数据传输的效率。
有了延时应答的机制,那么就可以使ACK延时,和响应一起返回,从而省去了一次封装分用的时间,从而提高了效率。

注意:捎带应答是一个概率性的机制,并不会100%发生。

想要解决粘包问题,就得设计一个合理的应用层协议来解决。方法如下:
给应用层数据设定“结束符”,“分隔符”;
给应用层数据设定长度。

假设数据传输的双方中,有一方的的进程意外终止,这个过程是可以被操作系统察觉到的,操作系统就会代替该进程,向另一方发送FIN报文给对方,然后与对方进行“四次挥手”。
机器重启的时候,也是先关掉进程,所以可进程终止一样,但是有可能操作系统在发送FIN的时候,也会关闭,所以这个四次握手会进行,但是不一定能完成。
每隔一段时间,向对方发送一个PING包,期待对方回复一个PONG包,如果PING包发过去之后,对方没有回复PONG包,并且多试几次之后也不行,此时就说明对方挂了。
这个问题,看似文UDP,其实考的就是TCP。
注意:传输层协议不知这两种