目录
TCP报文格式
TCP的特点
TCP原理:
1.确认应答机制
2.超时重传机制
3.连接管理机制
建立连接
编辑关闭连接
4.滑动窗口机制
5.流量控制
6.拥塞控制
7.延迟应答
8.捎带应答
TCP报文格式
1.源端口号:发送端的哪一个端口发出的
2.目的端口号:接收端的哪一个端口所接收
3.序号:每一个字节数据都进行了编号
4.确认序号:通知发送端已接收的TCP信息
5.首部长度:TCP报头的长度总和
6.保留:空着,方便日后对TCP进行调整或升级
7.标志位(一个一位):
- URG:紧急指针是否有效
- ACK:确认字符表明信息接收无误
- PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
- RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段
- SYN:请求建立连接;我们把携带SYN标识的称为同步报文段
- FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段
8.窗口大小:窗口大小的信息(后面解释)
9.校验和:确认TCP信息传输是否正确
10.紧急指针:标识TCP信息中哪一部分数据是紧急数据
11.选项:可有可无,有就是对TCP报文进行一定的拓展.因为选项的存在,TCP的报头长度是不固定的.
TCP的特点
- 面向字节流:随意的读取数据,不像数据报一样规定发出的大小与读取的大小需要一致
- 拥有缓冲区:创建Socket时同时会在内核中分别创建一个发送缓冲区与接收缓冲区
- 全双工:既可以发送也可以接收
- 保活定时器:不定时的向对方发送一个包,检查连接是否还存在.如果不存在了,会自动释放掉连接
TCP原理:
1.确认应答机制
A给B发送信息后,只有收到B相应的应答信息,才会继续发送下一条信息.
2.超时重传机制
情况一:
A发送信息后,可能会丢包.在一定时间没有收到B的应答信息后,A会重传上一条发送的信息.
情况二:
A发送信息后,B的应答信息丢失了.在一定的时间后,A重传上一条信息.
此时B就会收到两条相同的信息.可以在B端的接收缓冲区中根据序列号对信息进行去重操作
3.连接管理机制
建立连接
根据前面的确认应答机制,A向B发起连接时需要分四步:
- A向B发送SYN请求建立连接
- B向A发送ACK表示确认收到信息
- B向A发送SYN请求建立连接
- A向B发送ACK表示确认收到信息
为了节省资源,可以发现第2步与第3步分别的发出对象与接受对象都是一致的且时间连续.
所以,第2步与第3步可以合并一齐发送.
就有了TCP建立连接中的三次握手.
TCP的三次握手操作,既可以确认连接双方的身份,也可以反映出连接双方的接受功能与发送功能是否正常,并在一定程度上对TCP传输的可靠性起到了辅助作用.
关闭连接
同样的,A向B关闭连接也是一共分为四步:
- A向B发送FIN表示即将关闭连接
- B向A发送ACK表示确认应答
- B向A发送FIN也表示即将关闭连接
- A再向B发送ACK表示确认应答
在A最后一次向B发送ACK后,才会分别真正的关闭连接,释放资源
以上就是TCP的四次挥手.
此处中的B不会把ACK与FIN合并成一条TCP发送给A.
因为两条语句之间可能会有一定的时间间隔.
这个if语句中的hasNext是接收到A端的FIN信息后判断的.
在break之后B会立即发送ACK.
至于什么时候发送FIN取决于编写的代码是如何运行的.
(代码来源于:[JAVAee]网络编程-套接字Socket_HY_PIGIE的博客-CSDN博客的TCP示例一中的服务器截取)
4.滑动窗口机制
我们通过确认应答机制其实可以发现,其效率并不是非常高效.
发送信息后要等待对方发送确认应答后才能发送下一条,不然就要等待超时重传了.
于是,便有了滑动窗口机制.
滑动窗口机制是:
根据一定的大小,可以等待返回的AC发送后面的TCP信息
如下图:
在A发送1~1000后没有收到ACK也可以紧接着发送后两条TCP信息.
在A收到了发送1~1000的ACK后,窗口会相应的向后移动一条TCP信息.
当然其中也会发送丢包的情况
情况一:
B端返回的ACK丢包.
像上图中,如果接收了1~1000,下一条为1001的ACK丢包了,但下一条1001~2000的ACK没有丢包.
A就可以通过1001~2000的ACK来确实1~1000已经被B接收到了.
(ACK的含义能够涵盖上面所有的ACK,所以之前的ACK丢包了也没有太大的影响)
情况二:
A发送的信息丢包.
A发送的1~1000丢包,并继续发送后面的TCP信息.
B端照常接收,但会申请1~1000的信息,当连续三次申请后.
A会重传1~1000的信息
5.流量控制
接收端处理数据的速度是有限的。
如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应。
因此TCP支持根据接收端的处理能力,来决定发送端的发送速度。这个机制就叫做流量控制
(如果接收端缓冲区满了,就会将窗口置为0;这时发送方不再发送数据,但是需要定期发送一
个窗口探测数据段,使接收端把窗口大小告诉发送端。)
6.拥塞控制
在网络上,计算机可能会进入拥塞状态.如果在拥塞状态下,TCP还使用滑动窗口增大效率的进行传输信息.会导致许多信息丢失,加重拥塞状态.
对此,TCP引入了慢启动.
开始先发少量的数据,对网络状态进行试探,并使用窗口对信息的发送进行了一定的限制.
初始,窗口大小为1,在发送M1并收到确认应答后.窗口的大小成倍的增加,发送方继续根据扩大后的窗口发送信息.
(图片来自《计算机网络》[第七版]谢希仁编著)
虽然叫"慢启动",但他增加的速度是以指数形式增加的.到了后面速度会非常快.
这就不符合为了应对计算机拥塞状态的初心了.
于是,便有了一个阈值.在窗口大小达到这个阈值后,会以线性的方式递增.
拥塞控制主要作用是,在避免给网络造成太大压力的同时尽快传输信息的方案.
7.延迟应答
在接收端中的接收缓存区,加设内存空间为10.
一次收到了5大小的信息并返回ACK.
返回ACK后,接收端就会将缓存区的信息进行刷新.那缓存区还有额外5的空间就会一直没有被使用到,浪费了许多性能.
对此,TCO引入了一个延迟应答.
接收端接收一次信息,往缓存区中写入了5.且并没有立刻返回ACK.
而是,间隔一段时间后再返回ACK.在这段间隔的时间中,就可以接收第二次发送的信息,这时接收缓存区又写入了5.
再返回ACK的时候就可以一次性将10大小的缓存区全部刷掉
但也并不是每一条信息都会延迟应答.
- 数量限制:每隔N个包就应答一次;(N一般为2)
- 时间限制:超过最大延迟时间就应答一次
8.捎带应答
在延迟应答的基础上,我们发现,很多情况下,客户端服务器在应用层也是 "一发一收" 的.
在A发送了1~24后并向B申请1~5的信息.
B可以将确认1~24的ACK与发送1~5的信息合并成一个包发送.
总的来说,TCP这么多原理与属性.实现了其可靠性和帮助提升性能的为:
可靠性:
- 校验和
- 序列号(按序到达)
- 确认应答
- 超时重发
- 连接管理
- 流量控制
- 拥塞控制
提高性能:
- 滑动窗口
- 快速重传
- 延迟应答
- 捎带应答