TCP 协议是我们每天都在使用的一个网络通讯协议,因为绝大部分的网络连接都是建立在 TCP 协议上的,比如你此刻正在看的这篇文章是建立在 HTTP(Hypertext Transfer Protocol,超文本传送协议) 应用层协议的基础上的,而 HTTP 协议的“底层”则是建立在 TCP 的传输层协议上的。因此可以理解为,你之所以能看到本篇文章就是得益于 TCP 协议的功劳。

说一下 TCP 三次握手的执行流程,以及为什么需要三次握手?

典型回答

在回答这个问题之前,首先我们需要搞清楚两个概念,第一,什么是 TCP?第二,什么是 TCP 连接?只有搞明白了这两个问题,我们才能彻底搞懂为什么 TCP 需要三次握手?

什么是 TCP?

首先来说 TCP(Transmission Control Protocol,传输控制协议)是一个面向连接的、可靠的、基于字节流的传输层协议。从它的概念中我们可以看出 TCP 的三个特点:面向连接、可靠性和面向字节流。


TCP 的特点

面向连接:是指 TCP 是面向客户端和服务器端连接的通讯协议,使用它可以将客户端和服务器端进行连接。

可靠性:是指无论网络环境多差,TCP 都可以保证信息一定能够传递到接收端。

TCP 之所以可以保证可靠性主要得益于两个方面,一个是“状态性”,另一个是“可控制性”。所谓状态性是指 TCP 会记录信息的发送状态,例如,哪些数据收到了、哪些数据没收到等状态信息都会被记录;可控制性是指 TCP 会根据状态情况控制自己的行为,比如当 TCP 意识到丢包了就会控制重发此包,这样就实现了 TCP 的可靠性。

面向字节流:是指 TCP 是以字节流的方式进行数据传输的。

RFC 793 对 TCP 连接的定义如下:

Connections:
The reliability and flow control mechanisms described above require that TCPs initialize and maintain certain status information for each data stream.
The combination of this information, including sockets, sequence numbers, and window sizes, is called a connection.
小贴士:TCP 之所以被广泛应用,首先是因为它是一个标准化的协议,TCP 的标准协议
就是由 RFC 793 定义的,它已经有了 30 多年的历史,并且已经被多次更新。RFC(Req
uest For Comments)是 IETF(Internet Engineering Task Force)的正式文档。IETF 是
一家制定互联网标准的组织,它制定了 Internet(互联网)的整体协议体系,凡是经过 IETF评审认可的标准都会被发布为带编号的 RFC 的文档。

TCP 定义的大致意思是,用于保证可靠性和流控制机制的信息,包括 Socket、序列号及窗口大小被称为连接。

其中,Socket 是由 IP 地址加端口号组成的,序列号是用来解决乱序问题的,而窗口大小则是用来做流量控制的。

接下来我们来看 TCP 三次握手的执行流程,如下图所示:


TCP 三次握手的执行流程图

关键字说明:

●SYN(Synchronize Sequence Numbers),同步序列编号;

●ACK(Acknowledge Character),确认字符;

●SEQ(Sequence Number),序列号。

TCP 的执行流程如下:

●最开始时客户端和服务端都处于 CLOSED 状态,然后服务端先主动监听某个端口,此时服务器端就变成了 LISTEN(监听)状态;

●然后客户端主动发起连接,发送 SYN(同步序列编号),此时客户端就变成了 SYN-SENT 状态;

●服务端接收到信息之后返回 SYN 和 ACK 至客户端,此时服务器端就变成了 SYN-REVD 状态;

●客户端接收到消息之后,再发送 ACK 至服务器端,此时客户端就变成了 ESTABLISHED(已确认)状态,服务端收到 ACK 之后,也变成了 ESTABLISHED 状态,此时连接工作就执行完了。

为什么 TCP 需要三次握手?

了解了以上 TCP 的基础概念之后,我们再来看一下 TCP 为什么需要三次握手?

原因一:防止重复连接

首先来说 RFC 793 - Transmission Control Protocol 其实就指出了三次握手的主要原因,它的描述如下:

The principle reason for the three-way handshake is to prevent old duplicate connectioninitiations from causing confusion.

翻译为中文的意思是,三次握手的主要原因是为了防止旧的重复连接引起连接混乱问题。

比如在网络状况比较复杂或者网络状况比较差的情况下,发送方可能会连续发送多次建立连接的请求。如果 TCP 握手的次数只有两次,那么接收方只能选择接受请求或者拒绝接受请求,但它并不清楚这次的请求是正常的请求,还是由于网络环境问题而导致的过期请求,如果是过期请求的话就会造成错误的连接。

所以如果 TCP 是三次握手的话,那么客户端在接收到服务器端 SEQ+1 的消息之后,就可以判断当前的连接是否为历史连接,如果判断为历史连接的话就会发送终止报文(RST)给服务器端终止连接;如果判断当前连接不是历史连接的话就会发送指令给服务器端来建立连接。

原因二:同步初始化序列化

通过上面的概念我们知道 TCP 的一个重要特征就是可靠性,而 TCP 为了保证在不稳定的网络环境中构建一个稳定的数据连接,它就需要一个“序列号”字段来保证自己的稳定性,而这个序列号的作用就是防止数据包重复发送,以及有效的解决数据包接收时顺序颠倒的问题。

那么在建立 TCP 连接时就需要同步初始化一个序列号来保证 TCP 的稳定性,因此它需要执行以下过程:

●首先客户端发送一个携带了初始序列号的 SYN 报文给服务器端;

●服务端接收到消息之后会回复一个 ACK 的应答报文,表示客户端的 SYN 报文已被服务端成功接收了;

●而客户端收到消息之后也会发送一个 ACK 给服务端,服务器端拿到这个消息之后,我们就可以得到一个可靠的初始化序列号了。

而如果是两次握手的话,就无法进行序列号的确认工作了,因此也就无法得到一个可靠的序列号了,所以 TCP 连接至少需要三次握手。

以上两种原因就是 TCP 连接为什么需要三次握手的主要原因,当然 TCP 连接还可以四次握手,甚至是五次握手,也能实现 TCP 连接的稳定性,但三次握手是最节省资源的连接方式,因此 TCP 连接应该为三次握手。

TCP 知识是计算机编程基础,也是面试中常见的面试问题,因为我们现在所使用的大部分连接都是建立在 TCP 基础上的。因此对 TCP 的掌握可以让我们更清楚地理解技术的实现过程,也能帮我们写出更加优秀的代码,以及排查一些和网络相关的问题。

●什么是 UDP?

●TCP 和 UDP 有什么区别?

知识扩展

UDP 介绍

UDP(User Data Protocol,用户数据报协议)是无连接的、简单的、面向数据报的传输层协议。也就是 UDP 在发送数据之前,无须建立客户端与服务端的连接,直接发送消息即可。

UDP 的协议头有 8 个字节(64 位),如下图所示:


UDP 的协议头

其中源端口和目标端口是指记录发送方和接收方端口;UDP 包长度是指 UDP 头部加上 UDP 数据的总长度;UDP 校验和用于效验 UDP 的内容是否可靠。

UDP 常见的使用场景有:语音、视频等多媒体通信、DNS(域名转化)、TFTP 等。

TCP VS UDP

TCP 和 UDP 的区别主要体现在以下 7 个方面:

可靠性,TCP 有“状态性”和“可控制性”可以保证消息不重复、按顺序、不丢失的发送和接收,而 UDP 则不能保证消息的可靠性;

连接,TCP 是面向连接的传输层协议,传输数据前先要建立连接,而 UDP 发送数据之前无需建立连接;

服务对象,TCP 服务的对象为一对一的双端应用,而 UDP 可以应用于一对一、一对多和多对多的通信场景;

效率,TCP 的传输效率较低,而 UDP 的传输效率较高;

流量控制,TCP 有滑动窗口可以用来控制流量,而 UDP 则不具备流量控制的能力;

报文,TCP 是面向字节流的传输层协议,而 UDP 是面向报文的传输层协议;

应用场景,TCP 的应用场景是对消息准确性和顺序要求较高的场景,而 UDP 则是应用于对通信效率较高、准确性要求相对较低的场景。

TCP 和 UDP 的使用场景如下图所示:


TCP 和 UDP 的使用场景

小结

我们介绍了 TCP 三个特点:面向连接、可靠性和面向字节流,其中可靠性主要是依赖它的状态记录和根据实际情况调整自身的行为方式。例如,当 TCP 意识到丢包时就会重发此包,这样就保证了通信的可靠性。

TCP 之所以需要三次握手的主要原因是为了防止在网络环境比较差的情况下不会进行无效的连接,同时三次握手可以实现 TCP 初始化序列号的确认工作,TCP 需要初始化一个序列号来保证消息的顺序。如果是两次握手则不能确认序列号是否正常,如果是四次握手的话会浪费系统的资源,因此 TCP 三次握手是最优的解决方案,所以 TCP 连接需要三次握手。

最后我们讲了 UDP 的概念,以及 UDP 和 TCP 的区别,在传输效率要求比较高且对可靠性要求不高的情况下可以使用 UDP,反之则应该使用 TCP。

TCP 为什么需要三次握手?相关推荐

  1. TCP/IP协议三次握手与四次握手流程解析

    原文链接地址:http://www.2cto.com/net/201310/251896.html TCP/IP协议三次握手与四次握手流程解析 TCP/IP协议的详细信息参看<TCP/IP协议详 ...

  2. 通俗易懂的TCP里面的三次握手以及四次挥手

    通过三次握手来建立连接. 连接建立之后,就会传送数据! 四次握手来释放TCP连接 关于TCP协议中三次握手中的大写ACK和小写ack number的区别 参考:https://blog.csdn.ne ...

  3. 一些通讯知识、TCP/IP、三次握手四次分手(正确的图,网上很多错了)、HTTP\HTTPS、DNS、UDP

    总述 这里会按照一个浏览器(客户端)是向服务器请求资源的路径来分享知识点 有些内容在之前的博客有,您可以自取 浏览器(客户端)是如何向服务器请求资源的呢? 见下图: 客户端输入网址(输入搜索内容也是一 ...

  4. TCP建立连接三次握手和释放连接四次握手

    TCP建立连接三次握手和释放连接四次握手     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/52535294 在谈及T ...

  5. 通俗理解tcp/ip的三次握手和四次分手

    转载地址:https://github.com/jawil/blog/issues/14 最近在恶补计算机网络方面的知识,之前对于TCP的三次握手和四次分手也是模模糊糊,对于其中的细节更是浑然不知,最 ...

  6. 理解TCP为什么需要进行三次握手(白话)(转载)

    原文地址:http://www.cnblogs.com/yuilin/archive/2012/11/05/2755298.html#comment_tip 首先简单介绍一下TCP三次握手     在 ...

  7. TCP为什么是三次握手和四次挥手

    转载自   TCP为什么是三次握手和四次挥手 为什么建立连接是三次握手断开连接是四次挥手?  三次握手的流程和四次挥手的流程是什么? 三次握手与四次回收分别对应TCP连接与断开过程 tcp报文格式  ...

  8. 白话解说TCP/IP协议三次握手和四次挥手

    白话解说TCP/IP协议三次握手和四次挥手 1.背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次. 从好上开始,到现在,一年多也算坚持下来了. 1.1.问题 有时候聊天的过程中,我的 ...

  9. TCP协议的三次握手与四次挥手

    tcp协议的三次握手和四次挥手 三次握手: 第一次握手: 客户端发起一个链接(SYN) 第二次握手: 服务端就会返回一条(ACK)确认信息,同时服务端也会向客户端发起一个链接请求(SYN),此二者可合 ...

  10. TCP协议中三次握手

    TCP/IP是互联网相关的各类协议族的总称 TCP/IP协议族分为:应用层,传输层,网络层,数据链路层 应用层:向用户提供应用服务时的通讯的活动 传输层:提供处于网络连接中的两台计算机之间的数据传输 ...

最新文章

  1. 汇编语言关于8086CPU多种寻址方式总结
  2. Nature好文:过去150年,科学与产业经历四段情缘!
  3. chemdraw怎么画拐弯的箭头_性感皮衣皮裤的质感服装该怎么画?
  4. 针对Oracle的10G版本提升SCOTT为DBA脚本!
  5. Mycat源码篇 : 起步,Mycat源码阅读调试环境搭建
  6. SAP UI5 应用开发教程之四十一 - Chrome 扩展 UI5 Inspector 的离线安装和使用方法试读版
  7. hi模板文件报乱码问题
  8. 2014上海全国邀请赛 解题报告
  9. 宁芝普拉姆键盘说明书及帮助文档支持宏定义
  10. 计算机如何把表格分成两排,wps表格怎么拆分单元格,excel单元格拆分两列
  11. Problem - 1077E - E. Thematic Contests(暴力+二分)
  12. 青龙面板哔哩哔哩抽奖白嫖
  13. 简笔画花边边框超简单_花边简笔画简单又漂亮 手抄报的边框图片大全
  14. 启动本地mysql的几种方式
  15. Verilog语法中parameter与localparam
  16. 关于DDD领域驱动设计的理论知识收集汇总
  17. 票据打印机-ESC/POS指令使用
  18. vue如何拖拽element-ui的table
  19. vue初学——vue学习路线
  20. 今日头条自媒体矩阵运营攻略

热门文章

  1. 性能监控:top命令
  2. PyTorch scatter_ 从懵懂到清晰
  3. OPPOEncoFree2配对
  4. 对Request.parameter中参数进行添加或修改
  5. 作为一名大学生,为什么会直接选择IT培训?IT培训有什么好处?
  6. python中如何判断一个字符串是否可以转换为数字
  7. 动物识别系统代码python_动物识别专家系统课程设计
  8. java nginx 重启吗_nginx(二) : 启动、重启、停止
  9. java计算机毕业设计家庭园艺服务平台源码+数据库+lw文档+系统
  10. 大学生必备:用Python实现shua课自由,又是美好的一天