[TCP/IP]三次握手

news/2024/11/15 23:23:42/文章来源:https://www.cnblogs.com/DCFV/p/18378198

三次握手

image

TCP建立连接为什么需要三次握手

TCP作为一种可靠传输控制协议,其核心思想:既要保证数据可靠传输,又要提高传输的效率,而用三次恰恰可以满足以上两方面的需求!

TCP可靠传输的精髓:TCP连接的一方A,由操作系统动态随机选取一个32位长的序列号(Initial Sequence Number),假设A的初始序列号为1000,以该序列号为原点,对自己将要发送的每个字节的数据进行编号,1001,1002,1003…,并把自己的初始序列号ISN告诉B,让B有一个思想准备,什么样编号的数据是合法的,什么编号是非法的,比如编号900就是非法的,同时B还可以对A每一个编号的字节数据进行确认。如果A收到B确认编号为2001,则意味着字节编号为1001-2000,共1000个字节已经安全到达。

同理B也是类似的操作,假设B的初始序列号ISN为2000,以该序列号为原点,对自己将要发送的每个字节的数据进行编号,2001,2002,2003…,并把自己的初始序列号ISN告诉A,以便A可以确认B发送的每一个字节。如果B收到A确认编号为4001,则意味着字节编号为2001-4000,共2000个字节已经安全到达。

一句话概括,TCP连接握手,交换的是通信双方数据原点的序列号

A与B一方面要确认A的初始序列号,另一方面要确认B的初始序列号,如果只用两个握手,AB确认了A的初始序列号,但是B的序列号未得到A的确认。

以此核心思想我们来分析二、三、四次握手的过程。

A <-------> B

四次握手的过程:

1.1 A 发送同步信号SYN + A's Initial sequence number

1.2 B 确认收到A的同步信号,并记录 A's ISN 到本地,命名 B's ACK sequence number

1.3 B发送同步信号SYN + B's Initial sequence number

1.4 A确认收到B的同步信号,并记录 B's ISN 到本地,命名 A's ACK sequence number

很显然1.2和1.3 这两个步骤可以合并,只需要三次握手,可以提高连接的速度与效率。

二次握手的过程:

2.1 A 发送同步信号SYN + A's Initial sequence number

2.2 B发送同步信号SYN + B's Initial sequence number + B's ACK sequence number

这里有一个问题,A与B就A的初始序列号达成了一致,这里是1000。但是B无法知道A是否已经接收到自己的同步信号,如果这个同步信号丢失了,A和B就B的初始序列号将无法达成一致。

于是TCP的设计者将SYN这个同步标志位SYN设计成占用一个字节的编号(FIN标志位也是),既然是一个字节的数据,按照TCP对有数据的TCP segment 必须确认的原则,所以在这里A必须给B一个确认,以确认A已经接收到B的同步信号。

有童鞋会说,如果A发给B的确认丢了,该如何?
A会超时重传这个ACK吗?不会!TCP不会为没有数据的ACK超时重传。

那该如何是好?B如果没有收到A的ACK,会超时重传自己的SYN同步信号,一直到收到A的ACK为止。


如果发生丢包

  • 第一个包,即A发给B的SYN中途被丢,没有到达B
    A会周期性超时重传,直到收到B的确认

  • 第二个包,即B发给A的SYN+ACK中途被丢,没有到达A
    B会周期性超时重传,直到收到A的确认

  • 第三个包,即A发给B的ACK中途被丢,没有到达B
    A发完ACK,单方面认为TCP为Established状态,而B显然认为TCP为Active状态:

    • 假定此时双方都没有数据发送,B会周期性超时重传,直到收到A的确认,收到之后B的TCP 连接也为 Established状态,双向可以发包。
    • 假定此时A有数据发送,B收到A的 Data + ACK,自然会切换为established 状态,并接受A的 Data。
    • 假定B有数据发送,数据发送不了,会一直周期性超时重传SYN + ACK,直到收到A的确认才可以发送数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/786709.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

预设型 DP

预设型 DP《美好的一天》--青春学概论 한 잔 술에 취해 잠긴 목엔 沉醉于一杯酒 갈라지는 목소린 다시 带着沙哑的嗓音 두 잔 자기 전엔 기분 좋음 入睡前饮下第二杯让心情愉悦 알 수 없는 세상에 빠져 陷入不可预知的世界 세 잔 또 네 잔 술에 빠진 又沉醉于第三杯第四杯 세상…

Nginx缓存服务

Nginx缓存服务 7.1 缓存配置语法 proxy_cache 配置语法 S yntax: proxy_cache zone | off; Default: proxy_cache off; Context: http, server, location//缓存路径 Syntax: proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time…

第八周进度报告

常用API SimpleDateFormat格式化:把时间变成我们喜欢的格式 解析:把字符串表示的时间变成Date对象import java.text.SimpleDateFormat; import java.util.Date;public static void main(String[] args) throws ParseException {/*public SimpleDateFormat() //默认格式publi…

学习Java的第八周

随着24年暑假的结束,第八周的Java学习也结束了,本周主要学习了字符串,包括API简介(提供各种功能的可以直接使用的类),字符串的概述、构造实现(创建String对象的两种方式,它们的不同点)、内存分析(两种定义方式各自的内存原理)、字符串比较方法(equals和equalsIgnor…

XGBoost中正则化的9个超参数

正则化是一种强大的技术,通过防止过拟合来提高模型性能。本文将探索各种XGBoost中的正则化方法及其优势。为什么正则化在XGBoost中很重要? XGBoost是一种以其在各种机器学习任务中的效率和性能而闻名的强大算法。像任何其他复杂模型一样,它可能会过拟合,特别是在处理噪声数据或…

FPGA基础:格雷码及FIFO应用概述

1简介 反射二进制码反射二进制码(RBC),也称为反射二进制(RB)或格雷码(Gray code),得名于Frank Gray,是二进制数制的一种排列方式,使得连续两个值之间仅有一个比特(二进制位)不同。格雷码在数字电路中的应用有助于减少误差、提高系统的可靠性,并简化逻辑操作,因此…

[操作系统]访问一个逻辑地址发生了什么

当CPU想要访问一个逻辑地址的时候,我们需要做两个步骤,地址转换和内存访问 地址转换 逻辑地址是程序内部使用的地址,并非真正的物理地址。 从逻辑地址到物理地址的映射,由页表来完成,页表的内容包括,逻辑页号,物理页号,有效位,有效位表示这一页是否在内存中。 页表存放…

[Ynoi2011] 初始化

题目链接 : [Ynoi2011] 初始化 神仙trick + 卡常题,前缀后缀和根本没听过。 根号分治 + 分块。 对于修改操作,发现是跳着修改,考虑根号分治。若\(x \ge \sqrt{n}\),直接暴力更改,复杂度\(O(\sqrt{n})\)。 反之,可以将序列抽象成一堆大小为\(x\)的段,如图,\(l,r\)是查询…

windows Tauri 构建(Release)时下载 WiX等其它打包文件失败

方法 手动下载放到指定的目录 参考这幅图:注意:随着版本的更新上面的方法存在一个小问题,需要把文件夹名字改一下,WixTools改成WixTools314参考 https://github.com/tauri-apps/tauri/issues/7338

【微信小程序开发】栀子手作花花微信小程序商城开发最佳实践

本文介绍了通过uniapp技术实现了一套栀子手作在线购物商城系统。包含首页、分类、我的等常用功能入口。本文介绍了通过uniapp技术实现了一套栀子手作在线购物商城系统。包含首页、分类、我的等常用功能入口。一、功能演示 首页:包含了商品介绍,领劵中心和商品列表区域。 商品…

《Programming from the Ground Up》阅读笔记:p103-p116

《Programming from the Ground Up》学习第7天,p103-p116总结,总计14页。 一、技术总结 1.读写文件 (1)linux.s linux.s: #file name:linux.s# system call numbers(按数字大小排列,方便查看) .equ SYS_READ, 0 .equ SYS_WRITE, 1 .equ SYS_OPEN, 2 .equ SYS_CLOSE, 3 .equ …

控件与布局

1.控件的分类:主要要6大类一.布局控件:可以容纳多个控件或者嵌套其他布局控件,用于在UI上组织和排列控件。Grid、StackPanel、DockPanel等都属于此类,他们拥有共同的父类Panel二.内容控件:只能容纳一个其他控件或者布局控件作为他的内容。Window、Button等都属于此类,因为…