zoukankan      html  css  js  c++  java
  • TCP是如何保证包的顺序传输

    转自:http://blog.csdn.net/ggxxkkll/article/details/7894112


     大家都知道,TCP提供了最可靠的数据传输,它给发送的每个数据包做顺序化(这看起来非常烦琐),然而,如果TCP没有这样烦琐的操作,那么,可能会造成更多的麻烦。

    如造成数据包的重传、顺序的颠倒甚至造成数据包的丢失。

     

    那么,TCP具体是通过怎样的方式来保证数据的顺序化传输呢?

     

    1. 主机每次发送数据时,TCP就给每个数据包分配一个序列号并且在一个特定的时间内等待接收主机对分配的这个序列号进行确认,

    2. 如果发送主机在一个特定时间内没有收到接收主机的确认,则发送主机会重传此数据包。

    3. 接收主机利用序列号对接收的数据进行确认,以便检测对方发送的数据是否有丢失或者乱序等,

    4. 接收主机一旦收到已经顺序化的数据,它就将这些数据按正确的顺序重组成数据流并传递到高层进行处理。


    具体步骤如下:

     

    (1)为了保证数据包的可靠传递,发送方必须把已发送的数据包保留在缓冲区; 
    
    (2)并为每个已发送的数据包启动一个超时定时器; 
    
    (3)如在定时器超时之前收到了对方发来的应答信息(可能是对本包的应答,也可以是对本包后续包的应答),则释放该数据包占用的缓冲区; 
    
    (4)否则,重传该数据包,直到收到应答或重传次数超过规定的最大次数为止。
    
    (5)接收方收到数据包后,先进行CRC校验,如果正确则把数据交给上层协议,然后给发送方发送一个累计应答包,表明该数据已收到,如果接收方正好也有数据要发给发送方,应答包也可方在数据包中捎带过去。
    
  • 相关阅读:
    Python面向对象:继承和多态
    Python面向对象:类、实例与访问限制
    Python正则表达式匹配猫眼电影HTML信息
    Git:从github上克隆、修改和更新项目
    Python:闭包
    JPA-映射-(@ManyToMany)双向多对多
    rownum详解
    java之yield(),sleep(),wait()区别详解
    springmvc<一>一种资源返回多种形式【ContentNegotiatingViewResolver】
    @RequestParam,@PathVariable,@ResponseBody,@RequestBody,@ModelAttribute学习
  • 原文地址:https://www.cnblogs.com/Allen-rg/p/7513344.html
Copyright © 2011-2022 走看看