TCP 是可靠传输协议,他是在运输层实现的可靠传输:
成都创新互联公司是专业的五峰网站建设公司,五峰接单;提供网站建设、网站设计,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行五峰网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
网络层的传输是不可靠的,虽然在网络层甚至数据链路层就可以通过协议来保证数据传输的可靠性,但将其放在到达应用层之前的最后一步会更加合适。
可靠传输的原理主要分为:确认回复,超时重传、给数据包编号、连续 ARQ、滑动窗口、累积确认、选择确认。
要实现可靠传输,最简便的方法就是:我发送一个数据包给你,然后你向我回复收到,我再继续发送下一个数据包。传输模型如下:
这种一来一去的方式就是 停止等待协议 (stop-and-wait)。上文说到,TCP 首部的 ACK 字段为 1 时,表示这个报文是一个确认收到报文。
如果当前网络环境不可靠,就会导致数据包丢失。解决这个问题的方法是: 超时重传 。当一个数据包发出去后,发送端就开始计时,如果时间到了还没有收到确认回复,就可以认为是发生了丢包,此时发送端就再次发送此数据,也就是重传。
但重传会导致另一个问题:如果原先的数据包并没有丢失,只是在网络中待得比较久,这时接收方就会收到两份一样的数据。解决这个问题的方法就是: 给数据包编号 ,接收方根据数据包的编号来判断这份数据是否已经收到过。
在 TCP 首部有两个字段:序号和确认号,他们表示发送方数据第一个字节的编号,和接收方期待的下一份数据的第一个字节的编号。前面讲到 TCP 是面向字节流的,但是他并不是一个字节一个字节的发送,而是一次截取一整段。截取的长度受多种因素影响,如缓存区的大小、数据链路层限制的帧大小等等。
停止等待协议可以满足可靠传输了,但效率太低。发送方发送数据包之后就一直等待,等待的这段时间什么事也没做,浪费了资源。解决的办法是:连续发送数据包。这被称之为 连续 ARQ (Automatic Repeat reQuest)。模型如下:
连续 ARQ 带来了三个问题,第一个问题是:考虑到接收方缓冲区及读取数据的能力,所以发送方不能无限发送。如果发送太快导致接收方无法接受,就会频繁触发重传,浪费网络资源。所以发送方发送数据的范围需要考虑接收方缓冲区的情况。这就是 TCP 的流量控制。解决方法是: 滑动窗口 。模型如下:
在 TCP 首部有一个窗口大小字段,他表示接收方的剩余缓冲区大小,让发送方可以调整自己的窗口大小。通过滑动窗口,就可以实现 TCP 的流量控制,不至于发送太快,导致太多的数据丢失。
连续 ARQ 带来的第二个问题是:网络中充斥着和发送数据包一样数据量的确认回复报文,因为每一个发送数据包,都有一个确认回复。提高网络效率的办法是: 累积确认 。接收方不需要逐个回复,而是累积到一定量的数据包之后,告诉发送方,在此数据包之前的数据都收到了。例如,收到 1234,接收方只需要告诉发送方我收到 4 了,那么发送方就知道 1234 都收到了。
连续 ARQ 带来的第三个问题是:如何处理丢包。在停止等待协议中,用超时重传就解决了丢包,但连续 ARQ 中,还需要指定哪些数据包需要重传。
例如:接收方收到了 123 567 六个字节,编号为 4 的字节丢失了,按照累积确认的思路,只能发送 3 的确认回复,567 都必须丢掉,因为发送方会重传 567。这就是 GBN(go-back-n)的思路。但我们发现,这时只需要重传 4 即可,所以就有了: 选择确认 SACK(Selective Acknowledgment)。在 TCP 报文的选项字段,可以设置已经收到的报文段,每一个报文段需要两个边界来进行确定。这样发送方就可以根据这个选项字段只重传丢失的数据了。
这就是可靠传输的基本原理,总结如下:
TCP :传输控制协议。它一共分为四层。第一层:子网层,第二层:网际层,第三层:传输层,第四层:应用层。这些足以保证数据传输的安全、可靠性。
如今大家每天浏览网页里的购物网站,使用各种网页工具生活和学习,都使用了网页架构依赖的基础——TCP协议,浏览网页时经常需要输入http网址,而http协议下层协议就是TCP协议,我们在浏览http链接访问到网页时,如果网速正常的话,我们基本不会有数据丢失的感觉,这就是TCP在为我们保驾护航。
TCP在工作中既要保证数据发送的可靠性,又要保证数据发送的效率,也就是单位时间内数据吞吐量,还要减少丢包率,同时要保证低延时。
TCP在我们日常生活中的广泛应用中,它的可靠性保证了我们最核心的诉求之一——数据不会轻易丢失。那么数据在网络中传输,面对日益复杂的通信网络环境,它是怎么保证数据发送和接收顺序的呢?
实际工作中TCP是按照需要的顺序发送数据的,但是,却不能保证接收的顺序就是发送的顺序,如果接收的顺序不对,是怎样恢复到我们想要的顺序的呢,接下来我探讨一下 TCP的拆包和粘包
TCP在传输数据时,我们通常是感觉不到的,只知道把需要传输的文件和主机链接传给TCP,它就会把文件发送到我们指定的接收方,那么如果我们给他一个20MB的文件,TCP是一次就传输一个大小20MB的数据包吗,通常受各种条件限制和各种系统工作的限制,TCP会将要传输的文件拆分为适合当下操作系统等受限条件的数据包大小。
那么拆分包的意义是什么呢,当我们运送大批货物时,如果超出一辆卡车的运力,我们就需要用一辆卡车分成很多次把货物从一个仓库运到接收方的仓库,而拆包也是这个道理。数据在网络中传输时,受物理条件,比如我们常说的带宽等的限制,肯定会不断的调整拆包的大小,那么影响拆包大小,或者是否拆包的因素有哪些呢?
拆包 就是在发送方把大数据拆分成小数据,传送到接收方,再组装起来,具体怎么操作我们后续分析。
当然既然有拆包的需求,那也会有粘包的需求, 粘包 就是数据包太小,不值得单独发送一次,这时还有其他待传输数据,可以把比较小的数据,放在一起传输到接收方,到达接收方后,我们再拆分为多个数据。
当然,无论拆包还是粘包的过程中,都需要计算出一个合适大小的数据包,我们管这个数据包称为 TCP段(TCP Segment)
下面是TCP的主要组成部分
从图中可以看出TCP的主要组成
MSS(Maximum Segment Size)
MSS是option中可选项,它用来控制TCP段大小,通过协商(Negotiate)来确定的,需要双方共同决定它最终的使用大小。
MSS是实际发送和缓冲区中TCP段的大小,是双方协商得来的,不是那一方决定的。
MSS不能设为太大的值,因为大会影响服务器的内存操作效率,也会占用过多的资源,影响其他用户请求的响应实效。
同时,传输层下层的网络层使用的IP层 也会受到影响,如果TCP协议不拆包,那么IP协议就得拆包,因为IP协议受限于网络物理条件的限制,每次传输的包需要在一定限度以下,同时拆分大量的包,会对资源和计算能力提出更高的要求,造成传输效率的延迟。
当然,也不能包越小越好,拆出的包都需要安装协议头,如果包太小,那么协议头就会占据包体积的很大比重,会成为负担,浪费资源利用率, 所以,我们需要协商解决包的大小 ,只有通过协商得到的,才是最优的解决方案。