TCP建立连接为什么是三次握手,为什么不是两次或四次?
什么是三次握手
学过网络编程的人,应该都知道TCP建立连接的三次握手,下面简单描述一下这个过程。 
如图所示
第一次握手:客户端发送TCP包,置SYN标志位为1,将初始序号X,保存在包头的序列号(Seq)里。
第二次握手:服务端回应确认包,置SYN标志位为1,置ACK为X+1,将初始序列号Y,保存在包头的序列号里。
第三次握手:客户端对服务端的确认包进行确认,置SYN标志位为0,置ACK为Y+1,置序列号为Z。
为什么不是两次
我们先来将三次握手这个过程捋一遍。(S-服务端,C-客户端)
第一次握手后,S可以确认自己收报文与C发报文的功能都正常,而C呢,它什么都不能确认。
第二次握手后,C可以确认自己的收发报文与S的收发报文功能都正常,也就是认为连接已建立。
那么第三次呢,S也可以确认双方能够正常通信。
假想一下,如果我们去掉了第三次呢? 
因为我们不进行第三次握手,所以在S对C的请求进行回应(第二次握手)后,就会理所当然的认为连接已建立,而如果C并没有收到S的回应呢?此时,C仍认为连接未建立,S会对已建立的连接保存必要的资源,如果大量的这种情况,S会崩溃。 
因此第三次握手是必要的。
为什么不是四次
首先,如果乐于思考的同学应该会对上面有这样的疑问:
既然没法确认第二次的握手,C是否可以收到,
那么怎么确定第三次握手S就可以收到呢?
不错,这根本没法确定,因为完全可靠的通信协议是根本不存在的,我们任何的通信协议都是在接受这样的现实情况之上进行的。 
而三次握手后,C和S至少可以确认之前的通信情况,但无法确认之后的情况。 
在这个道理上说,无论是四次还是五次或是更多次都是徒劳的
本文转载于:https://blog.csdn.net/to_be_better/article/details/54885684
TCP建立连接为什么是三次握手,为什么不是两次或四次?的更多相关文章
- 为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?
		
看到了一道面试题:"为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?为什么不能用两次握手进行连接?",想想最近也到金三银四了,所以就查阅了相关资料,整理出来了这篇文章 ...
 - tcp建立连接为什么需要三次握手和四次挥手
		
前言 众所周知tcp传输层协议在建立连接的时候需要三次才能建立起一个真正的可靠连接,可是为什么是三次呢,不可以是两次,四次等等呢,可以自己思考一番,带着疑问可以看下文. 三次握手 在<计算机网络 ...
 - 网络TCP建立连接为什么需要三次握手而结束要四次
		
忽然顿悟了,不管三次握手,还是四次握手,这是保证信息来回两个链路可达(也就是信息能从A到B,也能从B到A)的最低要求.-2018-9-17-晚上九点 举个打电话的例子: A : 你好我是A,你听得到我 ...
 - 从收发消息能力来理解TCP建立连接时的三次握手
		
TCP是一个全双工协议,意味着在Client和Server都可以接收和发送数据. 所以,从另一个角度理解建立连接的目的就是要确保双方都要知道对端的收发消息的能力是正常的
 - 为什么TCP连接时是三次握手,而不是两次或四次?
		
TCP连接时有一个重要的任务就是服务端和客户端双方互相确认收发功能是否正常.图中步骤1,当客户端发起连接,服务端接收到请求,对于服务端来说,它此时知道客户端的发送功能和自己的接收功能是正常的. 图中步 ...
 - TCP 为什么是三次握手,而不是两次或四次?
		
TCP是一种全双工的可靠传输协议,核心思想:保证数据可靠传输以及数据的传输效率 A------B 二次握手: 1.A发送同步信号SYN+A's initial sequence number 2.B发 ...
 - 小故事理解TCP/IP连接时的三次握手
		
在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接,示意图如下: 下面通过一个小故事简单理解一下这三次握手的具体含义: 一天,快递员小客(客户端)准备去小服(服务器)家去送快递(准备与服务 ...
 - TCP 为什么是三次握手,而不是两次或四次?
		
记得第一次看TCP握手连接的时候,有同样的疑问,我的疑问是,为何不是两次呢?后来随着对网络的理解深入,明白TCP报文是交由IP网络来负责运输,IP网络并不能保证TCP报文到达目的地,既然IP网络是指望 ...
 - TCP采用四次挥手关闭连接如图所示为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
		
tcp四次挥手,由于TCP连接是全双工的,因此每个方向都必须单独进行关闭. 由于TCP连接是全双工的,因此每个方向都必须单独进行关闭.这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个 ...
 
随机推荐
- Selenium IDE
			
Selenium IDE : Selenium IDE作为Firefox浏览器的一款插件,依附于firefox浏览器,打开它的录制功能,它会忠实的记录,你对firefox的操作,并可以回放它所记录的你 ...
 - 深入浅出--UNIX多进程编程之fork()函数
			
0前言 上周都在看都在学习unix环境高级编程的第八章--进程控制.也就是这一章中.让我理解了unix中一些进程的原理.以下我就主要依照进程中最重要的三个函数来进行解说.让大家通过阅读这一篇文章彻底明 ...
 - spring 事务注解
			
在spring中使用事务需要遵守一些规范和了解一些坑点,别想当然.列举一下一些注意点. 在需要事务管理的地方加@Transactional 注解.@Transactional 注解可以被应用于接口定义 ...
 - 实验一:C++简单程序设计
			
[实验一] #2-28 实现一个简单的菜单程序,运行时显示“Menu:A(dd) D(elete) S(ort) Q(uit),Selete one:”提示用户输入.A表示增加,D表示删除,S表示排序 ...
 - 编译器将"+"转换成了StringBuilder类
			
MapReduce map100% Reduce 66% 卡死 如果你碰到map100%,reduce 66% 然后程序就貌似停止在这里了,可能是由于在Reduce类里使用了String造成的 根据一 ...
 - 初识GitHub之GitHub issues
			
事实上,GitHub最重要的一个功能之一就是Issue(问题),有了Issue,极大地提高了用户的互动性,也同时推动了代码的发展,因为一人智短,众人拾柴火焰高. 在他人的仓库中,我们发现了需要的代码, ...
 - [macOS] Cannot find libz when install php56
			
After upgraded to 10.12 and xcode8.2, when updating php with homebrew, i got these errors: /usr/loca ...
 - Eureka 参数调优
			
常见问题 为什么服务下线了,Eureka Server 接口返回的信息还会存在. 为什么服务上线了,Eureka Client 不能及时获取到. 为什么有时候会出现如下提示: EMERGENCY! E ...
 - 第十篇——Struts2的拦截器栈
			
拦截器栈: 从结构上看:拦截器栈相当于多个拦截器的组合: 从功能上看:拦截器栈也是拦截器. 默认拦截器栈: 在struts-core.jar包中的struts-default.xml中自定义了一个de ...
 - week_one-python基础 列表 增删改查
			
# Author:larlly #列表增删改查#定义列表name = ["wo","ni","ta","wo"] #定义 ...