【持续更新中】
6.6
TCP是一种流协议(stream protocol)。这就意味着数据是以字节流的形式传递给接收者的,没有固有的"报文"或"报文边界"的概念。从这方面来说,读取TCP数据就像从串行端口读取数据一样--无法预先得知在一次指定的读调用中会返回多少字节(也就是说能知道总共要读多少,但是不知道具体某一次读多少)。
TCP会记录它发送了多少字节,以及确认的字节,但它不会记录这些字节是如何分组的。实际上,有些实现在重传丢失分组的时候传送的数据可能比原来的多一些或少一些。
对TCP应用程序来说,就没有"分组(包)"这种概念。如果应用程序的设计与TCP对数据的分组方式有所关联,就应该考虑重新设计这个应用程序了。
既然任意一次指定的读操作中返回的数据量都是不可预测的,就必须在应用程序中做好应对这种情况的准备,这些情况下边界都是由应用程序级维护的。
最简单的情况就是定长报文。在这种情况下,只需要读取报文中固定数量的字节就可以了。
如何识别出一个TCP流?
Q:给你一个报文包,求问如何识别出一个TCP流?
A:用五元组,(源ip,目的ip,源端口,目的端口,协议号(TCP)),根据这个就能识别一个tcp流了。
https://blog.csdn.net/bcbobo21cn/article/details/91349077
TCP流和TCP会话(TCP三次握手成功完成,即可建立TCP会话)
https://blog.51cto.com/hellof5/1906291
心跳测试:每隔一段时间向服务器发送数据包。为了节省资源,通常会发送空数据包。如果发送失败表明套接字已断开,此时需要根据特定条件释放资源并重新连接。
三次握手和四次挥手:
https://www.cnblogs.com/Qing-840/p/9283367.html
TCP只确认该流中至第一个丢失字节为止的字节,所以TCP被称为提供累积确认
可靠数据传输服务:
快速重传
3.5.5 流量控制