TCP传输面向字节流如何处理重传呢?

1  网络协议背景概念

4层网络传输是基于udp基于端口

7层网络协议传输是基于tcp基于端口(tcp的复杂度很高很高..),并在tcp之上添加了会话层表示层应用层

upd协议面向报文,tcp协议 面上字节流。

啥是面向字节流呢?

2  TCP传输通信过程

tcp面向字节流,udp面向报文。那tcp的字节流是怎样的呢?

tcp是点到点的通信,建立tcp链接的两个端点,传输的数据不是报文,是一段数据中的一部分,并不知道一次读的数据是多少和发送次数。

数据交给tcp层,由tcp决定一次发送多少数据,判断条件有很多,发送窗口、拥塞窗口、路径上的最大传输单元(MTU),输出队列数据总量等。

如图在tcp发送数据之前,应用程序和tcp协议之间有一个tcp缓存队列,这个队列不固定字节大小,tcp要发送的数据也不固定字节大小,

tcp是去发送数据的一部分字节流,

并在这个传输中一直单向的进行。 ???????

所以在网络传输中可以看到的是数据片段,然后是一组一组的数据交付给接收方。

3  传输报错重传机制

如果发送方发送 1 2 3 4 接收方只收到 1 2 回复确认 ack 3,然后发送方发来了 4,不能回复确认ack 5,因为不能跳跃确认。

于是,采用重传机制,有2种:

3.1  超时重传

发送方不知道3 4 5 的接收情况,接收方一直在等 3,这中方式会有比较严重的问题。

发送方有两种选择:

a ,  默认 3 发送失败,重新发送3

b ,默认 3 4 5 发送失败,重传 3 4 5

a的方式,只传 3可能会慢,b的方式传 3 4 5 很快但是占用带宽,timeout也可能很长,这两个都不是最后的方法。

3.2  快速重传

tcp还有一种 快速重传 的算法,Fast-Retransmit,是以数据驱动重传,不是timeout时间驱动。

怎么是以数据驱动呢?

就是 如果只收到 1 2 ,回复ack 3 ,随后收到了 4 5 但是还没收到 3, 4 5的ack也回复 3 3,这样发送方会收到3个一样的ack,会知道传输出了问题

这就是大部分tcp数据驱动重传机制(什么?大部分tcp,总共是有几个版本的..)。

这种方式还不是最好的,只是解决了timeout的问题,回传的个数还是没解决,比如一次发了20条,就不知道是哪3个发的ack了,需要回传这20条。。

3.3  sack 重传

选择性重传,Selective Acknowledgement(sack),tcp的头会多一个SACK,快速重传的ACK还在。

sack只回复已经到达的碎片,这样发送端就能准确知道是重传那部分字节流。在Linux可以用tcp_sack这个字段开启这个功能,2.4版之后的Linux默认开启。

参考:https://tools.ietf.org/html/rfc2018  https://www.jianshu.com/p/69695f332a71

遗留问题

tcp重传还有一些问题,sack也不能完全相信:

如果有接收端会将数据保存直到失败的分组重传,就会有接受方内存拥挤把收到的数据丢弃了,可能有。

原文地址:https://www.cnblogs.com/the-last/p/11524964.html

时间: 2024-08-06 04:14:00

TCP传输面向字节流如何处理重传呢?的相关文章

[网络编程] TCP、UDP区别以及TCP传输原理、拥塞避免、连接建立、连接释放总结

TCP.UDP都是属于运输层的协议,提供端到端的进程之间的逻辑通信,而IP协议(网络层)是提供主机间的逻辑通信,应用层规定应用进程在通信时所遵循的协议.一.UDP主要特点:传输的是用户数据报协议.1.UDP是无连接的,即发送数据之前不需要建立连接.2.UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制.3.UDP是面向报文的.UDP没有拥塞控制,很适合多媒体通信的要求.4.UDP支持一对一.一对多.多对一和多对多的交互通信.5.UDP的首部开销小,只有 8个字节.发送方 UDP对

TCP、UDP区别以及TCP传输原理、拥塞避免、连接建立、连接释放总结

TCP.UDP都是属于运输层的协议,提供端到端的进程之间的逻辑通信,而IP协议(网络层)是提供主机间的逻辑通信,应用层规定应用进程在通信时所遵循的协议. 一.UDP主要特点:传输的是用户数据报协议. 1.UDP 是无连接的,即发送数据之前不需要建立连接. 2.UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制. 3.UDP 是面向报文的.UDP 没有拥塞控制,很适合多媒体通信的要求. 4.UDP 支持一对一.一对多.多对一和多对多的交互通信. 5.UDP 的首部开销小,只有 8

TCP面向字节流和UDP面向报文的区别

TCP面向字节流 打个比方比喻TCP,你家里有个蓄水池,你可以里面倒水,蓄水池上有个龙头,你可以通过龙头将水池里的水放出来,然后用各种各样的容器装(杯子.矿泉水瓶.锅碗瓢盆)接水. 上面的例子中,往水池里倒几次水和接几次水是没有必然联系的,也就是说你可以只倒一次水,然后分10次接完.另外,水池里的水接多少就会少多少:往里面倒多少水,就会增加多少水,但是不能超过水池的容量,多出的水会溢出. 结合TCP的概念,水池就好比接收缓存,倒水就相当于发送数据,接水就相当于读取数据.好比你通过TCP连接给另一

TCP传输工作原理

引言 在TCP/IP体系结构中,IP协议只管将数据包尽力传送到目的主机,无论数据传输正确与否,它都不做验证,不发确认,也不保证数据包的顺序,因而不具有可靠性.这一问题要由传输层TCP协议来解决,TCP协议为Internet提供了可靠的无差错的通信服务. 一.OSI参考模型和TCP/IP参考模型 OSI模型(open system interconnection reference model)是基于国际标准化组织(ISO)的建议而发展起来的,它分为如图1所示的七层. TCP/IP最初是为ARPA

TCP/IP协议详解 卷一:协议 17章、TCP传输控制协议

1.TCP服务 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务.TCP提供一种面向连接的.可靠的字节流服务. (1)面向连接 两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接.过程与打电话相似,先拨号振铃,等待对方摘机说"喂",然后才说明是谁. 说明:在一个TCP连接中,仅有两方彼此进行通信.广播和多播不能用于TCP. (2)可靠性 TCP通过下列方式来提供可靠性: 1)应用数据被分割成TCP认为最适

TCP传输协议

1.TCP中一些名词解释 (1)MSS(maximum segment size) TCP的最大报文段大小,在TCP报文段中有一个16位的部分用于放置该值,因此最大为65535,可以利用setsockopt() 和getsockopt设置和获取TCP_MAXSEG来影响MSS: (2)MSL(maximum segment lifetime) IP报文段能在网络中存在的最长时间,这个是系统级的参数,没有接口修改,windows上可以通过注册表修改,通常为2分钟,最低为30秒,linux上面没法修

在qt中用tcp传输xml消息

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:Qt5 3.1.2 说明: 在tcp上传输xml消息. 协议格式如下: 2字节标识(0xc55c,网络序)+2字节预留 +4字节报文内容长度(网络序) + 4字节命令字(网络序)+报文内容 部分协议: 命令字:请求值班信息:GET_DUTY_INFO请求报文: <?xml version="1.0" encoding="UTF-8"

第十七章 TCP传输控制协议

TCP的服务 TCP通过下列方式来提供可靠性: ? 应用数据被分割成 TCP认为最适合发送的数据块.这和 UDP完全不同,应用程序产生的数据报长度将保持不变.由 TCP传递给 IP的信息单位称为报文段或段( segment). ? 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段.如果不能 及时收到一个确认,将重发这个报文段. ? 当TCP收到发自 TCP连接另一端的数据,它将发送一个确认.这个确认不是立即发送,通常将推迟几分之一秒. ? TCP将保持它首部和数据的检验和.这

TCP传输协议使用

TCP传输协议,也称之为套接字连接,比较安全,三次握手!,必须确保对方计算机存在,才能连接,而且是长时间连接. 缺点是传输速度有点慢. 你用 socket 去连接 ServiceSocaket 服务器端,ServiceSocaket 会创建一个,Sockets 然后你的Socket ,连接服务器端创建的Socket 最后你的Socket 和 服务器端的 Socket 都会创建一个 OutputStrea 和InputStream 流用来传输数据. 如下图: ServerSocket : 服务端,