TCP为什么是个可靠的协议
一直以来,我们都被告知TCP是可靠的。但为什么是可靠的,很多人都会说“三次握手、四次挥手”。然后我们就进入一个误区:TCP可靠是因为它在建立链路时进行了“多次”地确认。然后又有人问,“多次确认就可靠了吗?”专家想了一会,说:“这只是相对的……”
回顾一下,网络书籍里面有一个很著名的问题,“红军和蓝军通信联合进攻山下的敌军的例子,第一天红军发了条信息要蓝军第二天一起进攻,蓝军收到之后,发一条确认信息,但是蓝军担心的是‘确认信息’如果也不可靠而没有成功到达红军那里,那自己不是很危险?于是红军再发一条‘对确认的确认信息’,但同样的问题还是不能解决,红军仍然不敢贸然行动。”这个问题简直就是故意在讽刺“三次握手”。
根据这个故事回到“三次握手”,客户在第三次ACK后,他想,“万一服务器没有收到怎么办呢?”这个问题只能让服务器再发一个应答来解决,然后服务器就会遇到同样的一个问题,如此不断地纠结下去……而事实上,TCP连接建立时只到客户第三次ACK就结束了,这能说是“可靠”的协议吗?
如果按照“红军蓝军问题”的思路想下去,那就没出路了。就该问题目前的条件而言,是永远没有结果的,因为信息发送方在对方不应答的前提之下,永远不能保证对方是否已经收到,不管信息发送多少次。实际打仗时,最终就只能演变成“默契”问题了,“默契”有没有办法用逻辑来解释,不管大家知不知道,反正我是不知道的。
那TCP难道是不可靠的?其实不然。理解的误区就在网络协议和行军打仗的差异上。
庆幸的是,网络协议和军队打仗是不一样的,军队打仗时如果不能确保消息的正确传递和步调同步,那是不能轻易出动的,人死不能复生啊。但是数据发送异常后可以重发,这不存在问题。另外,客户端在发送数据时,只要确保服务器已经收到数据就可以了,不需要服务器关心客户端是否收到应答。这一点也是和“红军蓝军问题”不一样的,这就不会造成死循环的问题。
具体理解一下,网络协议中,客户端和服务器在发送数据时并不要求两端要同时发送数据,甚至两端发送的数据内容也不存在必然的联系。不像两军进攻,要讲究目的相同,出发时间相同。细细分析,TCP在发送数据时,都只关心对端是否已经收到自己发送的数据,即只要收到对方对自己发送的数据确认就可以了。换句话说,每一端(客户端或者服务器)都很“自私”,只保证对方已经收到自己发送的数据就OK了。
按照上面的说法,分析一下TCP交互的过程。客户要进入ESTABLISHED,因此,客户端发送SYN告诉服务器要打开链路,收到ACK后,表示服务器已经同意了,OK,客户进入ESTABLISHED状态。只是客户建立连接不行啊,服务器还没进入ESTABLISHED状态呢,所以服务器在应答时一并发送了自己的SYN,收到客户端的ACK后,自己才进入ESTABLISHED状态,然后才可以接受客户端发过来的数据。
然后,分析一下数据传输时,数据发送方在收到应答后,表示对方收到数据了,自己就可以将刚才发送过的数据清空了。无需再告诉对方,我已经收到你的应答了,没有意义。同样的,四次挥手也同样符合上述说法。
又要回到起初的问题了,“三次握手”第三个ACK应答丢失了怎么办?现在应该很好理解,第三个ACK其实是对服务器SYN的应答,应答丢了,服务器就不得不重发SYN。又有人要问,万一重发后还是没ACK怎么呢,其实,这是没关系的,这个时候服务器等待ACK超时,自然会把套接口关掉,置为异常状态。如果后面客户端发送的数据到达,服务器也会响应RST,来告诉客户端这一异常,而不是ACK客户端过来的数据。客户端和服务器不需要像打仗那样保持同步(一同进入ESTABLISHED),只要各自能够兼容状态不同步带来的异常就可以了。
最后回到最根本的问题,TCP是否是个可靠的协议,答案是肯定的。TCP保证的是自己的行为被别人确认,而不是确认别人的应答。这里所谓的行为便是“我要SYN”、“我要发送数据”、“我要FIN”……在网络编程中,时刻存在着“主-从”关系,这两者的地位不是固定的,谁发生了行为谁就是“主”,谁接受了行为就是“从”,“主”在乎的是“从”之后的应答,而“从”在乎的是“主”实际的行为。对于正常的行为与应答,他们就可取所需,完成一次正常的交互和状态变迁;对于异常的行为,“从”不给出“主”最在乎的应答,给出相应的错误提示;对于异常的应答,“主”做出相应的反应(比如通知应用进程关闭套接字)。
TCP为什么是个可靠的协议的更多相关文章
- 【T09】要认识到TCP是一个可靠的,但不是绝对可靠的协议
1.稍微想一下就知道,TCP不是绝对可靠的协议,比如:网络断开,主机崩溃,无论TCP如何努力,都无法将数据传给对方. 2.考虑应用程序A向应用程序B发送数据的TCP流程,数据流从应用程序A通过他所在主 ...
- TCP/IP各层对应的协议
应用层: 该层包括所有和应用程序协同工作,利用基础网络交换应用程序专用的数据协议.如: HTTP:超文本传输协议. TELNET:(网络电传),通过一个终端(terminal)登录到网络(运行在TCP ...
- TCP/IP详解之IP协议
1.IP协议 IP协议是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGCP的数据都以IP数据格式传输.要注意的是,IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制 ...
- ude—基于udp的全双工可靠传输协议
ude是一款基于udp的可靠传输协议,专门用于在数据传输方面对实时性要求较高的应用领域. tcp协议虽然能保证数据的可靠传输,但它有以下几个缺点:1.tcp的数据确认机制会导致发送方重复发送一些 ...
- 常用传输层协议(tcp/ip+udp)与常用应用层协议简述(http)
一.计算机网络体系结构 二.TCP与UDP差异 1.TCP是面向连接的可靠传输,UDP是面向无连接的不可靠传输 面向连接表现在3次握手,4次挥手:可靠传输表现在未进行4次挥手时的差错重传,超时重传: ...
- 哈工大 计算机网络 实验二 可靠数据传输协议(停等协议与GBN协议)
计算机网络实验代码与文件可见github:计算机网络实验整理 实验名称 可靠数据传输协议(停等协议与GBN协议) 实验目的: 本次实验的主要目的. 理解可靠数据传输的基本原理:掌握停等协议的工作原理: ...
- 『TCP/IP详解——卷一:协议』读书笔记——03
2013-08-17 17:31:49 1.7 分用 分用(Demultiplexing):这是一个过程——当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议上的报文首 ...
- Linux内核中影响tcp三次握手的一些协议配置
在Linux的发行版本中,都存在一个/proc/目录,有的也称它为Proc文件系统.在 /proc 虚拟文件系统中存在一些可调节的内核参数.这个文件系统中的每个文件都表示一个或多个参数,它们可以通过 ...
- 在Windows8工作站上安装可靠多播协议
为什么要安装可靠多播协议? 答:随着因特网的发展,出现了视频点播.电视会议.远程学习.计算机协同工作等新业务.传统的点到点通信方式,不仅浪费大量的网络带宽,而且效率很低.一种有效利用现有带宽的技术 ...
随机推荐
- 前端项目部署之Grunt
如果你的前端项目很小或都者项目不需要通过专门的运维同学走流水线上线部署的话,那么可以略过以下的繁文. ok,Let's go! 我们看看如何使用grunt来部署上线项目? 前端项目一般分为两种类型:T ...
- INF 右安装驱动程序和卸载
INF 右键安装驱动以及卸载 之前写过一篇文章是关于INF文件具体解释的.大家能够參看INF文件具体解释,这次写的是关于INF右键安装,这样比較方便. 卸载的话也是一句话.能够大大降低安装时间: 先将 ...
- Spring + Spring MVC + Hibernate项目开发集成(注解)
在自己从事的项目中都是使用xml配置的方式来进行的,随着项目的越来越大,会发现配置文件会相当的庞大,这个不利于项目的进行和后期的维护.于是考虑使用注解的方式来进行项目的开发,前些日子就抽空学习了一下. ...
- 速度 Github
首先需要了解.git 是版本号的管理工具,为了能够把任意代码托管执照:github 其中一个是. 应用 github 什么不该说的帐户. 那么,申请后,在需求 github 并建立了独特的本地机器上的 ...
- CQRS(命令查询职责分离)和 EDA(事件驱动架构)
转载CQRS(命令查询职责分离)和 EDA(事件驱动架构) 上一篇:<IDDD 实现领域驱动设计-SOA.REST 和六边形架构> 阅读目录: CQRS-命令查询职责分离 EDA-事件驱动 ...
- vim跳转
w 跳到下一个单词的开始 e 跳到单词的结束 b 向后跳 gg 跳到文件的开始 G 跳到文件的结束 10gg 或10G 跳到第10行 ta 跳到下一个a 前面 fa 跳到下一个a 大写的意思相反 另外 ...
- MVC验证08-jQuery异步验证
原文:MVC验证08-jQuery异步验证 本文主要体验通过jQuery异步验证. 在很多的教材和案例中,MVC验证都是通过提交表单进行的.通过提交表单,可以很容易获得验证出错信息.因为,无论是客户端 ...
- 小结php中几种网页跳转
1.使用网页中<a href=.....></a>实现跳转: 2.<form action="php_request2.php" method=&qu ...
- Linux 查看和删除进程
1. 在 LINUX 命令平台输入 1-2 个字符后按 Tab 键会自动补全后面的部分(前提是要有这个东西,例如在装了 tomcat 的前提下, 输入 tomcat 的 to 按 tab).2. ps ...
- 国内首篇介绍JanOS物联网操作系统的文章 - 如何把你的手机主板打造成物联网平台
天地会珠海分舵注:如无意外,您现在正在看的将是国内首篇且是唯一一篇介绍炙手可热的物联网的操作系统JanOS的文章!不信你去百度!希望大家能喜欢.但本文只是引言,更多信息请还是访问JanOS的官网:ht ...