一:三次握手

三次的握手的过程是:

1.由发起方HostA向被叫方HostB发出请求报文段,此时首部中的同步位SYN=1,同时选择一个序列号seq=x。TCP规定,SYN报文(即SYN=1的报文段)不能携带数据,但要消耗一个序列号。这时,TCP客户端进程进入SYN-SENT(同步已发送)状态。

2.HostB收到连接请求报文后,如同意建立连接,则向HostA发送确认。在确认报文段中应把SYN和ACK都置为1,确认号是ack=x+1,同时也为自己选择一个序列号seq=y。请注意这个报文段也不能携带任何数据,但同样要消耗一个序列号。这时TCP服务器进程进入SYN-REVD(同步收到)状态。

3.TCP客户端收到HostB的确认后,还要向HostB给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。

此时SYN的值为0(待会从抓的报文中也可以看出)。TCP规定ACK的报文段可以携带数据。但如果不携带数据则不消耗序列号,在这种情况下,下一个数据报文段的序号仍是seq=x+1。整个过程如图所示。

三次握手第一步:

三次握手第二步:

三次握手第三步:

二:为什么要三次握手

书上、播客中找了好多三次握手的理由,但是解释都不是特别的清楚明白,问了身边搞网络工程师的同学,推荐了一本

《路由交换术》,这是同学参加华三公司考试时用的教科书,里面对三次握手的解释比较清楚。

三:四次分手

四次分手的过程是:

1.A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接A把连接释放报文段首部的FIN置1, 其序号seq = u , 它等于前面己传送过的数据的最后一个字节的序号加1,这时A进入FIN-WAIT- 1 (终止等待 1)状态 , 等待B的确认请注意 , TCP规定 , FIN报文段即使不携带数据 ,它也消耗掉一个序号

2.B收到连接释放报文段后即发出确认,确认号是ack=u + 1,而这个报文段自己的序号 是v, 等于B前面己传送过的数据的最后一个字节的序号加1然后B就进入CLOSE-WAIT( 关闭等待 )状态 。TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭 ( half-close )状态 ,即A己经没有数据要发送了,但B若发送数据 , A仍要接收 。也就是说 ,从B到A这个方向的连接并未关闭。这个状态可能会持续一些时间。A收到来自B的确认后 ,就进入FIN-WAIT-2(终止等待2)状态, 等待B发出的连接释放报文段 。

3.若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使FIN = 1, 现假定B的序号为w(在半关闭状态B可能又发送了一些数据)。B还必须重复上次己发送过的确认号 ack= u+1,这时B就进入LAST-ACK(最后确认)状态,等待A的确认。

4.A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1, 确认号ack = w + 1, 而自己的序号是seq = u + 1(根据TCP标准,前面发送过的FIN报文段要消耗一个序号 )。然后进入到TIME-WAIT( 时间等待)状态。请注意,现在TCP连接 还没有释放掉。必须经过时间等待计时器(TIME-WAIT timer) 设置的时间2MSL后,A才进入到CLOSED状态。时间MSL叫做最长报文段寿命(Maxium Segment Lifetime)RFC793 建议设为2分钟。但这完全是从工程上来考虑,对于现在的网络 ,MSL = 2分钟可能太长了 一些。因此TCP允许不同的实现可根据具体情况使用更小的MSL值。因此,从A进入到TIME-WAIT状态后, 要经过4分钟才能进入到CLOSED状态,才能开始建立下一个新的连接。当A撤销相应的传输控制块TCB后, 就结束了这次的TCP连接。 整个过程如图所示。

四次分手第一步:

四次分手第二步:

四次分手第三步:

四次分手第四步:

四:客户端、服务端整个过程

客户端整个过程如图。

服务端整个过程如图。

最新文章

  1. 基于ThinkPHP开发的PHPExcel导入
  2. IOS开发/iphone开发多线程
  3. Serenity框架官方文档翻译(1-2开始、安装和界面)
  4. Linux bashrc和profile的用途和区别
  5. ios下最简单的正则,RegexKitLite
  6. Python的对象操作(一)
  7. linux登录后出现_bash-4.1#终端提示符异常
  8. 快速下单!简化EcStore的购物结算流程
  9. mysql数据库日期是varchar类型的时间比较查询
  10. 永久性for循环配合switch语句可以实现菜单功能
  11. 子PID namespace中获取父namespace中pid的方法
  12. PHP中提问频率最高的11个面试题和答案
  13. Hello TensorFlow 二 (GPU)
  14. linux删除软链接文件【原创】
  15. webpack4.0各个击破(5)—— Module篇
  16. oracle 12c中种子数据库的隐藏与保护
  17. cxGrid 颜色设置
  18. ASP .NET Core 基本知识点示例 目录
  19. MySQL两种引擎的比较
  20. Oracle 11gR2 RAC监听器原理介绍

热门文章

  1. Android开发 将数据保存到SD卡
  2. NDK环境配置
  3. XtraBackup原理4
  4. php版DES
  5. 1085. Perfect Sequence (25)
  6. Linux系统如何平滑生效NAT-BUGFIX
  7. Android基本控件之RadioGroup
  8. python学习笔记(三)--条件语句
  9. 聊聊 #pragma 和 // MARK:
  10. 英文破折号(em dash)、连接号(en dash)与连字符(hyphen)的区别及各自用法是什么?