码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 计算机网络 | 09.[TCP篇] TCP连接的建立(三次握手)


    文章目录

    • 1. 三次握手概述
    • 2. 为什么一定要三次握手?两次握手会出什么问题?
      • 2.1. 无法确认客户端是否具备接收能力,且不知客户端是否收到server_isn
      • 2.2. 无法阻止历史连接的建立
    • 3. 若丢失了第三次握手,会怎样
      • 3.1. 客户端有发送数据
      • 3.2. 客户端没有发送数据
    • 参考资料

    1. 三次握手概述

    所谓三次握手,是指客户端和服务端在建立 TCP连接 的过程中,总共发送了三个TCP 报文。完整流程可见下图:

    三次握手完整流程

    概述:客户端向服务端发送 SYN 报文表示希望建立连接,服务端返回 ACK+SYN 报文表示收到并同样希望建立连接,最后由客户端发送 ACK 报文表示最终确认。

    2. 为什么一定要三次握手?两次握手会出什么问题?

    只有三次握手才能保证双方都具有接收和发送的能力。

    如果是四次握手,实际上的第二第三次握手是可以被合并的,因而没有必要;

    如果是两次握手,会出现问题,这也是为什么建立TCP连接必须要进行三次握手。

    由于两次握手并没有被实现过,所以两次握手可能出现的情况也随着其设定众说纷纭。我们假设两次握手的设定如下:

    • 客户端向服务端发送报文,表示希望建立连接;
    • 服务端确认后即建立连接,并 马上开始传输数据。

    2.1. 无法确认客户端是否具备接收能力,且不知客户端是否收到server_isn

    假如只有两次握手,服务端只能确认客户端的发送能力,无法确认接收能力(因为建立连接的两次握手中,客户端对服务端的报文没有回应),也就 无法确认客户端是否收到自己发过去的server_isn。

    若客户端的接收能力异常,服务端发送过去的数据无法送达,就造成了资源的浪费。

    原因二:确保双方都收到了对方的序列号

    2.2. 无法阻止历史连接的建立

    「历史连接」是指未能成功建立且已经过期的旧链接。若使用三次握手不会出现问题,如下图所示:

    原因一:避免历史连接 - 三次握手阻止历史连接

    如果采用两次握手,服务端一旦收到客户端的第一次握手报文,就立马建立连接。

    一旦先前因网络拥塞而被延后到达的第一次握手报文被服务端接收,就会建立一条「历史连接」,服务端在历史连接中发送的数据就是无效的(因为这条连接被终止了),这就造成了资源的浪费。

    两次握手与三次握手的区别

    3. 若丢失了第三次握手,会怎样

    若 第三次握手(ACK,假定seq=11) 丢失,会根据客户端建立连接后是否发送数据有不同的情况:

    3.1. 客户端有发送数据

    若客户端在建立连接后有发送数据,就会在收到此次报文的应答 RST 后 立即断开连接。

    客户端并不知道此次发送的报文已丢失,以为连接已建立,便会开始传输数据(seq=12)。而服务端由于没有收到 第三次握手(ACK,seq=11),它期待的seq=11,和收到报文的seq=12并不匹配,便会返回 RST 以断开异常连接。

    3.2. 客户端没有发送数据

    若客户端在建立连接后没有发送数据,服务端会 重传第二次握手,直到超出限制后关闭连接。

    客户端没有收到 第三次握手(ACK),就会触发超时重传机制重新发送 第二次握手(SYN+ACK),若超过重传次数依旧没有收到客户端的确认报文,服务端就会关闭这个连接。

    ​

    参考资料

    TCP 是如何工作的?三次握手和 四次挥手是什么?

    Tcp为啥三次握手,两次行不行?从理解的角度吃透它

    小林coding - TCP连接建立

  • 相关阅读:
    y115.第七章 服务网格与治理-Istio从入门到精通 -- 云原生概念(一)
    Mac端交互式原型设计 Axure RP 8 for Mac汉化
    顺丰01. 顺丰鄂州枢纽运转中心环线检测
    二维码生成器
    「iOS」UI——无限轮播图实现与UIPageControl运用
    Vue - 将页面内容下载为 pdf 格式文件(html2canvas + jspdf)
    Selector的使用
    zookeeper集群+kafka集群
    `include指令【FPGA】
    【学习笔记】集成电路发展及其设计流程(ICer必备)
  • 原文地址:https://blog.csdn.net/xyxyxyxyxyxyx/article/details/126183947
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号