TCP保证数据的顺序传输使用了ISN(initial sequence number - 初始化序列化)
为什么会导致数据乱序?
假设A和B之间使用相同的序列号:
- A向B发送SYN,seq=1的报文,经过三次握手建立连接
- A使用相同的seq=1向B发送200字节数据,由于网络阻塞,该数据报一直在网络中逗留
- A重启,B释放连接
- A重新发送seq=1给B建立连接
- A使用相同的seq=1向B发送250字节数据,B成功接收
- 之前由于网络问题未接收到的200字节数据到达B,B误以为是新建立的连接发送过来的数据,就会接收200字节数据
- 最终导致B在收到新tcp连接的数据后,又收到旧tcp连接的数据,从而出现数据乱序的问题。
解决方法
- A向B发送连接请求报文段,选择初始化序号seq=x
- B同意建立连接,在确认报文中发送确认号ack=x+1,同时自己选择一个序列化seq=y
- A收到B的确认,向B给出确认。ack=y+1,seq=x+1
如果不携带数据则不消耗序号,在这种情况下,下一个报文段的序号仍是seq=x+1