概述
- .TCP是一个可以提供可靠的,支持全双工,连接导向的协议,因此再客户端和服务端之间传输数据的时候,必须先建立一个连接
TCP的特点
- 什么是连接
- 连接是一个虚拟,抽象的概念
- 能让两个通信的程序间确保彼此都在线
- 加快响应速度
- 连接也被称为会话
- 拥有连接一般都是使通信更稳定,安全,但是会消耗更多资源
- 全双工
- 单工:任何时刻数据只能单向发送
- 半双工:允许数据在两个方向上传输 ,在某一时刻,只允许数据在一个方向上传输
- 全双工: 任何时刻都能双向发送数据
- 可靠性
- 可靠性是指数据保证无损传输
- 发送方将数据有序发送,但是接收方接收数据可能是无序的,所以接收方要有一种算法保证使无需的数据恢复到原有顺序
- 多播:发送方将数据同时发送给多个接收方
- 多播时可靠性就要每个接收方都获得无损副本
- 多播中有一个强可靠性:就是有一个接收方接收到了无损副本,那么其他接收方都必须接收到无损副本,否则要么所有接收方都要拒接这个消息
TCP协议的工作过程
-
建立连接的过程(三次握手)
-
断开连接的过程(四次挥手)
-
传输数据
- 报文拆分:将应用层数据拆分成一个个TCP段
- 为什么拆分:
- 应用层数据很大时无法一次性传输完
- 拆分后可实现并行传输
- 为什么拆分:
- 顺序保证
- 数据传输时顺序发出,乱序到达
- 对TCP段进行标序号,接收后根据序号进行排序
- 如果TCP段特别多的时候该如何进行排序呢?
- 时间窗口:每次排序只固定在某一时间段内的数据,发送方给接收方一个时间窗口,在这个时间窗口内发送数据,接收方接收这个时间段的数据并进行排序,如果接收的数据不是这个时间段内的数据,那么接收方可能会抛弃整个时间窗口的数据
- TCP序号:
- 发送序号(Seq),接收序号(Ack)
- 一个端的发送序号是另一个端的接收序号
- a发送Seq=10,Ack=100给b,那么b发送Seq=100,Ack=10给a
- 数据传输时顺序发出,乱序到达
- 报文拆分:将应用层数据拆分成一个个TCP段
TCP头部结构
- TCP头
- 介绍
- TCP报文段:
- TCP头部
- TCP段数据
- 源端口:描述发送方机器上的应用
- 目标端口: 描述接收方服务器上的应用
- 发送序号(Seq)/接收序号(Ack):每个序号32位字节
- TCP报文段:
- TCP头-标志位
- 大概又9个标志位:如SYN,ACK,FIN这些属于标志位
- NS,CWR,ECN标志位: 属于TCP扩展协议
- ECN:显示拥塞控制协议,有助于帮助解决延迟和丢包问题
- URG:紧急标志位(这个数据紧急处理)
- SYN:同步序号,也就是在建立连接
- FIN:终止连接
- ACK:响应
- PSH: 传送数据
- RST: 重置连接
- 介绍
TCP协议周边设置
- 纠错能力
- 作用:保证数据可靠性
- (Tcp通过流控能力,帮助两边协同速率提高可靠性)
- TCP拥有一个16bit的Checksum字段
- Checksum是一个函数,把原文映射到一个不可逆的16bit的编码中,接收方同样用这个Checksum函数就可以计算原文的编码,计算完之后比较两个编码是否一样,这样就知道原文传输过程中有没有发生变化,如果变化了,接收方就会丢掉这个封包
- 流控能力
- 主要目标:
- 让发送方和接收方协商一个合理的速率,让两边稳定工作
- 流控能力主要利用滑动窗口
- 例如发送方有一个一万字节的窗口,发送方需要填满这个窗口,而接收方会给一个返回ack,如果发送方没有接收返回,那么发送方就不会发送更多数据了,一直等到你的返回
- 主要目标:
- 作用:保证数据可靠性