tcp是如何保证可靠的数据传输的

TCP可靠数据传输
在TCP在IP不可靠的尽力而为的服务之上,创建了一条可靠数据传输服务(reliable data transfer service)。TCP提供的可靠数据传输的方法涉及到可靠数据传输原理中许多机制。
也涉及到了定时器。如果为每一个已发送但未被确认的报文段都设置一个定时器,那开销是相当巨大的。因此推荐的定时器管理过程[RFC 6298]仅适用单一的重传定时器。下面描述的TCP协议遵从了这种单一的定时器推荐。
TCP是使用超时和冗余确认技术来恢复报文段的丢失
TCP发送方有3个与发送和重传有关的事件
从上层应用程序接收数据
TCP从应用程序接收数据,将数据封装在一个报文段中(含有第一个数据字节的流编号),然后交给IP。
定时器超时
超时后,TCP重传超时报文,然后,重启定时器。
收到ACK后,将确认报文中确认号与发送方的SendBase(最早未被确认的字节序号)比较。
TCP采取累积确认,所以确认号之前的字节都被接收方收到。
当 确认号 & SendBase 时,则该ACK是在确认一个或多个先前未被确认的报文段,此时发送方更新SendBase的值
如果当前有未被确认的报文段,TCP重启定时器
TCP协议在工作过程中的几种简单情况
1.由于确认丢失而重传
如上图所示,B发送给A的ACK丢失,引起了主机A的重传,B在接收到重传数据报后根据序号得知这是重传报文,于是丢弃该报文,向A发送ACK。
2.连续发送的报文段的ACK延迟
A连续向B发送了两个报文段,但是他们的ACK都延迟了,导致定时器超时,于是最早的未被确认的报文段92被重传,接着他们的ACK到达,它们就不会被再次重传,A收到确认后,就会将SendBase后移,并重启定时器。
3.累积确认避免先前报文段重传
A还是向B连续发送了两个报文段,但是第一个报文段的ACK丢失啦。但是好的是在定时器超时之前,第二个报文段的ACK到达,因为TCP采取了累计确认,第二个报文段ACK到达,说明了第一个报文段是被正确接收了哒。所以第一个报文段不会被重传。
超时重传存在的问题之一就是超时周期可能较长。当一个报文段丢失时,通过超时重传来恢复报文,就会增加端到端的时延。Luckily,可以通过检测收到的冗余ACK来进行对丢失报文段的重传。
至于为啥可以通过这样的方式来确信此报文段丢失是因为:
①发送方接到丢失报文段后的报文(也就是失序报文段)会将失序报文段缓存,并向发送方发送最近接收的未失
序报文段的最大编号。
②如果接收方连续接收多个失序报文,那么发送方将会收到对一个报文段的多个ACK,由此发送方可知该ACK代
表的报文段的后一个报文丢失了,于是,发送方重传丢失报文。
当发送方收到3个冗余ACK,就说明被确认过三次的报文段之后的那个报文段已经丢失,TCP就执行快重传
(fast retransmit),在丢失报文段定时器超时之前重传丢失报文段。
上图是快重传的一个示例
是回退N步还是选择重传
根据前面对TCP描述,可以得知TCP确认是采用累积确认方式,并且对失序报文不会给出确。这让TCP看起来像是一个GBN协议,但是与GBN不同的是,TCP会缓存失序的分组。所以,TCP提出的一种修改意见是选择确认(slective acknowledgment)[RFC 2018],它允许TCP接收方有选择地确认失序报文段,而不是累积确认最后一个正确接收的有序报文段。当将该机制和选择重传机制结合起来使用时(即跳过重传那些已被接收方选择确认过的报文段),TCP就像我们通常的SR协议。
因此,TCP的差错恢复机制为GBN协议和SR协议的混合体。
TCP流量控制
为什么要提供流量控制服务(flow-control service)?
简单地说,提供流控就是为了避免接收方缓存溢出问题。
接收方接收到数据后,会将其放入接收缓存中,待上层应用程序读取数据。但是上层应用可能忙于其他事务或者
读取数据的速度比较慢,而发送方发送数据的太多,速率太快,此时就会导致接收方的缓存溢出。
流量控制也是一个速率匹配服务。
TCP的发送方也可能会因为IP网络拥塞而被遏制,这种形式的控制被称为拥塞控制(congestion control)。这两
种控制是针对不同原因而采取的,尽管他们都是对发送方的遏制。后面会讲他们之间的区别。
TCP如何提供流量控制服务 ?
这里为了从整体上看问题,我们假设,TCP接收方会丢弃失序的报文。
TCP让发送方A维护一个称为接收窗口(receive window)的变量来提供流量控制。这个窗口代表接收方B有多少可的缓存空间
主机A和主机B之间建立TCP连接后,主机B为连接分配了一个接收缓存,用RcvBuffer表示
定义如下变量
LastByteRead:主机B的应用进程从缓存中取出的数据流最后一个字节的编号
LastByteRevd:主机B缓存的数据流的最后一个字节编号
缓存不能溢出需满足
LastByteRevd - LastByteRead &= RevBuffer
接收窗口rwnd根据缓存可用空间设置:
rwnd = RevBuffer - [LastByteRevd-LastByteRead]
主机B通过把当前的rwnd放到它发送给主机A的报文段的接收窗口字段,已通知主机A当前它还有多少空间可用。
主机A始终跟踪两个LastByteSend和LastByteAcked,[LastByteSend-LastByteAcked]就是主机A中发送但未被确认的数据量。使这个值小于主机B的rwnd,就可以使主机B的缓存不会溢出。
因此,主机A需要在连接的整个生命周期满足:
LastByteSend-LastByteAcked &= rwnd
如何防止死锁?
死锁问题出现
主机B的接收缓存满了,rwnd=0。主机A知道了就会暂停数据发送,等待主机B的接收缓存有空闲。如果此时主机B没有数据发送给A那么A将不可能知道主机B会有缓存空闲,这会导致A被阻塞(主机B仅当他有数据发送或者有确认时才会发送报文段给A) !
解决死锁问题
当发送方A收到接收方B的窗口为0的通知,便启动一个一个持续计数器,每隔一段时间向B发送只有一个字节数据的零窗口探测报文段。这些报文段将被接收方确认。最终缓存将开始清空,并且确认报文里包含一个非0的rwnd值。
此文为《计算机网络 自顶向下方法》的学习笔记5,文中图来自本书。
阅读(...) 评论()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
&最新文章&
Copyright &
ChinaUnix.net All Rights Reserved
感谢所有关心和支持过ChinaUnix的朋友们&>&TCP/IP可靠数据传输代码实现
TCP/IP可靠数据传输代码实现
上传大小:10KB
TCP/IP课件以及习题介绍,java源程序.
综合评分:4
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有8条
里面有两段代码还不错,但是我确实没搞懂如何使用服务器端及客户端软件,才能达到数据的传输。
网络通信学习中
希望看完有效果
对学习网络还是有帮助的
综合评分:
积分/C币:6
综合评分:
积分/C币:2
wmhappy888
综合评分:
积分/C币:5
VIP会员动态
热门资源标签
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
TCP/IP可靠数据传输代码实现
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
xiaoyinghui
举报的资源分:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*详细原因:
TCP/IP可靠数据传输代码实现0 关注 &o&
1 赞同 &o&
Feel easy about trust.
Powered by
3.0.0 o 84msLinux C/C++ Lua 服务器开发
TCP协议如何保证可靠传输
1、应用数据被分割成TCP认为最适合发送的数据块。
2、超时重传:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
3、TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
4、校验和:TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。
5、TCP的接收端会丢弃重复的数据。
6、流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的我数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP使用的流量控制协议是可变大小的滑动窗口协议。
7、拥塞控制:当网络拥塞时,减少数据的发送。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 udp实现可靠数据传输 的文章

 

随机推荐