TCP是基于IP协议的传输层协议,但是IP协议本身是不可靠的,那么就得从TCP上做文章。
1.校验和 保证传输数据正确
这个校验和和UDP中的校验和基本一致,
伪首部+TCP首部+数据 一起计算出校验和,一个16位的整数
伪首部组成如下:
源IP地址(32位)| 目的IP地址(32位)|填充0(8位)|协议号(8位)|UDP包长度(16位)
那么为什么要把这个伪首部加进来呢?
TCP/IP通信中有五个要素,源地址IP,目标地址IP,协议号,源端口号,目的端口号。
前三项全部在IP首部中,如果缺少,可能导致收不到包或者收错包,因此有必要加进来一起验证。
2. 序列号和确认应答
大的数据块要分组,每个包都有一个序列号,一方面方便接收端在重新组成数据,另一方面,发送端通过确认应答可以知道数据是否传输过去了,如果确认应答中的序列号错误,则可以判断出丢包,再进行重发。
3. 超时重传
如果等了好久没有收到接收方的应答报文,那么可能有这么两种原因
- 接收方收到了数据,但是发给发送方的响应丢包了。
- 接收方没有收到数据。
这个时候,发送方得不到接收方的信息,那么就要靠超时重传机制了。那么重点是这个超时时间怎么确定呢?
TCP每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段。
新的RTTs=(1-a)*(旧的RTTs) + a *(新的RTT样本) RFC推荐a为1/8
超时重传时间应略大于上面的 RTTs加权平均往返时间
4. SACK选择性确认
接收端会通过sack把接收到的哪些数据告知发送方,发送方通过这个可以断定哪些数据包需要重传。