一、TCP握手流程

二、为什么不是4次握手

TCP的每次请求都是成对的,原则上应该是四次

  1. 【Client to Server】第一次SYN,seq=x
  2. 【Server to Client】第二次ACK,seq=y,ack=x+1(没有携带数据的ACK不消耗序列号)
  3. 【Server to Client】第三次SYN,seq=y,
  4. 【Client to Server】第四次ACK,seq=x+1,ack=y+1.

可以看出第二次和第三次都是Server to Client,且他们之间没有任何事件发生,所以可以合并,不是四次的原因是2,3步骤合并,增加效率。

三、为什么需要握手(为什么需要三《”四“》次握手)

要回答为什么先看看什么是TCP链接。ref RFC 793 - Transmission Control Protocol

    The reliability and flow control mechanisms described above requirezthat TCPs initialize and maintain certain status information foreach data stream.  The combination of this information, includingsockets, sequence numbers, and window sizes, is called a connection.Each connection is uniquely specified by a pair of socketsidentifying its two sides.

为了保证可靠性传输,TCP需要两边维护socket,序列号,和窗口大小(流量控制用),握手就是为了在数据开始传输前让客户端和服务器准确无误的交换上述信息。

需要握手的原因:

  1. 阻止已经失效的历史请求的初始化【谢希仁】
  2. 只有通过三次握手才能交换序列号

3.1 阻止已经失效的历史请求的初始化

ref:RFC 793 - Transmission Control Protocol

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

假如只有两次握手

假如服务端在ack以后就建立了链接,当有延迟的数据在链接关闭后到达服务端,

  • 服务端不知道这是旧链接,直接建立返回ack,且建立了链接。
  • 因为上一次链接已经关闭,客户端不认识这个ack,直接丢弃。

这样会导致服务端资源被这种失效的链接给浪费。

3.2 只有通过三次握手才能交换序列号

序列号是可靠性传输的根本,通过序列号,接收方可以去重,可以保证TCP流按照顺序最终被接受。

初始序列号是随机生成的(为了安全),所以在链接建立之初需要双方通过SYN来告知对方自己的初始序列号。

同时每一个发出去的序列号,都需要一个接收方的ACK,来告诉发送方:我已经收到了--可靠性保证

所以两次握手不行:服务端的SYN,没有办法ACK。

由于第二次和第三次可以合并,所以最终把逻辑上的四次握手变成了三次。

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

  1. 计网 - 传输层协议 TCP:TCP 为什么握手是 3 次、挥手是 4 次?

    文章目录 Pre TCP 协议 主机到主机(Host-To-Host) 什么是连接和会话? 双工/单工问题 什么是可靠性? TCP 的握手和挥手 TCP 协议的基本操作 建立连接的过程(3次握手) 断 ...

  2. TCP协议-握手与挥手

    认识TCP协议 TCP全称为"传输控制协议",这是传输层的一个协议,对数据的传输进行一个详细的控制.  特点: 面向字节流 安全可靠 面向连接 TCP协议段格式 源端口号与目的端口 ...

  3. [转]netstat 输出内容详解,TCP链接握手对应state

    1.列出所有 tcp与udp 端口 2下面分析每一项的含义 2.1 关于Proto,Recv-Q,Send-Q等列的具体含义 Proto:协议名(tcp协议还是udp协议) recv-Q:网络接收队列 ...

  4. Lpms-B2 IMU数据采源码分析 及 TCP/IP握手简单分析

    数据采集代码 源码的数据采集程序,可见第38行其中使用了pollData和update进行数据采集. void LpmsSensorManager::run(void) {MicroMeasure m ...

  5. TCP协议 握手与挥手

    应用层协议目的是了解指定协议的实现便于我们以后使用 传输层:负责应用程序之间的数据传输-TCP/UDP 了解协议的实现,体会协议的特性,理解对于上层程序编程的影响 UDP: 协议实现: 16源端-对端 ...

  6. linux tcp 无法握手,linux網絡編程之tcp的三次握手和四次揮手

    一 .tcp協議的通信 tcp的通信過程分為三個步驟:建立TCP連接通道,傳輸數據,斷開TCP連接通道 下圖為tcp的通信過程示意圖: 建立tcp連接通道:三次握手 斷開tcp連接通道:四次揮手 二. ...

  7. TCP连接握手为什么3次?断开为什么是4次?TCP的优化-SCTP协议

    TCP TCP(Transmission Control Protocol)传输控制协议,是一种面向连接的.可靠的.基于字节流的传输层通信协议. 目录: TCP报头 TCP的三次握手 TCP为什么要进 ...

  8. TCP协议握手过程,以及为什么握手,不握手又会怎么样?

    1. 为什么要用三次握手 在<计算机网络>一书中其中有提到,三次握手的目的是"为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误",这种情况是:一端(cli ...

  9. java网络篇-tcp的握手和挥手!

    package com.wql.test; public class Test6 { public static void main(String[] args) { test1(ErrorType. ...

最新文章

  1. 是时候取消Scrum的产品负责人角色了吗?
  2. bp神经网络代码_机器学习(周志华)课后习题——第五章——神经网络
  3. php 进制 小数,小数进制转换
  4. vue+node实现中间层同步调用接口
  5. 【C语言进阶深度学习记录】二十八 数组指针与指针数组的分析
  6. 微信小程序页面栈_微信小程序使用页面栈改变上一页面的数据
  7. ★LeetCode(784)——字母大小写全排列(JavaScript)
  8. Java集合(List Map)
  9. Bailian2998 日志排序【排序】
  10. 如何在WP模拟器中启动、暂停、重启应用
  11. 发送 HTML 形式的邮件
  12. esxi能直通的显卡型号_显卡参数看不懂?手把手教你选独立显卡
  13. 三星android应用商店,三星应用商店(Galaxy Apps)
  14. 阿里巴巴 开源软件列表
  15. Scheme:点对(dotted pair,或pair)
  16. LLM系列 | 01: 亲测ChatGPT最强竞品Claude,且无需翻墙、注册简单、免手机号
  17. 由Sensor光谱响应曲线联想到的白平衡增益计算
  18. 统一诊断服务(UDS)- 安全等级是怎么回事儿
  19. 基于TextRank的抽取式文本摘要(英文)
  20. thinkphp6.0模型篇之关联预载入

热门文章

  1. Android特别的数据结构(一) SparseArray源码解析
  2. 使用python 520表白吧(转)
  3. 简单解释Ablation Study
  4. 祥云杯misc writeup
  5. day03AndDay04
  6. 小学生最爱的计算题生成器
  7. 【数学期望】期望dp
  8. GeoHash算法的原理及实现
  9. MAC电脑安全性与隐私中“任何来源”选项消失
  10. iOSAPP class-dump反编译图文详解