接触网络协议栈TCP/IP的人,就一定绕不开的一个话题就是TCP的三次握手。下面我将简单介绍一下。

三次握手流程的本质,可以这么理解:TCP的三次握手其实是双方各一次握手,各一次确认,只是其中一次握手和确认合并在一起。

当然也可以更通俗的去理解:

  • “喂,你听得到吗?”

  • “我听得到呀,你听得到我吗?”

  • “我能听到你”

三次握手为什么不用两次,或者四次

原因很简单,因为只有三次才是最合适的,三次通信是最小值,两次通信满足不了要求,而四次通信则显得冗余。

比如之前的三次改成两次,四次的结果就变味了。

两次握手:

  • “喂,你听得到吗?”

  • “我听得到呀”

  • “喂,你听得到吗?”

  • “草,我听得到呀!!!!”

  • “你TM能不能听到我讲话啊!!喂!”

  • “……”

四次握手:

  • “喂,你听得到吗?”

  • “我听得到呀,你听得到我吗?”

  • “我能听到你,你能听到我吗?”

  • “……不想跟傻逼说话”

TCP的三次握手流程

  1. 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

  2. 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

  3. 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

TCP“三次握手” 这个问题的本质是, 信道不可靠, 但是通信双发需要就某个问题达成一致. 而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值. 所以三次握手不是TCP本身的要求, 而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠. 三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就没关系了. 因此,如果信道是可靠的, 即无论什么时候发出消息, 对方一定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就可以了.”。这可视为对“三次握手”目的的另一种解答思路。

最新文章

  1. Hive技术架构
  2. 改写《python基础教程》中的一个例子
  3. Windows 运行时组件
  4. 【CodeForces 567E】President and Roads(最短路)
  5. python display color output
  6. BYTE 和字符串转换
  7. php Memcache/Memcached操作手册
  8. View (二) 自定义属性
  9. Unity GUI内绘制贝塞尔曲线
  10. Objective-C开发图书推荐
  11. Android_UI
  12. oracle----复制表中的数据
  13. 运行第一个Hadoop程序,WordCount
  14. Linux下的静态IP配置【weber出品】
  15. linux:如何修改用户的密码
  16. Entity Framework的事务提交
  17. 解析jQuery中extend方法--用法《一》
  18. 利用jstack命令定位占用cpu高的java线程及具体错误代码信息
  19. MySQL报错
  20. Python基础之Python分类

热门文章

  1. 20191010-7 alpha week 1/2 Scrum立会报告+燃尽图 06
  2. ECShop二次开发指南(一)
  3. (三)Django模板语言
  4. React Native的缓存和下载
  5. 大数据框架开发基础之Sqoop(1) 入门
  6. iOS从gif获取图片数组
  7. beetlex网关之聚合和url请求过虑
  8. .NET 在云原生时代的蜕变,让我在云时代脱颖而出
  9. Java 多线程安全问题简单切入详细解析
  10. js-xlsx 一个实用的js 导出列表插件