传输层协议——TCP
TCP协议段格式
TCP报头各部分意义:
- 16位源端口号和16位目的端口号:(各占两个字节)表示数据从哪个进程来,到哪个进程去
- 32位序号:占4字节。序号范围是0~2^32-1。
TCP是面向字节流的,TCP连接中传送的字节流中的每个字节都按顺序编号。整个要传送的字节流的起始序号必须要在连接建立时设置。
首部中的序号字段值指的是本报文段所发送的数据的第一个字节的序号。 - 32位确认序号:4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。
若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到。 - 4位首部长度:表示该TCP头部有多少个32位bit(四字节),一般TCP首部最大长度是15*4(字节)=60(字节),标准的报头是20字节,剩余的40字节即为选项部分
- 6位标志位
URG:紧急指针是否有效,当该标志位为1时,表示有紧急信号需要处理
ACK:确认号是否有效
PSH:提示接收端将接受缓冲区中的数据让应用层读走(涉及生产者消费者模型)
RST:对方要求重新建立连接,把携带RST标识的称为复位报文段,当连接建立异常时,重新建立连接
SYN:请求建立连接,携带SYN标识的称为同步报文段
FIN:通知对方,本段要关闭了,携带FIN标识的称为结束报文段,标志位为1时,表示结束
- 16位窗口大小:表示自身接受缓冲区剩余空间大小
- 16位校验和:发送端填充,CRC校验,接收端校验不通过,则认为数据有问题;此处的校验和不仅包含TCP首部,也包括TCP数据部分。
- 16位紧急指针:标识哪一部分的数据是紧急数据
- 选项:长度可变,最大长度40字节;当不使用选项时,TCP首部长度20字节
TCP的特点
TCP的可靠性:
- 校验和
- 序列号(按序到达)
- 确认应答
- 超时重传
- 连接机制
- 流量控制
- 拥塞控制
TCP提高性能:
- 滑动窗口
- 快速重传
- 延迟应答
- 捎带应答
确认应答(ACK)机制
通过序号和确认序号,完成确认应答机制
因为TCP协议将每个字节的数据都进行了编号,即序号。
每个ACK都带有对应的确认序号,意思是告诉发送者,已经收到了哪些数据,下一次将从哪里开始发送。
超时重传机制
- 当主机A发送给主机B的数据,因为网络拥堵或者其他原因,数据没有到达主机B
- 主机A如果在一定的时间间隔内没有收到主机B发送的确认应答,就会进行重发
还有一种情况可能主机A没有收到主机B的确认应答,即ACK丢失了
因此,主机B 可能收到很多重复的数据,那么TCP协议需要识别出这些重复的包,并且把重复的丢弃掉。
这时可以利用TCP协议头部的序列号,就可以很容易做到去重的效果。
关于超时的时间长短:
- 理想状态下,找到一个最小的时间,保证“确认应答一定在这和这个时间内返回”
- 这个时间的长短,随着网络环境的不同,有一定的差异
- 如果超时的时间太长,可能会影响整体的重传效率
- 如果超时的时间太短,可能会频繁发送重复的包
TCP为了保证无论在任何情况下都能比较高效的通信,因此会动态计算这个最大超时时间
在Linux,BSD Unix和Windows,超时以500ms为一个单位进行控制,每次判定超时重传的时间,都是500ms的整数倍。如果重发一次,没有得到应答,等待2*500ms后再进行重传,如果仍然得不到应答,等待4 * 500ms进行重传,以此类推,以指数形式递增,累积到一定的重传次数,TCP会认为网络或者对方主机端出现问题,强制关闭连接。