从本质上了解TCP/IP协议族

作者: JingChen_ | 来源:发表于2021-01-12 15:41 被阅读0次

    为什么要分层

    没有分层的情况下是直接从一端把消息传输至另一端,网络传输无非是从客户端传信息到服务端,或者服务端传信息到客户端,那么在传输过程中是存在网络不稳定的情况,数据丢失了怎么办?其实是这样的,客户端发送消息给服务端,正常情况下服务端会在收到消息后回馈信息给客户端,客户端才知道收到了。假如数据丢失了,客户端假如在一定时间内没收到回馈,那么就重新传输信息。

    再来看一点,假如我们的数据很大,经过每个中间节点的时间增加了,到最后一个节点的时候数据丢失了,那岂不是要重新传输了,假如频繁发生,用户体验到的感觉就是网络很不稳定。怎么解决呢?把数据分块传输呗。

    例如:现在数据一大块,把它分成ABCDE...,每次传输顺序是A、B、C...,假如传到C的时候传输失败了,但AB都传输成功了,那就继续传输C,成功后就接着往下一块块传输。

    怎么分层

    把数据分块就要分层了?接着往下看

    像HTTP这样的就是做网络报文的传输,FTP是做文件的传输,DNS是用来做域名服务的,这都是具体的目标,也就是你有要做的事情,这些要做的事情,就可以用应用层来表示了。

    那么这些应用层的做的事情要分块传输,而且不单单是HTTP,像DNS和FTP同样也要分块传输。想一下,在Java思想看来,多个类都要做同一种事,是不是要把这件事抽出来做接口。

    那么就把分块传输当成一个层来看,这一层是拿到应用层的数据后再把它分块传输,传输完到达另一端后再把数据拼接成完成信息后再丢给应用层,这样把数据把应用层数据分块再合并完传给应用层的这一层作为传输层。像TCP和UDP协议都是处于传输层。

    说到TCP和UDP,两个的传输差别就是TCP一定要保证数据的正确性,简单点来说就是数据从一端到另一端一定是要完整的,而UDP传输过程可能会丢包,导致数据不完整,例如我们看直播的时候,网络突然不好了,直播卡住了,过了一会网络正常了,但现在是直播,所以不会关注那些事情,继续传输当前的数据。

    那么区别都知道了,相同点是什么?不就是传数据嘛,那是不是抽一层出来,把这些传输层的分块数据通过网络传输到另一端。这就是网络层。网络层只负责对这些数据块进行传输,拿到了就传,没有就不传。而且网络层对数据传成功没不关心,拿到数据就传,至于数据成不成功,取决于传输层是否要再对数据进行传输。IP协议就处于网络层。

    对于网络层里面的传输还需要靠物理设备来实现。我们现实生活中在物理设备上对网络层的支持一般是以太网,需要通过以太网(或者WIFI)才能实现真正意义上的网络传输。所有又有了一层,数据链路层

    以上是对网络模型的本质理解。

    TCP连接

    在传输的时候要事先确定好对方是谁,所以要建立TCP链接,并且这些连接是有状态的(HTTP是无状态的)。这种有状态体现在传输的时候知道对方是对,保持着这种状态进行传数据。

    建立TCP连接需要三次握手,什么是三次握手?举个例子,假如A要和B链接:

    1、A发消息跟B说:我要跟你进行链接
    2、B收到A的消息后,要告知A收到了消息,并回复了:我收到你的消息了
    3、A也要告诉B收到了B的消息:我也收到了你的消息,可以开始正常交流了

    其中,1是可以理解的,2是因为B得让A知道A->B是正常的并且B也要发消息,而3是因为A告诉B收到了消息,可以正常通信了。

    既然有连接就有关闭,为什么要关闭?因为连接时把对方信息保存在自己的本地,关闭是为了释放资源。关闭比连接多了一次。

    TCP连接的关闭也叫四次挥手,举个例子,假如A要和B断开连接:

    1、A跟B发消息说:我要跟你断开连接
    2、B收到后对A说:我知道你没有消息了
    3、B又发了个消息说:我也没有消息了
    4、A收到后对B说:我知道你没有消息了,可以断开了

    之后,TCP就断开了连接。注意,B收到A的消息后只是说告诉A知道A没有消息了,不代表B也没有消息。

    在网络中,移动网络并不属于Internet,而在运营商的内网,并不具备真正的公网IP。所以移动网络和外界是通过:移动网络到运营商,然后再从运营商再到外界交流,这就是所谓的长连接。

    那为什么要长连接呢?我们知道TCP连接的关闭是我们主动关闭的,而在长连接中,当某个TCP连接在一段时间不通信之后,网关会处于网络性能考虑而关闭这条TCP连接和公网的连接通道,导致这个TCP端口不再能收到外界通信消息,这就是TCP连接被动断开。

    关于TCP断开中第二次和第三次为什么不合并

    在第二次B得到A没有消息发后,为什么不等到B没有没有消息发了再一次告诉A,B也没有消息了?

    其实真正的事实是:TCP是支持第二次和第三次进行合并的,即把这两条消息合进一条里发送,本质上,TCP的四次挥手只是因为在通信时候出现一方讲完了,另一方还没讲完的情况,所以TCP要给两方都有一个表达自己讲完了的机会,所以本质上TCP的四次挥手其实是一对两次挥手。总结下,这两条消息不是不能合并,而是能不合并,因为会有大量拆开使用的场景,至于合并这个方案,TCP是支持的。

    相关文章

      网友评论

        本文标题:从本质上了解TCP/IP协议族

        本文链接:https://www.haomeiwen.com/subject/wmmsaktx.html