TCP(Transmission Control Protocol) 传输控制协议 :对数据的传输进行详细的控制
TCP协议段格式
TCP报文 = TCP报头 + TCP载荷
选项之前的长度固定20个字节
TCP并不像UDP长度固定8个字节,长度不固定
首部长度:描述Tcp报头具体有多长
选项:相当于对TCP报文的一些属性进行解释说明
TCP报头长度 = 首部长度值 * 4 (字节);
选项长度 = 首部长度 - 20 字节
保留: 保不齐以后要有,先占个位置
TCP为什么要保留?
为了以后的扩展做准备
对于网络协议来说,进行扩展升级成本是极高的,全世界有几百亿的上网设备,想要升级,就需要对这些设备的操作系统同步升级,都支持升级后的协议.
TCP的内部一些工作机制
10个比较核心的机制
一.确认应答
由于网络延时,收到的信息可能存在变数
网络上后发先至是客观存在的,那我们如何来避免?
我们引入了序号,即使当前的数据乱了,也能根据序号,区分当前应答报文针对哪一个数据
任何一条数据都是有序号的
只有应答报文(ACK)才有确认序号,而普通报文在确认序号字段无意义
ACK标志位为1是表示该报文是应答报文, 标志位为0是表示该报文就不是应答报文
主机1 对 主机2 发送一个消息,主机2收到后就会返回一个应答报文(ACK),主机1收到应答后,才能知道主机2收到了刚才发的数据
TCP的字节序号是依次累加的,每一个TCP数据报报头填写的序号只需要写TCP数据的头一个字节的序号即可
TCP进行可靠传输,最主要的就是靠确认应答机制,通过应答报文可以让发送方知道是否传输成功
进一步引入序号,确认序号,对多组数据进行区分
二.超时重传
如果发生丢包(发的数据丢了 或者返回的ACK丢了), 丢包是一个概率性事件,那么重新发送一下数据报,是有极大的概率传输成功的
超时重传:超过一定时间未响应就重新传输
那么对于多次传输的数据TCP是有去重的功能
TCP存在一个 接收缓冲区 这样的一个存储空间(接收方操作系统的一段内核)
根据数据的序号,TCP很容易识别当前接收缓冲区里的两条数据是否重复,如果重复直接把后来的数据丢掉,保证应用程序读取到的数据一定是不重复的
TCP使用接收缓冲区,对收到的数据进行重新排序,保证应用程序读到的数据是有序的
重传到达一定的次数时就不会重传了,认为网络出现了故障,TCP接下来会尝试重置连接,如果重置失败就彻底断开连接
可靠传输是TCP最核心的部分
TCP通过确认应答和超时重传体现可靠传输的,
其中确认应答描述的是传输顺利的情况,而超时重传描述的是传输出现问题的情况,
两者相互配合,共同支撑整体TCP的可靠性
三.连接管理
TCP的建立连接的过程(三次握手)
本质进行四次信息传递,当时中间两次一定要进行合并(封装封装分用两次肯定比一次封装分用成本更高)
服务器的系统内核接收到SYN后,会立即发送ACK,已经SYN;
三次握手的意义:
1.让通信双方各自建立对对方的"认同"
2.验证各自的发送能力和接收能力是否完整
3.在握手过程中,双方协商一些重要参数
而在TCP通信过程中需要通信双方之间相互同步,就可以利用三次握手的机会进行数据的同步
断开连接过程(四次挥手)
CLOSE_WAIT:阻塞等待客户端数据请求
TIME_WAIT:出现主动断开连接的一方
如果客户端是主动断开连接的,那么出现TIME_WAIT表示4次挥手结束 ,
对于TIME_WAIT最大等待时间,约定2MSL(两个节点之间数据传输消耗的最大时间) 通常情况下MSL为60s
如果最后一个ACK丢包怎么办?
三次连接和四次挥手都会超时重传,TIME_WAIT等待一段时间,就是为了处理最后一个ACK丢包的情况,能够收到重传的FIN后,进行ACK响应
四.滑动窗口
在保证可靠性的基础上,加强传输效率
滑动窗口本质上:降低确认应答,等待ACK消耗的时间, 不需要等待,批量发送一组数据,然后用一份时间,等待多条数据的ACK应答报文
窗口大小:不需要等待就能直接发送最大的数据量
此时2000就是窗口大小
丢包
1.ACK丢了
不需要做任何事情
确认序号:表示该序号往前的所有数据都已经确认到达
只要后面结束到ACK 确认序号4001 就包含了前面的ACK信息
2.数据丢了
若1001~2000丢包,那么接下来2001~3000下次返回的ACK确认序号还是1001
收到三次同样的确认应答时 发送方则进行重新发送
如果当前的传输数据十分密集,则按照滑动窗口进行快速重传处理丢包
如果当前的传输数据很稀疏,则使用超时重传的方式处理丢包
五.流量控制
滑动窗口,窗口越大,传输效率就越高,但是窗口不能无限大的
发送方的发送速度,不能超过接收方的处理能力
流量控制:根据接收方的处理能力,协调发送方的发送速率
我们如何衡量接收方的处理能力?
可以看看接收方的接收缓冲区的剩余空间大小
TCP首部中有一个16位窗口,就是存放了窗口大小信息;
16位数字最大表示6553,那么TCP窗口最大就是65535么?
实际上,TCP首部选项中还包含了一个窗口扩大因子M,实际窗口大小是窗口的值左移 M位;