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

  • 相关阅读:
    vim高亮
    mengning
    4.4内核osal
    tmpvalgrind
    为什么引入协程
    alloc_call_show(转)
    TSAN
    如何查看哪些进程占用Buffer和Cache高(转)
    ASAN详解其他参考链接
    Linux系统与程序监控工具atop教程(转)
  • 原文地址:https://www.cnblogs.com/scy251147/p/10279165.html
Copyright © 2020-2023  润新知