目录
一.TCP本身特性
二.报文格式
TCP十大核心特性
一.确认应答
二.超时重传
三.连接管理(三次握手,四次挥手)
三次握手
四次挥手
四.滑动窗口
情况一:接收方的ACK丢失
情况二:发送方的数据包丢失
五.流量控制
六.拥塞控制
七.延迟应答
八.捎带应答
九.粘包问题
十.TCP的异常处理
情况一:程序突然崩溃
情况二:程序正常退出
情况三:没法发送和接收数据(电脑坏了,网络断了)
接收方无法接受
发送方无法发送
在介绍TCP协议的十大特性之前,我们先来看看TCP本身的特性
一.TCP本身特性
1.有连接
2.可靠传输
3.面向字节流
4.全双工
二.报文格式
这是各大教科书上的
实际上我们应该把他竖过来看,也就是从上到下,从左到右
下面正式开始讲解
TCP十大核心特性
一.确认应答
发送方在发送一条数据给接收方之后,接收方会立刻返回一个ACK作为回应,表示自己收到该条数据
这就是确认应答,能够保证传输的数据一定能发送给对方
二.超时重传
如果发送方没有接收到回来的ACK相应
等待一段时间后,发送方默认该数据已经丢失,会重新发送该条数据给对方
如果依然没有接收到ACK回应,那么会再次发送
但是每次发送的时间间隔会越变越长
这就是超时重传
三.连接管理(三次握手,四次挥手)
三次握手
第一步:发送方给接收方发送一条信息(发送SYN);
第二步:接收方接受到信息后,发送两个消息,一个是确认应答(ACK),另一个是回复消息(SYN)
第三步:对于接收方发回来的ACK和SYN应答,发送方再次回复一个ACK确认应答
四次挥手
第一步:发送方发送FIN,请求和接收方断开连接
第二步:接收方回应ACK收到断开请求
第三步:接收方向发起方也发送FIN,请求断开连接
第四步:ACK回应,接收方断开连接请求
四.滑动窗口
从上面的三次挥手和四次握手发现,我们TCP的大量时间都停留在接受ACK响应上,于是,我们采取批量传输数据的形式
而为了保证接受方能够承担同时处理的最大数据,保证接受方不崩溃,我们限制了发送方的最大发送
第一步
第二步:
也就是说,滑动窗口能够保证,接收方最大同时处理数据的上限,和发送方最大能发送数据的上限
如果在这种批量传输的情况下,出现数据丢失怎么办?
情况一:接收方的ACK丢失
那么发送方没有收到接收方回应的ACK,如果后面回复的ACK包含了前面的数据
那么就默认前面的数据已经收到,就不用管了
情况二:发送方的数据包丢失
那么接收方就会一直请求发送方的数据,直到接受到相应数据为止
五.流量控制
就是在滑动窗口的基础上,我们动态调整滑动窗口的大小,使得我们尽可能在保证数据传输稳定的情况下,扩大我们传输的数据量
如何动态调整呢?这就是我们说的拥塞控制
六.拥塞控制
简单来说,就是速度如果达到了传输的上限,那么就会立刻反弹回一个较低的值,然后继续增长速率
如此反复,直到稳定在了一个比较合理的数值范围内,这就是拥塞控制
需要注意的是
最开始我们的速率增长是指数级别的增长,比如 2的一次方 -> 2的二次方 -> 2的三次方....
然后到了一个比较高的值之后,为了防止下一个次方直接超出接受范围很多
所以从那个值之后,我们采用线性增长,而不是指数增长了
七.延迟应答
接收方接受数据之后,不会立刻相应给发送方,而是等待一段时间,等接收方接收到多组数据后再返回
八.捎带应答
如果在很短的时间内,接收方收到很多信息,并且都需要返回,那么多条返回消息,就可以合并为一条消息返回
九.粘包问题
因为是 捎带应答会使得多个消息一同返回给发起方,发起方是没有办法判断每个消息应该怎么分段,哪个消息是哪个消息的回应
解决方式:
(1)分隔符:设置一个特殊字符用作分隔符
(2)携带报头长度:在报头携带该消息的字符串长度
十.TCP的异常处理
情况一:程序突然崩溃
操作系统会自动回收程序遗留/占用的资源,类似于close操作,然后发生四次挥手
情况二:程序正常退出
同情况一,回收资源+四次挥手
情况三:没法发送和接收数据(电脑坏了,网络断了)
接收方无法接受
接收方无法接受数据,也就是无法回应ACK相应给发送方,当发送方多次发送数据也没有ACK回应之后,就默认接收方不行了,然后停止发送数据
发送方无法发送
在接收方和发送方里面存在一个"心跳包",双方会周期性发送一个小数据,判断对方是否存活,如果检测到发送方没有心跳回应,那么就默认发送方没了,接收方也就停止接收数据.
注意:在接收方电脑坏了的情况下也能用心跳包判断,但是ACK更加直接