简谈TCP——确认应答、超时重传

一、TCP

TCP全称为 “传输控制协议(Transmission Control Protocol”). 人如其名, 要对数据的传输进行一个详细的控制;
1.TCP格式
简谈TCP——确认应答、超时重传
TCP报头各部分意义:

(1)16位源端口号和16位目的端口号:(各占两个字节)表示数据从哪个进程来,到哪个进程去
(2)32位序号:占4字节。序号范围是0~2^32-1。
TCP是面向字节流的,TCP连接中传送的字节流中的每个字节都按顺序编 号。整个要传送的字节流的起始序号必须要在连接建立时设置。首部中的序号字段值指的是本报文段所发送的数据的第一个字节的序号。
(3)32位确认序号:4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。
若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到。
4位首部长度:表示该TCP头部有多少个32位bit(四字节),一般TCP首部最大长度是15*4(字节)=60(字节),标准的报头是20字节,剩余的40字节即为选项部分
(4)6位标志位

URG:紧急指针是否有效,当该标志位为1时,表示有紧急信号需要处理
ACK:确认号是否有效
PSH:提示接收端将接受缓冲区中的数据让应用层读走(涉及生产者消费者模型)
RST:对方要求重新建立连接,把携带RST标识的称为复位报文段,当连接建立异常时,重新建立连接
SYN:请求建立连接,携带SYN标识的称为同步报文段
FIN:通知对方,本段要关闭了,携带FIN标识的称为结束报文段,标志位为1时,表示结束

(5)16位窗口大小:表示自身接受缓冲区剩余空间大小
(6)16位校验和:发送端填充,CRC校验,接收端校验不通过,则认为数据有问题;此处的校验和不仅包含TCP首部,也包括TCP数据部分。
(7)16位紧急指针:标识哪一部分的数据是紧急数据
选项:长度可变,最大长度40字节;当不使用选项时,TCP首部长度20字节

2.确认应答(ACK)机制
简谈TCP——确认应答、超时重传
简谈TCP——确认应答、超时重传
每一个ACK都带有对应的确认***,意思是告诉发送者,我们已经收到了哪些数据,下一吃发送数据应该从哪里开始。 如上图,主机A给主机B发送了1-1000的数据,ACK应答,携带了1001***。告诉主机A,我已经接受到了1-1000数据,下一次你从1001开始发送数据。

3.超时重传
由于TCP存在一个确认应答机制,所以每次发送端发送一个数据之后,都应该收到一个ACK应答,如果没有收到,发送端就需要重新发送数据。发送端没有接收到ACK应答有可能是发送时网络拥堵没有发送出去,但也有可能对端发送来的ACK在中途丢失了,这样的话就会导致发送端重新发送重复的数据到接收端。这时TCP协议报中的***就起到了至关重要的作用,接收端在接收到数据之后,通过核对***可以起到一个去重的效果。
简谈TCP——确认应答、超时重传

主机A发送数据给B之后, 可能因为网络拥堵等原因, 数据无法到达主机B; 如果主机A在一个特定时间间隔内没有收到B发来的确认应答,
就会进行重发;

简谈TCP——确认应答、超时重传

因此主机B会收到很多重复数据. 那么TCP协议需要能够识别出那些包是重复的包, 并且把重复的丢弃掉. 这时候我们可以利用前面提到的***,
就可以很容易做到去重的效果.

4.TCP的可靠传输

TCP的可靠传输是通过(1.*** 2.确认应答机制 3.超时重传机制 )来保证的。
***
TCP首部的序号字段用来保证数据能有序提交给应用层,TCP把数据看成一个无结构但是有序的字节流,而序号是建立在传送的字节流之上,而不是建立在报文段之上。TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
确认应答机制
TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。TCP默认使用累计确认,即TCP只确认数据流中至第一个丢失字节为止的字节。例如,接收方B收到了发送方A发送的包含字节0-2和6-7的报文段。由于某些原因,B还没有收到字节3-5的报文段,此时B仍在等待字节3(和其后面的字节),因此,B到A的下一个报文段将确认号字段设置为3。
超时重传机制
TCP每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到期但还没有收到确认,就要重传这一报文段。当检测到接收数据有错误时,会采取直接丢弃出错的数据,发送端等待接收端的确认超时后,会自动重发该报文段。