传输层TCP协议(Transmission Control Protocol),它要对数据的传输进行一个详细的控制。
TCP对数据传输提供的管控机制,主要体现在两个方面:效率和可靠(注意是可靠并不是安全)
TCP的保证“可靠性”:
1、TCP会尽自己最大的努力将数据发送给对方
2、如果真的遇到发送不过去的情况,TCP至少会告诉发送进程,数据发送失败了
3、通过checksum保证不会收到错误的数据
4、TCP能保证收到的数据一定有序(按照发送进程发送的顺序)
5、TCP会根据对方的接收能力和网络线路的承载能力,进行流量的控制
TCP做了哪些机制来保证可靠性?
1、确认应答机制:接收方(对方的TCP)有责任对收到的数据进行确认(acknowledge)来应答。
如果收到多份数据我们如何知道应答的是哪份数据呢?我们会对数据进行编号---序列号
TCP将每个字节的数据都进行了编号,每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到的那些数据;下次你从哪里开始发送。
SN + 携带数据 ——>发送作用 ASK标志位 + ASN ——>确认作用
确认段(segment):一份数据既可以起到发送数据的角色也可以起到确认的角色
如果我发送了一份数据但是没有收到应答,可能发生了什么?
(1)、对方没收到 ---主机A给主机B发送数据,可能因为网络拥堵等各种原因,数据无法到达主机B(2)、对方收到了,并且应答了但是应答没有发送过来----ACK丢失
这时候我们没有收到应答不能无限期等下去,就需要超时重传机制
如果是第一种情况,主机A在一个特定时间间隔内没有收到B发来的确认应答,就会进行重发,但这时如果遇到第二种情况,也就是A没有收到B的确认应答,那么B就会收到很多重复的数据,那么TCP协议就需要能够识别哪些包是重复的并把重读的丢弃。
那么问题就是---主机B如何判断数据是重复的呢?
这时候我们可以利用前面提到的序列号,可以很容易的做到去重效果。
超时重传是无限制的吗? 当然不是,是有上限的
(1)TCP关闭本次连接
(2)TCP会通知进程(在java中采用异常方式IOException)
(3)TCP会发送一个reset segment
连接(connection)管理(management)机制
正常情况下 TCP要经过三次握手建立连接,四次挥手断开连接
为什么TCP要设计建立连接?
(1)必须确认对方存在,才能可靠的传输
(2)交换一些必要的数据
在正式开始通信之前需要一个阶段:(1)确认对方在线(2)同步一些基本信息
三次握手具体过程:
主动方:同步主动方的信息给被动方
被动方:同步被动方信息给主动方同时应答第一次的数据
主动方:应答
就完成了三次握手的过程 建立连接(ESTABLISHED)
当双方都处于ESTABLISHED时,此时双方地位相等,相当于打电话,可以相互通信,没有谁先谁后的关系了。
四次挥手断开连接
标志位是fin(finish),进行断开操作。主动断开方向被动断开方发送一个fin,被动断开方向主动断开方回一个ack,直到被动断开方也向主动断开方发送一个fin,主动断开方向被动断开方发送了ack,就算断开连接。
需要注意的是:主动断开方不一定是主动连接方
流量控制 -- 发送量控制
1、为什么要进行发送量的控制 ----减少无用功
2、根据对方的接收能力或者线路的承载能力 控制我的发送数据的多少
狭义流量控制----根据对方的接受能力进行控制
我们怎么知道对方的接收能力---对方告诉我们的
对方的接收能力具体是什么?---TCP的接收缓冲区里装的是:对方接收到的并且没有被应用层读走的,类似于菜鸟驿站里的包裹一样。这个接收能力指的是TCP的接收缓冲区里面还能装多少数据,类似一边接水一边放水的水池问题。
对方如何告诉我们自己的接收能力的?---放在TCP首部,在TCP协议栈每次发送segment都会携带当前接收窗口的大小。
我们作为发送方比较实时的知道了对方的接收能力。我们的发送量必须要<=对方的接收窗口。
发送如何进行控制----发送方利用滑动窗口的机制进行发送量的控制。
发送缓冲区:应用层写入,将要发送但还没有发送的数据
已发出数据可以删除吗?---不可以,需要对方确认收到才可以删除
拥塞控制 --- 根据网络承载能力控制
如何得知当前网络承载能力?---拥塞窗口
没有一个精确的值 只能采用一些算法推测出拥塞窗口