一文读懂TCP的可靠传输原理
TCP下面的IP层是尽最大努力的交付,是不可靠的,所以TCP需要靠自己去完成可靠传输。下面,我们先从简单的停止等待协议来讲解可靠传输的如何实现的。需要注意可靠传输的几个特点:不丢失、不重复、按序到达。
注意,TCP并不使用停止等待协议来实现可靠传输。
停止等待协议
传输层的数据传输单元称为段。下面,为了方便,都称为分组。
停止等待协议的原理非常简单,发送一个分组后就停止继续发送,等待收到上一个分组的确认后,再继续发送后面的分组。
下面通过几个不同情况来分析:
无差错情况
无差错情况非常简单,如下图。每发送完一个分组后,就停止发送,等待收到该分组的确认后,再继续发送后面的分组。
出现差错
出现差错分两种情况,第一种是发送的分组没有交付成功到目的地址,另一种情况是传送的数据包有差错。通过图例,我们来分析两种情况
首先来看看B的操作:A发送M1分组,该分组如果是错误的,B收到后会丢弃该数分组,然后什么也不做(不会通知A收到了错误分组)。如果B没有收到M1分组,那么它什么也不知道,也不会去做任何动作。
接下来看A是如何做的:A发完分组后,迟迟收不到B对M1分组的确认后,当等待的时间超时了,那么就需要重新发送该M1分组。要实现超时重传,就需要设置一个超时计时器,当发送的一个分组在超时时间前收到了确认,那么就重置超时计时器,否则的话就需要重传分组。
有几点是需要注意的:
A在发送完一个分组后,必须还要保存该分组的副本,以便超时重传。当收到这个分组的确认后,就可以丢弃该分组的副本了。
需要给每一个分组做编号,这样才知道是各个分组的到达情况。
超时时间应该设置的比平均传输时间稍长一些,以免引起不必要的重传。
确认丢失和确认迟到
除了分组在传送过程中会出现差错,在返回确认的时候,也会出现差错——确认丢失和确认迟到。
首先看确认丢失情况,A的分组B收到了,并给A发送了确认,但该确认丢失了,A没有收到。因为A没有收到M1的确认,那么等待超过超时后,就会向B重传M1。这个时候B收到了重复的分组M1,需要做两个操作:
将重复的分组M1丢弃
向A发送M1的确认。因为既然A重传了M1,就表示A没有收到M1的分组。所以B需要继续发送对M1的确认。
再来看另一种情况,对M1的分组确认迟到了(超过超时时间后才收到)。A在收到重复的确认后,会丢弃,其他什么也不做。
通过上述的超时重传机制,就可以实现在不可靠的网络传输上实现可靠的传输。
信道利用率
上述的停止等待协议简单,但它有一个非常大的缺点——信道的利用率太低。在等待收到确认的这段时间,信道是完全空闲的,十分浪费。
为了提高信道利用率,可以使用流水线传输,流水线传输可以连续发送多个分组,这样就可以大大提高信道利用率了。
采用流水线传输的协议有连续ARQ协议和窗口滑动协议。而TCP就是采用滑动窗口协议来完成可靠传输的。
以上是一文读懂TCP的可靠传输原理的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

win10如何重置tcp/ip协议?其实方法很简单的,用户们可以直接的进入到命令提示符,然后按下ctrl+shift+enter的组合键来进行操作就可以了或者是直接的执行重置命令来进行设置,下面就让本站来为用户们来仔细的介绍一下windows10重置tcp/ip协议栈的方法吧。windows10重置tcp/ip协议栈的方法一、管理员权限1、我们使用快捷键win+R直接打开运行窗口,然后输入cmd并按住ctrl+shift+enter的组合键。2、或者我们可以直接在开始菜单中搜索命令提示符,右键点

TCP是计算机网络通信协议的一种,是一种面向连接的传输协议。在Java应用开发中,TCP通信被广泛应用于各种场景,比如客户端和服务器之间的数据传输、音视频实时传输等等。Netty4是一个高性能、高可扩展性、高性能的网络编程框架,能够优化服务器和客户端之间的数据交换过程,使其更加高效可靠。使用Netty4进行TCP通信的具体实现步骤如下:引入

TCP客户端一个使用TCP协议实现可连续对话的客户端示例代码:importsocket#客户端配置HOST='localhost'PORT=12345#创建TCP套接字并连接服务器client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)client_socket.connect((HOST,PORT))whileTrue:#获取用户输入message=input("请输入要发送的消息:&

那这里面提到的"面向连接",意味着需要 建立连接,使用连接,释放连接。建立连接是指我们熟知的TCP三次握手。而使用连接,则是通过一发送、一确认的形式,进行数据传输。还有就是释放连接,也就是我们常见的TCP四次挥手。

在TCP通信双方中,为了描述方便,以下将通信双方用A和B代替。根据TCP协议规定,如果A关闭连接后B继续发送数据,B会收到A的RST响应。若B继续发送数据,系统会发出SIGPIPE信号告知连接已断开,停止发送。系统对SIGPIPE信号的默认处理行为是让B进程退出。操作系统对SIGPIPE信号的这种默认处理行为非常不友好,让我们来分析一下。TCP通信是全双工信道,相当于两条单工信道,连接两端各负责一条。当对端“关闭”时,虽然本意是关闭整个两条信道,但本端只是收到FIN包。根据TCP协议的规定,当一

使用一个TCP连接发送多个文件为什么会有这篇博客?最近在看一些相关方面的东西,简单的使用一下Socket进行编程是没有的问题的,但是这样只是建立了一些基本概念。对于真正的问题,还是无能为力。当我需要进行文件的传输时,我发现我好像只是发送过去了数据(二进制数据),但是关于文件的一些信息却丢失了(文件的扩展名)。而且每次我只能使用一个Socket发送一个文件,没有办法做到连续发送文件(因为我是依靠关闭流来完成发送文件的,也就是说我其实是不知道文件的长度,所以只能以一个Socket连接代表一个文件)。

TCP和IP是互联网中两个不同的协议:1、TCP是一种运输层协议,而IP是一种网络层协议;2、TCP提供了数据包的分段、排序、确认和重传等功能,而IP协议负责为数据包提供源和目标地址;3、TCP是面向连接的协议,而IP协议是无连接的;4、TCP还提供流量控制和拥塞控制。

曾经有这么一道经典面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么?相信大多数准备过的同学都能回答出来,但是如果继续问:收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢?
