tcp在发送数据时会发生丢包和乱序的问题,那tcp又是如何解决这两个问题的呢?
如上图所示,tcp在发送数据的时候会创建发送缓冲区,缓冲区是要发送的整个报文,并给缓冲区中的每个字节编号,第一个字节序列号是,第二个1,第三个是2,以此类推.
每次发送报文的时候,从缓冲区中取出一段报文,组成请求报文,并在请求报文头部加上报文的起始序列号(也就是字节序列号,从第几个字节开始)和报文长度(报文所占的字节数),接收方在收到请求报文后,会回复确认ACk=接收到的报文起始序列号x + 报文长度l,发送方在收到回复确认后,会根据x和l计算出要发送的下一段报文的起始序列号,再次发送,重复发送直到报文发送完毕。
接收方在收到全部报文后,可以根据报文的序列号重构原始报文即对报文排序,如果发送过程中丢包了的话,比如丢失了起始序列号为100,长度为为100的这部分报文,接收方可以要求发送方重新发送,从而解决了丢包的问题。
TCP滑动窗口:TCP三次握手详解,滑动窗口,拥塞窗口,网络包路由过程