• 略解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状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据.

  • 相关阅读:
    SQL事务
    C# 怎样读写EXCEL文件
    如何#读写EXCEL 文件 (http://space.cnblogs.com/question/7131/)
    C# 怎样读写EXCEL文件 (http://space.cnblogs.com/question/7131/)
    控制DataGirdView中單元格
    C#中ToString格式大全
    转贴:用SqlCommandBuilder 实现批量更新
    错题记录1
    Java—关于String的分析
    Java模拟双色球彩票
  • 原文地址:https://www.cnblogs.com/scy251147/p/10279165.html
Copyright © 2020-2023  润新知