TCP传输协议中如何解决丢包问题

raysync0704 2019-07-18 原文

 

TCP在不可靠的网络上实现可靠的传输,必然会有丢包。TCP是一个“流”协议,一个详细的包将会被TCP拆分为好几个包上传,也是将会把小的封裝成大的上传,这就是说TCP粘包和拆包难题。

但是许多人有不同的理解。TCP协议本身确保传输的数据不会丢失完整性。如果在传输过程中发现数据丢失或数据包丢失,最大的可能性是在发送或接收程序的过程中出现问题。

 

TCP传输协议

 

 例如,服务器向客户端发送大量数据,并且发送频率非常高,因此发送链接中很可能会出现错误(1、程序处理逻辑错误;2、多线程同步问题;3、缓冲区溢出等)如果发送失败得不到处理,那么客户端收到得数据将少于理论数据,这将导致数据丢失与数据包丢失。这种现象,其实本质上来说不是丢包,也不是丢数据,只是因为程序处理有错误,导致有些数据没有成功地被socket发送出去。

关于send函数的问题:

首先必须明确send函数做了什么。 他是将数据传递给本地TCP层,还是将数据传递给应用层,确认接收方TCP层后再返回。在后者的情况下,你说的没错,其实不然。 那是由于nagle算法不能使用了,即该算法将send函数接收的小数据汇总成大数据包发送。

即使send函数能进行数据发送,对方也不一定被接受。 TCP协议只是在传输层履行义务,send函数只是应用层起到向TCP层传递数据的作用,除此之外与TCP层没有任何关系。

常见的解决方案包括拆包、添加包头和发送组合包。如果服务器或客户端断开连接,一般会使用心跳测试。

心跳测试:每隔一段时间向服务器发送数据包。为了节省资源,通常会发送空数据包。如果发送失败表明套接字已断开,此时需要根据特定条件释放资源并重新连接。

 

TCP传输协议

 

TCP传输可以保证数据交换的可靠性,这意味着一台主机将数据正确地传输到目标计算机,目标计算机的协议栈有一定的限制,如果不及时处理在目标计算机上接收到的数据,堆栈就会溢出。

这种溢出不是由TCP协议本身引起的,而是由系统的IP协议栈的缓冲区溢出引起的!

发表于 2019-07-18 15:13 Raysync镭速 阅读() 评论() 编辑 收藏

 

版权声明:本文为raysync0704原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/raysync0704/p/11207519.html

TCP传输协议中如何解决丢包问题的更多相关文章

  1. TCP传输协议如何进行拥塞控制?

    TCP传输协议如何进行拥塞控制? 拥塞控制 拥塞现象是指到达通信子网中某一部分的分组数量过多,使得该部分网络来 […]...

  2. 分享:HTTP协议、TCP协议、IP协议和TCP/IP协议区别

    TCP/IP协议TCP/IP协议在上一篇文章中网络协议详解我已经很详细的讲解了.所以在这一篇中,我简单说一下如 […]...

  3. TCP协议 – ZPong

    TCP协议 TCP协议全称: 传输控制协议(Transmission Control Protocol ), […]...

  4. TCP协议 – Loull

    TCP协议 2017-06-19 23:45  Loull  阅读(370)  评论(0)  编辑  收藏  […]...

  5. linux 下的ssh

    ssh服务 1.检查是否有被安装,命令 rpm -qa|grep "ssh" 2.检查ssh有没有在运行,命令 […]...

  6. TCP协议 状态解析和状态统计

    三次握手和四次挥手、状态解析、状态统计  一、三次握手和四次挥手 1、建立连接(三次握手)   (1)服务器会 […]...

  7. 三、TCP协议

    TCP(Transmission Control Protocol)传输控制协议:顾名思义就是对数据的传输进行 […]...

  8. TCP协议 – CodingForever

    TCP协议 转自:  http://www.cnblogs.com/kzloser/articles/2582 […]...

随机推荐

  1. 「代码家」的学习过程和学习经验分享【转】

      图灵丛书的一句话说的很好,Standing on the shoulders of giants,是的,我 […]...

  2. 淘宝目前流行的基于NodeJS的全栈式开发(基于NodeJS的前后端分离)

    前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同 […]...

  3. payPal跨境支付

    三方支付前言 一旦回调不成功支付宝不光用支付id可以查询支付状态,也可以用订单id查询 微信支付为什么要有钱包 […]...

  4. AngularJS实现进度条功能示例

    这篇文章主要介绍了AngularJS实现进度条功能,结合具体完整实例形式分析了AngularJS实现进度条功能 […]...

  5. 快速排序 java详解

    1.快速排序简介:   快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将 […]...

  6. 蓝桥杯 2014届真题 地宫取宝 动态规划解法

    蓝桥杯 2014届真题 地宫取宝 动态规划解法 题目描述 X 国王有一个地宫宝库。是 n x m 个格子的矩阵 […]...

  7. jquery easyui 推荐博客 (MVC+EF+EasyUI+Bootstrap)

    构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(52)-美 […]...

  8. 微信小程序授权方法全能,当用户拒绝或者首次进来的,都可以弹起授权提示,主要是用wx.getSetting,还有wx.authorize,最后的wx.openSetting

    我这里就用获取微信授权运动步数的接口做案例,简单通过,也试过使用微信保存图片授权上, 代码如下:  wx.ge […]...