TCP协议心得--php最美

作为宇宙最好语言的程序员,怎么能不懂点网络协议的知识,不然怎么配得上PHP程序员这么牛逼的身混?

TCP是基于网络通讯模型中的传输层的协议,这个网络模型OSI有的分作5层,有的分作7层,对于我们来讲平时的开发工作中最多只会关注到传输层和应用层,而传输层中的tcp协议则是我们用到的最多的(http,smtp,ftp,pop等都是基于此协议)

当然传输层协议远不止TCP一种,而TCP是其中一种可靠,相对稳定的(主要是我们用的最多的)传输协议,他有着面向连接,重传,滑动窗口等特性

1.建立连接

经典的三次握手,平时很多时候都会听到这个词语,但是我经常听到很多人说什么http三次握手之类的解释,也不能说它错误,但严格来讲这个说法不是特别准确,因为三次握手是TCP建立连接的特性,http这些只是建立在TCP之上的应用层协议,它本身没有什么三次握手之类的特性,闲着没事 我们也可以把http应用到UDP协议之上.

我们以A和B两个进程来讲 要建立起一个tcp连接 首先A会对B传输一个建立连接的数据包,B收到数据包之后会回复相应数据包确认,A收到B的确认数据包之后会再次发送一个确认数据包给B,这就是建立连接所谓的三次握手.

意义

1.A对B的数据发送,B可以确认到A的发送能力和B的接收能力没有问题

2.B对A的数据发送,A可以确认到A的发送,接受能力和B的发送,接受能力没有问题

3.A对B的数据发送,B可以确认A的发送能力和B的发送能力没有问题(这次握手是为了确认没有问题,这是说TCP可靠的原因之一)

所以说TCP是面向连接的协议(以后谁再跟你说http三次握手 你就可以跟他挥手了!)

2.数据传输

建立连接之后,我们就可以传输自己的数据了,但是我们这里还需要明白一点,我们的网络信号经常会有波动,数据在传输过程中出现丢失是非常常见的事情,但是我们都说TCP是可靠的!那么TCP是如何实现的呢

一般而言呢,我们肯定会把所有目标数据都传输出去对不对,可惜TCP不是这样处理的,而是将数据进行分组之后进行传输,也就是所谓的分段传输,这样做的理由也很好理解,类比生活中的运输,大件物品肯定也是分开运输,本来网络传输就不可靠,如果传输全部,那么一丢就是全部数据,那我们可受不了,所以我们会将数据进行分组分别传输.

那么继续以A间B传输为例,假设其中某个数据分作三部分,每一次传输过后,接受方B都会给A反馈接受结果,A收到接受结果之后则继续发送下部分数据,如下图所示:

流程1:

1.A向B发送第一部分数据

2.B接受到A的数据,并向A发送确认收到的反馈数据

3.A接收到B的反馈数据,继续发送第二部分数据

流程2:

1.A向B发送第二部分数据

2.B接收到A的数据,但是数据有问题无法处理,B向A发送失败的反馈数据

3.A收到B的反馈数据,重新发送第二部分的数据

以上流程为一个简单的分段传输过程,这种方式有一个问题就是B无法区分A发过来的数据到底是重发的数据还是新发送的数据,所以我们在给数据分组的时候还需要给每组数据加上特定的编号,例如a,b,c 这样我们基本的一个流程就有了,我们可以在这之上继续深入优化

问题1:

假如A迟迟收不到B的反馈数据怎么办(B的反馈数据在传输过程中丢失)

这种情况,我们就需要在发送方添加一个超时的机制(好像是废话,大家都懂),在传输a部分数据的同时启动一个定时器,超过时间没有接收到反馈,那么就重新发送a部分数据,并且重置定时器,流程如下图

问题2:

每一组数据都要等待反馈之后才发送数据,这样在数据处理中容易造成进程阻塞,等待处理结果太慢了

很简单嘛,我们别发一次等一次,每次多发几次就完了呀(我是不是很机制,毕竟PHP程序员),我们可以设定一个值为4,那么我们就每次发送4组数据,然后在有结果返回之前就先抽口烟等着,如果有其中有任何一组数据确认收到,那么我们就接着发送一个,记住保证没有收到结果的数据组保持为4个.

这个数字4就是传说中的窗口,每次发送的数据数不能超过这个窗口,只有确认结果之后才能往下继续,也就是滑动窗口,我们也叫做窗口滑动协议

问题3:

使用窗口滑动的过程中,如果其中某一个数据包丢失了我们该怎么办?

这个问题一般的人比如我,处理方式肯定就是全部cao翻重发呗(俗称回退N步协议,想不到还有这么屌炸天的名字吧), 如下图所示

可惜TCP的大神们觉得这么干,遇到网络不稳定这些情况,你完全是给人家雪中送屎,让别人本来就难受的传输过程更难受,所以他们想到的是 接收方收到的分组会先缓存起来,并且发送确认数据给发送方,这样就不用每次重发了(选择性重发),如下图

总结:

TCP本质上就是要在不稳定,不可靠的网络传输中非要整成可靠传输的这么一个解决方法,这么看上去的确是可靠了,但是他背后的原理和方法一定要记住,不然以后面试又要说http三次握手了 

推荐<TCP/IP详解 卷1:协议>这本书,虽然枯燥但是大体浏览一遍还是能学到很多东西

猜你喜欢

转载自www.cnblogs.com/mrzsj/p/9280467.html