TCP 的通讯双方需要发送 3 个包(即:三次握手)才能建立连接,本文将通过 3 副图来解释为什么需要 3 次握手才能建立连接。

TCP 连接的建立过程本质是通信双方确认自己和对方都具有通信能力的过程。TCP 通信双方都需要发送数据和接收数据,通信能力包括:客户端发送数据能力,客户端接收数据能力,服务端发送数据能力,服务端接收数据能力。完成了这些能力的确认,连接才算成功建立。

第一次握手,客户端发送 SYN 包给服务端之后。服务端收到了来自客户端的包,服务端可以确定:服务端具有接收能力,客户端具有发送能力。而客户端则什么也不能确定,不知道发送的包是否到达了服务端。

.st2 {fill:#000000;font-family:Times New Roman;font-size:9pt}
.st1 {fill:#191919;font-family:Times New Roman;font-size:12pt;font-weight:bold}
.st3 {fill:#191919;font-family:Times New Roman;font-size:12pt}
服务端客户端SYN客户端发送能力客户端接收能力服务端发送能力服务端接收能力客户端发送能力客户端接收能力服务端发送能力服务端接收能力客户端视角服务端视角

第二次握手,服务端发送 SYN/ACK 包给客户端之后。客户端知道了服务端成功接收了自己发送的 SYN 包,并且自己成功接收了来自服务端的 ACK/SYN 包,所以客户端可以确定:客户端具有发送能力,服务端具有接收能力,服务端具有发送能力,客户端具有接收能力,客户端完成了能力确认。而服务端并不知道更多的信息。

.st2 {fill:#000000;font-family:Times New Roman;font-size:9pt}
.st1 {fill:#191919;font-family:Times New Roman;font-size:12pt;font-weight:bold}
.st3 {fill:#191919;font-family:Times New Roman;font-size:12pt}
服务端客户端ACK/SYN客户端发送能力客户端接收能力服务端发送能力服务端接收能力客户端发送能力客户端接收能力服务端发送能力服务端接收能力客户端视角服务端视角

第三次握手,客户端发送 ACK 包给服务端。服务端知道了自己发送的 SYN/ACK 被客户端成功接收了,服务端可以知道更多信息:客户端具有接收能力,服务端具有发送能力。

.st2 {fill:#000000;font-family:Times New Roman;font-size:9pt}
.st1 {fill:#191919;font-family:Times New Roman;font-size:12pt;font-weight:bold}
.st3 {fill:#191919;font-family:Times New Roman;font-size:12pt}
服务端客户端ACK客户端发送能力客户端接收能力服务端发送能力服务端接收能力客户端发送能力客户端接收能力服务端发送能力服务端接收能力客户端视角服务端视角

基于 TCP 通信的双方进行握手连接的过程是从双方视角确认通信能力的过程。而通信能力的确立需要至少发送 3 个数据包,所以说 TCP 连接的建立需要三次握手。当然,在 SYN 包丢失的情况下重传机制会重新发送 SYN 包,连接过程中实际发送包的数量也有可能超过 3 个。

最新文章

  1. 渗透测试工具BurpSuite做网站的安全测试(基础版)
  2. 【Redis】:Jedis 使用
  3. Dagger2 (一) 入坑篇
  4. Data Big Bang
  5. mount什么意思
  6. 剖析信用卡 DCC 交易
  7. Sqli-LABS通关笔录-7[文件写入函数Outfile]
  8. TP中手动加载类库
  9. js根据IP取得天气
  10. [课程相关]homework-04
  11. poj 3281 Dining【拆点网络流】
  12. IDL实现主成分变化(PCA)
  13. apache将请求转发到到tomcat应用
  14. 计算ptd
  15. invalid receiver type
  16. 软工+C(2017第8期) 提问与回复
  17. MySQL优化 - 索引优化
  18. 使用 GStreamer appsrc 等插件实现视频音频混流,录制和推流
  19. istio入门(04)istio的helloworld-部署构建
  20. ReentrantReadWriteLock读写锁的使用2

热门文章

  1. justify-content属性详解
  2. 剑指offer二刷——数组专题——数组中重复的数字
  3. Java集合源码分析(六)——ConcurrentHashMap
  4. docker容器之间通过bridge进行通信
  5. C# WPF开源控件库:MahApps.Metro
  6. 精尽Spring MVC源码分析 - 文章导读
  7. Flink读写Redis(一)-写入Redis
  8. 多任务-python实现-Thread的基本使用(2.1.1)
  9. CTF练习三 —— 命令注入&命令执行绕过
  10. 每日CSS_纯CSS制作进度条