TCP协议是一个很典型传输层协议。
TCP协议报文格式
可靠传输
可靠传输是 TCP 存在的初心!最核心的机制!
可靠传输的意思不是说100%可以传输成功,而是尽可能的传输,如果传输不过去,发送方可以知道自己传输失败,接收方有没有收到数据,会有个回应。
TCP 如何实现可靠传输:确认应答+超时重传
确认应答
确认应答指的是:接收方收到数据,会返回应答报文,ACK(acknowledge)报文。
TCP 报头中有一个序号字段和一个确认序号字段。
发送方,报头中序号是1,后面数据有1000个字节。
接收方,收到数据,返回的应答报文的报头中确认序号是1001。
那么发送方通过应答报文中的确认序号,就知道前面1000个字节已经成功传输了,接下来要传输 1001 往后的数据。
TCP 是针对数据的每个字节去编号的。
超时重传
丢包
丢包是网络上非常常见的情况。
网络传输过程中,通过很多的路由器,交换机进行转发,这些网络设备转发能力是有上限的,当这中间某一个网络设备太忙了,要转发的数据太多了,这种情况下有些数据就会丢失。
- 数据包丢失
如果数据丢包了,接收方就不会返回应答报文。发送方接收不到应答报文,如果迟迟收不到应答报文,发送方就会重新发送这个数据,这就是 超时重传。
- ACK丢失
如果应答报文也可能丢包,发送方也收不到应答报文,也会重发送数据,那么接收方就会收到两份一样的数据,但是没关系,TCP 会通过序号在接收缓冲区帮我们去重, 上层的应用程序不会读到重复的数据。
- 连续丢包
如果连续丢包,这种情况可能是网络出现了严重故障。
TCP 面对这种连续丢包的情况,也会重传,但是每次丢包都会延长超时等待的时间(TCP认为网络出问题了,重传大概率也不能成功,干脆摆烂)。
连续多次重传,都没收到应答报文,TCP 就会尝试重新连接,如果重连也失败,TCP 就会关闭连接, 放弃网络通信。