• 84、TCP 协议如何保证可靠传输?


    第一种回答

    1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就会重传。

    2.数据校验:TCP报文头有校验和,用于校验报文是否损坏。

    3.数据合理分片和排序:tcp会按最大传输单元(MTU)合理分片,接收方会缓存未按序到达的数据,重新 排序后交给应用层。而UDP:IP数据报大于1500字节,大于MTU。这个时候发送方的IP层就需要分 片,把数据报分成若干片,是的每一片都小于MTU。而接收方IP层则需要进行数据报的重组。由于 UDP的特性,某一片数据丢失时,接收方便无法重组数据报,导致丢弃整个UDP数据报。

    4.流量控制:当接收方来不及处理发送方的数据,能通过滑动窗口,提示发送方降低发送的速率,防止 包丢失。

    5.拥塞控制:当网络拥塞时,通过拥塞窗口,减少数据的发送,防止包丢失。

    第二种回答

    1.建立连接(标志位):通信前确认通信实体存在。

    2.序号机制(序号、确认号):确保了数据是按序、完整到达。

    3.数据校验(校验和):CRC校验全部数据。

    4.超时重传(定时器):保证因链路故障未能到达数据能够被多次重发。

    5.窗口机制(窗口):提供流量控制,避免过量发送。

    6.拥塞控制:同上。

    第三种回答

    首部校验

    这个校验机制能够确保数据传输不会出错吗? 答案是不能。

    原因

    TCP协议中规定,TCP的首部字段中有一个字段是校验和,发送方将伪首部、TCP首部、TCP数据使用 累加和校验的方式计算出一个数字,然后存放在首部的校验和字段里,接收者收到TCP包后重复这个过 程,然后将计算出的校验和和接收到的首部中的校验和比较,如果不一致则说明数据在传输过程中出错。

    这就是TCP的数据校验机制。 但是这个机制能够保证检查出一切错误吗?显然不能。

    因为这种校验方式是累加和,也就是将一系列的数字(TCP协议规定的是数据中的每16个比特位数据作 为一个数字)求和后取末位。 但是小学生都知道A+B=B+A,假如在传输的过程中有前后两个16比特位 的数据前后颠倒了(至于为什么这么巧合?我不知道,也许路由器有bug?也许是宇宙中的高能粒子击 中了电缆?反正这个事情的概率不为零,就有可能会发生),那么校验和的计算结果和颠倒之前是一样 的,那么接收端肯定无法检查出这是错误的数据。

    解决方案

    传输之前先使用MD5加密数据获得摘要,跟数据一起发送到服务端,服务端接收之后对数据也进行MD5 加密,如果加密结果和摘要一致,则认为没有问题

  • 相关阅读:
    2012 金华 现场赛
    依据错误原理解决Hibernate执行出现No CurrentSessionContext configured!错误
    【python】a[::-1]翻转
    【算法】各种哈希算法
    【wireshark】打开后显示There are no interfaces on which a capture can be done
    【python】在python中调用mysql
    【mysql】执行mysql脚本
    【mysql】用navicat连接虚拟机mysql出现错误代码(10038)
    【python-mysql】在ubuntu下安装python-mysql环境
    【python】lamda表达式,map
  • 原文地址:https://www.cnblogs.com/crbhf/p/15124471.html
Copyright © 2020-2023  润新知