zoukankan      html  css  js  c++  java
  • 略解TCP乱序和丢包

    在使用基于TCP实现的各种组件的时候,我们经常会处理数据包。这数据包说来奇怪,从来不会丢失,也不会乱序,只会产生粘包。底层的机制是如何实现的呢?进来我们就来用简洁易懂的文字描述清楚。

    在TCP数据包设计思想中,有两个比较重要的概念:

        Sequence Number: 顺序号,意即数据包的序号,主要用来解决数据包乱序问题。

        Acknowledgement Number:确认号,意即数据包用来进行双端消息确认的号码,主要用来解决网络传输过程中,数据丢包的问题。

    Sequence Number的工作原理如下:

    TCP传输数据时,A主机第一次传输1440个字节,seq=1,那么第二次时seq = 1441,B拼接数据就是根据seq进行拼接的,seq数字不断累加避免了乱序.B主机收到第一次数据包以后会返回ack = 1441. A主机收到B的ack = 1441时,就知道第一个数据包B已收到. 如果B没有收到第一次的数据包,那么B再收到A的数据包时,他就会发ack = 1回去,A收到B的回复,发现B没有收到第一次数据包,就会重发第一次数据包,这样就可以防止丢包.

    利用这两个号,就很好的保证了消息的顺序性,同时数据呈送给用户的时候,也不会出现部分遗失的情况。

    再来用简略的语言描述一下TCP连接建立的过程:

    以下为tcp标志位,有6种标示:

          SYN(synchronous建立联机) 

          ACK(acknowledgement 确认) 

          PSH(push传送) 

          FIN(finish结束) 

          RST(reset重置) 

          URG(urgent紧急)

    第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;     

    第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;   

    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据.

  • 相关阅读:
    topcoder srm 445 div1
    topcoder srm 440 div1
    topcoder srm 435 div1
    topcoder srm 430 div1
    topcoder srm 400 div1
    topcoder srm 380 div1
    topcoder srm 370 div1
    topcoder srm 425 div1
    WKWebView强大的新特性
    Runtime那些事
  • 原文地址:https://www.cnblogs.com/scy251147/p/10279165.html
Copyright © 2011-2022 走看看