三次握手这个说法不好,其实是双方各一次握手,各一次确认,其中一次握手和确认合并在一起

为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次握手。

在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状态,完成三次握手。

通过这样的三次握手,客户端与服务端建立起可靠的双工的连接,开始传送数据。

三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的。

但是为什么一定要进行三次握手来保证连接是双工的呢,一次不行么?两次不行么?我们举一个现实生活中两个人进行语言沟通的例子来模拟三次握手。

第一次对话:

老婆让甲出去打酱油,半路碰到一个朋友乙,甲问了一句:哥们你吃饭了么?

结果乙带着耳机听歌呢,根本没听到,没反应。甲心里想:跟你说话也没个音,不跟你说了,沟通失败。说明乙接受不到甲传过来的信息的情况下沟通肯定是失败的。

如果乙听到了甲说的话,那么第一次对话成功,接下来进行第二次对话。

第二次对话:

乙听到了甲说的话,但是他是老外,中文不好,不知道甲说的啥意思也不知道怎样回答,于是随便回答了一句学过的中文 :我去厕所了。甲一听立刻笑喷了,“去厕所吃饭”?道不同不相为谋,离你远点吧,沟通失败。说明乙无法做出正确应答的情况下沟通失败。

如果乙听到了甲的话,做出了正确的应答,并且还进行了反问:我吃饭了,你呢?那么第二次握手成功。

通过前两次对话证明了乙能够听懂甲说的话,并且能做出正确的应答。接下来进行第三次对话。

第三次对话:

甲刚和乙打了个招呼,突然老婆喊他,“你个死鬼,打个酱油咋这么半天,看我回家咋收拾你”,甲是个妻管严,听完吓得二话不说就跑回家了,把乙自己晾那了。乙心想:这什么人啊,得,我也回家吧,沟通失败。说明甲无法做出应答的情况下沟通失败。

如果甲也做出了正确的应答:我也吃了。那么第三次对话成功,两人已经建立起了顺畅的沟通渠道,接下来开始持续的聊天。

通过第二次和第三次的对话证明了甲能够听懂乙说的话,并且能做出正确的应答。

可见,两个人进行有效的语言沟通,这三次握手的过程是必须的。

同理对于TCP为什么需要进行三次握手我们可以一样的理解:

为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次握手。

TCP头部: 其中 ACK   SYN  序号  这三个部分在以下会用到,它们的介绍也在下面。

暂时需要的信息有:

ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1

SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此,  SYN置1就表示这是一个连接请求或连接接受报文。

FIN (finis)即完,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。

三次握手的过程:

下面是释放连接的过程:

该部分内容配图有误,请大家见谅,正确的配图如下,错误配图也不删了,大家可以比较下,对比理解效果更好。这么久才来更新,抱歉!!

错误配图如下:

首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。

整个过程Client端所经历的状态如下:

而Server端所经历的过程如下:转载请注明:blog.csdn.net/whuslei

【注意】 在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文

tcp 三次握手连接相关推荐

  1. 趣谈TCP三次握手连接

    TCP三次握手链接 1.先趣谈三次握手链接 2.TCP三次握手:报文段交换 - TCP报文段结构 - 三次握手分析 3.问:为什么发送方要发出第三个确认报文呢? 1.先趣谈三次握手链接 在开始正式的讲 ...

  2. Tcp三次握手连接梳理

    之前一直对tcp的三次握手和四次挥手总是懵懵懂懂,感觉知道个大概,但是又说不清楚.所以查阅了一些网上的优秀文章,在这里尝试梳理一下加深自己理解和记忆. 一.TCP报文段结构 要了解三次握手的过程中发送 ...

  3. TCP三次握手连接及seq和ack号的正确理解

    http://blog.chinaunix.net/uid-25513153-id-187780.html 三次握手Three-way Handshake 一个虚拟连接的建立是通过三次握手来实现的 1 ...

  4. TCP三次握手连接和TCP四次挥手及大量TIME_WAIT解决方法:

    1.TCP建立连接,三次握手 建立的TCP连接可靠的连接,必须经过三次握手建立连接才能正式通信彼此传输数数据. 客户端请求服务端建立连接 第一次握手:客户给服务发送一个请求报文SYN, 客户端的状态置 ...

  5. TCP三次握手(建立连接)/四次挥手(关闭连接)

    相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助. 而且对于有网络协议工程师之类笔试, ...

  6. TCP协议三次握手连接四次握手断开和DOS攻击

    转载: http://hi.baidu.com/xgdcisco/blog/item/60da65f70fd8145d342acc28.html: http://blog.csdn.net/losty ...

  7. TCP三次握手建立连接的过程

    来源:TCP三次握手建立连接的过程 TCP 是面向连接的协议,所以每次发出的请求都需要对方进行确认.TCP 客户端与 TCP 服务器在通信之前需要完成三次握手才能建立连接. 下面详细讲解三次握手的过程 ...

  8. TCP三次握手建立连接

    一.三次握手的过程 TCP需要三次握手才能建立连接,整个过程如下图所示: 假设A运行的是TCP客户端进程,而B运行的是TCP服务端进程.最开始的时候两端的TCP进程都处于ClOSED(关闭)状态. 这 ...

  9. TCP三次握手建立连接和四次挥手关闭连接

    TCP三次握手 是指建立TCP连接协议时,需要在客户端和服务器之间发送三个包,握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据. 第一次握手:客户端发送第一个包,其中S ...

  10. 客户端主动断开连接_Go实现客户端和服务器抓包分析TCP三次握手和断开操作

    本文主要是想通过抓包工具分析一下TCP三次握手和断开过程: 1.TCP三次握手建立连接和断开连接解释,如下图: TCP三次握手建立连接和断开连接 2.通过WireShark抓包查看这个TCP过程,数据 ...

最新文章

  1. abap 取数排序之后怎么取第一行
  2. 挨踢脱口秀精选集汇总
  3. 修改无效_修改劳动合同日期被认定无效,青岛一企业被判赔双倍工资
  4. VirtualBox在win10下安装一个manjaro linux操作系统的教程
  5. 使用Red Hat Enterprise Linux的实时内核
  6. 初学者python笔记(列表的食用方法)
  7. 稳定服务器头像,WordPress 修复 Gravatar 头像稳定服务器地址
  8. html post提交中文数据,HTML使用post方式提交中文内容出现乱码的错误解决方式
  9. C#中的线程二(BeginInvoke和Invoke)
  10. java volatile 和Transient 关键字
  11. python 虚拟环境 windows_Python虚拟环境(Windows版)
  12. Blender-UV Mapping
  13. reapair oracle,并行查询的 PX Deq: reap credit 等待
  14. Python3,5句话实现自动接收短信提醒
  15. Pandas数据分析及可视化应用实践
  16. script标签放在页面头部和尾部的区别
  17. 【原创】Java开发word模板转html导出pdf
  18. python画图---matplotlib安装教程
  19. 图像矩(Hu矩)简介
  20. 立足伟大传统的前沿:铁路实时安全软件

热门文章

  1. 视频剪辑软件Movie Studio安装教程
  2. (十一)JAVA springboot ssm b2b2c多用户商城系统 - SSO单点登录之OAuth2.0登录流程(2)
  3. 大数据滥用 借贷平台肆意妄为的背后
  4. mkdir() mkdirs() createNewFile
  5. Selecting Foreground or Background Colors
  6. 茶余饭后聊Spring 一
  7. C++字符串格式化 sprintf详解
  8. 详细设计说明书评测规范
  9. iOS开发NSDecimalNumber的基本使用,加、减、乘、除、指数、比较
  10. Mac出现启动问题怎么办