本文已参与「新人创作礼」活动,一起开启掘金创作之路。
TCP机制
滑动窗口
在保证可靠性的情况下保证效率。如果没有这个的话就会导致在等待ACK的时候浪费大量的时间。
滑动窗口是把数据发出去大一波,然后等一个的ACK然后根据ACK,再发送下一组数据。
窗口越大,传输的速度就更快。
核心问题:丢包
丢包分为两种
-
ACK丢了
其实这个是不重要的。因为下一个ACK到达之后,接收方自然会认为之前的已经收到了。 -
数据丢了
这个就比较严重了,接收数据的一方会反复发送请求,这个就导致发送数据方开启了重传的机制, 只重传丢了的数据
流量控制
在滑动窗口中,窗口越大,传输的效率越高,但是我们同样要考虑接收方能不能接受。
发送方发送的时候超级快,但是接收方接收的超级慢,那怎么办呢?
这个时候我们就需要流量控制。
那这个流量控制的大小是怎么确定的呢?
那当然是接收方接收缓冲区的剩余空间大小。
接收方可以通过ACK来告知发送方剩余空间的大小。
拥塞控制
是滑动窗口的衍生,也是用来控制滑动窗口的。
拥塞控制是衡量,发送方到接收方,整个链路之间拥塞情况。
发送方能发的多快,不仅仅是接收方能处理多少,也还有中间链路的处理能力
拥塞控制处理方案就是通过实验,逐渐调整窗口,找到一个合适的值。
延时应答
相当于流量控制的衍生
延时应答是想流量控制的窗口能尽可能的大一点
捎带应答
因为延时应答的存在,导致了原本两个消息是分开来应答的,现在一起应答。这个就是捎带应答。
粘包问题
不光光TCP存在粘包 , 其他的面向字节流的机制也存在
TCP粘包指的是粘的是应用层数据报,在TCP接收缓冲区中,若干个应用层数据包混在一起,分不开来
解决方案
在包和包之间放一个边界隔断。(这个其实是应用层的问题)
TCP异常处理
1.进程终止
TCP连接是通过socket来建立的。如果直接杀死一个进程,其实是和四次挥手一样关机的。
2.机器关机
正常的关机就是把所有的进程关掉,机器才会关机
3.机器断电/网线断电
1)如果是接收方断电的话,发送方因为接收不到ACK所以会开启超时重传,
重传几次之后,发送方会尝试重连,如果重连失败就会关掉所有和接收方的所有连接信息
2)如果是发送发断电的话,接收方是不知道发送发是断电了还是休息了。
此时,接收方会发送小的报文给发送方,如果没有收到发送方发送的ACK
那么接收方就会断开与发送方的连接。