面向连接的TCP协议(Transmission Control Protocol )是一种面向连接的流式传输协议,它通过三种机制来保证传输的可靠性:
序列号,应答机制和超时重传。tcp中处理超时重传的函数有:
tcp_do_transit:处理具体的重传工作;
reset_xmit_timer:重新设置超时定时器;
tcp_retransmit_time:使用指数退避算法重设定时器;
tcp_retransmit:推测重传原因;
tcp_write_timeout:超时重传的次数限制;
retransmit_timer:超时重传入口。
定时器主要分为四种:普通数据超时重传,窗口探测和保活定时器,2MS定时器。tcp每次发送完数据后并不是立即删除发送的数据,而是把它们保存到重发队列中。send_head,send_tail和link3分别指向队头,队尾和下一个元素。只有在接受到远端的ACK应答后,数据才从重发队列中移除。在发送数据后会自动设置一个重发定时器,并且tcp采用指数退避算法每次都是上次定时的2倍,最长不超过2min。
其中保活定时器有一些特殊性,它发送的数据包使用老序列号,并且不使用指数退避算法而是采用固定时间的时间间隔发送保活数据。
TCP协议将数据包发送到网络可能经过以下队列:
1. partial队列,该队列只缓冲一个数据包,当该数据包长度超过MSS时,将被发送或缓冲到别的队列中(partial的超时为1s);
2. write_queue队列,该队列缓冲由窗口限制或者本地节制下来的数据;
TCP不推荐减小发送窗口的大小,当窗口值小于最大窗口值一半或大于MSS值事,都设为MSS大小。
3. send_head已发送出去但未收到回应的数据。
对于紧急数据和带外数据OOB(Out of Band)是不同的,紧急数据是指插入到普通数据中的一些字节;而带外数据一般需要新创建一个数据通道单独传输。