TCP为何采用三次握手来建立连接,若采用二次握手可以吗
1. TCP简介
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、可靠的、基于IP的传输层协议,采用三次握手确认建立一个连接。
TCP为了保证报文传输的可靠[1],就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。
2. TCP协议三次握手过程分析
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:
位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)
Sequence number(顺序号码) Acknowledge number(确认号码)
第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;
第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包
第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。
完成三次握手,主机A与主机B开始传送数据。
3. TCP连接建立
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.

4. 通俗理解
通俗理解
第一次对话:
前方敌军火力很猛,团长叫通讯员小张打电话请求总部支援。
小张拿起电话,说:“呼叫总部,这里是独立团”。不巧电话线被炸断了,总部接收不到小张传来的信息的情况下,沟通失败。
如果总部听到小张的呼叫,那么第一次对话成功,接下来进行第二次对话。
第二次对话:
总部听到了小张的话,但是不巧,总部接电话的只有一个外国友军,来了句"Hello, balabal"。小张农民出身,一句听不懂,多次尝试,沟通失败。说明总部无法做出正确的应答情况下沟通失败。
如果总部听到小张的话,并做出正确应答,并且进行反问,:”小张同志,详细说一下具体情况。 那么第二次握手成功。
通过前两次对话,说明总部听懂了小张的话,并且做出正确应答,接下来进行第3次对话。
第三次对话:
小张刚说完话,来了一个子弹,小张同志牺牲了。总部等了许久,没听到小张回话,通话结束。说明小张在无法应答的情况下沟通失败。
如果小张刚好穿了防弹衣,做出应答:"敌人的火力很猛,请求支援。两人第3次对话成功,两人建立起顺畅的沟通渠道,接下来开始持续通话。
听过第二次和第三次对话,证明了总部能听懂小张的话,并且做出正确应答。
可见,小张要和总部沟通,3次通话过程是必须的。TCP采用三次握手来建立连接,也可以理解了。
5. 为什么要建立3次握手,一次连接
为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手。
为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。
如果只是两次,就不能客户端是否收到服务器端的应答。
6. 引用
http://baike.baidu.com/subview/32754/8048820.htm?from_id=8988699&type=syn&fromtitle=TCP%E5%8D%8F%E8%AE%AE&fr=aladdin
http://www.cnblogs.com/CBDoctor/archive/2012/10/17/2727073.html
TCP为何采用三次握手来建立连接,若采用二次握手可以吗的更多相关文章
- TCP为何采用三次握手来建立连接,若采用二次握手可以吗?
首先简单介绍一下TCP三次握手 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_ ...
- TCP三次握手(建立连接)/四次挥手(关闭连接)
TCP数据包格式 顺序号(32位):用来标识从TCP源端向TCP目的端发送的数据字节流,它表示在这个报文段中的第一个数据字节的顺序号.如果将字节流看作在两个应用程序间的单向流动,则TCP用顺序号对每个 ...
- TCP ------ TCP三次握手(建立连接)及其相关内容
1.TCP客户端要连接到TCP服务器,需要经过三个过程: 以下是通过 Wireshark 抓取的三次握手数据包 → [SYN] Seq= Win= Len= MSS= → [SYN, ACK] Seq ...
- 为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?
看到了一道面试题:"为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?为什么不能用两次握手进行连接?",想想最近也到金三银四了,所以就查阅了相关资料,整理出来了这篇文章 ...
- TCP面试题之为什么需要三次握手才能建立连接/四次挥手才能断开连接
为什么需要三次握手才能建立连接? 答:为了初始化Sequence Number(序列号)的初始值,要通知双方数据包的序号,作为以后通讯的序号,以保证在网络传输过程,不会因为网络原因而导致乱序: 为什么 ...
- TCP协议为什么会采用三次握手,若采用二次握手可以吗?
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的.可靠的.基于IP的传输层协议,采用三次握手确认建立一个连接. TCP为了保证报文传输的 ...
- TCP为什么会采用三次握手,若采用二次握手可以吗?
建立连接的过程是利用C/S(客户机/服务器)模式,假设A为客户端,B为服务器端. TCP是采用三次握手进行连接的,简要说明该过程: (1) A向B发送连接请求 (2) B对收的的A的报文段进行确认 ( ...
- RTMP流媒体播放过程:握手,建立连接,建立流,播放
本文讲述从打开一个RTMP流媒体到视音频数据开始播放的整个过程. 播放一个流媒体有两个前提步骤: 第一步,建立一个网络连接(NetConnection): 第二步,建立一个网络流(NetStream) ...
- TCP建立连接为什么是三次握手,为什么不是两次或四次?
什么是三次握手 学过网络编程的人,应该都知道TCP建立连接的三次握手,下面简单描述一下这个过程. 如图所示 第一次握手:客户端发送TCP包,置SYN标志位为1,将初始序号X,保存在包头的序列号(Seq ...
随机推荐
- @RequestMapping注解
Spring MVC中用于参数绑定的注解有很多,都在org.springframework.web.bind.annotation包中,根据它们处理的request的不同内容部分可以分为四类(主要讲解 ...
- python的pika模块操作rabbitmq
上一篇博文rabbitmq的构架和原理,了解了rabbitmq的使用原理,接下来使用python的pika模块实现使用rabbitmq. 环境搭建 安装python,不会的请参考Linux安装配置py ...
- 导入一个新项目需要注意的几大问题(jdk1.6+eclipse4.4+tomcat6)
今天导项目犯了一个很低级的错误,浪费了半个小时,所以在此罗列出在导一个新的项目到eclipse中时需要注意的几个问题,希望对大家有所帮助. 将项目从svn或者github等项目版本控制软件上拷贝下来, ...
- linux上的组管理
上一次我们谈了CentOS上的用户管理,现在我们再来谈下CentOS上的用户组管理. groupadd创建一个新的组 用法如下: groupadd [选项] groupname 常用选项: -f 强制 ...
- python+xlsxwriter+PIL自动压图贴图到Excel小工具
一.环境 windows10/mac + python3.6 python第三方库 xlsxwriter.PIL.argparse 二.需求 1.运行每条测试case成功与否都需要把截图放在img文件 ...
- dubbo refrence bean(服务引用)
在xml上写一个dubbo标签就可以把远程的服务引用到本地使用: <dubbo:reference id="buyFoodService" interface="c ...
- BZOJ 4517: [Sdoi2016]排列计数 [容斥原理]
4517: [Sdoi2016]排列计数 题意:多组询问,n的全排列中恰好m个不是错排的有多少个 容斥原理强行推♂倒她 $恰好m个不是错排 $ \[ =\ \ge m个不是错排 - \ge m+1个不 ...
- C# 使用GDI制作垂直进度条(由下往上)
使用GDI+绘进度条的方式多种多样,可以封装一个UserControl,也可以直接使用一个控件来绘制(Label.Image.Panel等),甚至可以直接在winForm上画一个,关键代码没几行(这里 ...
- c语言输入一个字符串,统计其字母,数字和其他字符的个数,并以柱状图输出
#include<stdio.h>int main(int arge,char *argv[]){ char ch; int alp=0,num=0,oth=0,len,alp_start ...
- win8 -telnet安装
控制面板->程序-> 启动或关闭windows功能->选择telnet服务器和telnet客户端->确定 为了安全起见,我们可以设置为手动器用telnet,右键计算机-> ...