TCP 三次握手 四次挥手以及滑动窗口

news2025/1/20 5:52:03

TCP 三次握手

简介:

TCP 是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的 连接” ,其实是客户端和服务器的内存里保存的一份关于对方的信息,如 IP 地址、端口号等。
TCP 可以看成是一种字节流,它会处理 IP 层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在 TCP 头部
TCP 提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接。采用四次挥手来关闭一个连接
三次握手的目的是保证双方互相之间建立了连接
三次握手发生在客户端连接的时候,当调用 connect() ,底层会通过 TCP 协议进行三次握手

TCP头部结构: 

 对上图的详细介绍:

1. 16 位端口号( port number ):告知主机报文段是来自哪里(源端口)以及传给哪个上层协议或
应用程序(目的端口)的。进行 TCP 通信时,客户端通常使用系统自动选择的临时端口号。
2. 32 位序号( sequence number ):一次 TCP 通信(从 TCP 连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。假设主机 A 和主机 B 进行 TCP 通信, A 发送给 B 的第一个
TCP 报文段中,序号值被系统初始化为某个随机值 ISN Initial Sequence Number ,初始序号
值)。那么在该传输方向上(从 A B ),后续的 TCP 报文段中序号值将被系统设置成 ISN 加上
该报文段所携带数据的第一个字节在整个字节流中的偏移。例如,某个 TCP 报文段传送的数据是字节流中的第 1025 ~ 2048 字节,那么该报文段的序号值就是 ISN + 1025 。另外一个传输方向(从B 到 A )的 TCP 报文段的序号值也具有相同的含义。
3. 32 位确认号( acknowledgement number ):用作对另一方发送来的 TCP 报文段的响应。其值是收到的 TCP 报文段的序号值 + 标志位长度( SYN FIN + 数据长度 。假设主机 A 和主机 B 进行TCP 通信,那么 A 发送出的 TCP 报文段不仅携带自己的序号,而且包含对 B 发送来的 TCP 报文段的确认号。反之,B 发送出的 TCP 报文段也同样携带自己的序号和对 A 发送来的报文段的确认序号。
4. 4 位头部长度( head length ):标识该 TCP 头部有多少个 32 bit(4 字节 ) 。因为 4 位最大能表示
15 ,所以 TCP 头部最长是 60 字节。
5. 6 位标志位包含如下几项:
        (1) URG 标志,表示紧急指针(urgent pointer)是否有效。
        (2) ACK 标志,表示确认号是否有效。我们称携带 ACK 标志的 TCP 报文段为确认报文段。
        (3) PSH 标志,提示接收端应用程序应该立即从 TCP 接收缓冲区中读走数据,为接收后续数据腾出空间(如果应用程序不将接收到的数据读走,它们就会一直停留在 TCP 接收缓冲区中)。

         (4)RST 标志,表示要求对方重新建立连接。我们称携带 RST 标志的 TCP 报文段为复位报文段。

        (5) SYN 标志,表示请求建立一个连接。我们称携带 SYN 标志的 TCP 报文段为同步报文段。
       (6) FIN 标志,表示通知对方本端要关闭连接了。我们称携带 FIN 标志的 TCP 报文段为结束报文段。
        (7) 16 位窗口大小( window size ):是 TCP 流量控制的一个手段。这里说的窗口,指的是接收通告窗口(Receiver Window RWND )。它告诉对方本端的 TCP 接收缓冲区还能容纳多少
字节的数据,这样对方就可以控制发送数据的速度。
        (8) 16 位校验和( TCP checksum ):由发送端填充,接收端对 TCP 报文段执行 CRC 算法以校验TCP 报文段在传输过程中是否损坏。注意,这个校验不仅包括 TCP 头部,也包括数据部分。这也是 TCP 可靠传输的一个重要保障。
        (9) 16 位紧急指针( urgent pointer ):是一个正的偏移量。它和序号字段的值相加表示最后一 个紧急数据的下一个字节的序号。因此,确切地说,这个字段是紧急指针相对当前序号的偏
移,不妨称之为紧急偏移。 TCP 的紧急指针是发送端向接收端发送紧急数据的方法。

三次握手流程以及解释: 

下面是一张很生动形象的三次握手图: 

有人可能会觉得两次握手也可以,但是客户端和服务端都要确定自己是能发数据也能收数据的,也要确定对方是否能收发数据。这样的连接才安全可靠,所以需要三次握手。

接下来确定每次握手确定了什么:

第一次握手:客户端确定了自己有发送能力。服务端确定自己有接收能力以及客户端的发送能力。

第二次握手:客户端确定了自己有接收能力以及服务端有发送和接收(能发送消息说明第一次握手成功)能力。服务端确定自己有发送能力。这里客户端自己需要的以及服务端需要的都确定好了。

第三次握手:服务端确定了客户端有接收能力。这里服务端自己需要的以及客户端需要的都确定好了。

当然也可以将第二次握手拆成两次握手(4次握手),这样也是可以的。要保证连接的可靠至少要3次握手

注意第三次握手时发送方就可以携带一些数据了。

下方是一张时序图:

只有当ACK标记为1的时候,ack确认序号才有用。 

第一次握手:
    1.客户端将SYN标志位置为1
    2.生成一个随机的32位的序号seq=J , 这个序号后边是可以携带数据(数据的大小)

第二次握手:
    1.服务器端接收客户端的连接: ACK=1
    2.服务器会回发一个确认序号: ack=客户端的序号 + 数据长度 + SYN/FIN(按一个字节算)
    3.服务器端会向客户端发起连接请求: SYN=1
    4.服务器会生成一个随机序号:seq = K

第三次握手:
    1.客户端应答服务器的连接请求:ACK=1
    2.客户端回复收到了服务器端的数据:ack=服务端的序号 + 数据长度 + SYN/FIN(按一个字节算)

加上SYN/FIN的原因:

为了确保确认序号的准确性,包括了SYN和FIN的长度是必要的。考虑到TCP头部中标志位的长度,将它们的长度也加入确认序号的计算,可以确保在建立或关闭连接时,确认序号的值正确地表示了已经接收到的数据的范围。

序号以及确认序号:

seq = 110(3)(会随机生成)表示发送了3个字节,ack = 113。表示已经接收到了你发送的3个字节,并希望你下一次给我发送的数据的序号从113开始。这样就可以确定数据的完整性。多次发送的数据通过发送报文的序号(排列序号)来保证顺序。

漫画图:

 上图中后4次表示通信过程。

TCP 四次挥手

简介:

四次挥手发生在断开连接的时候,在程序中当调用了 close() 会使用 TCP 协议进行四次挥手。
客户端和服务器端都可以主动发起断开连接,谁先调用 close() 谁就是发起
因为在 TCP 连接的时候,采用三次握手建立的的连接是双向的,在断开的时候需要双向断开

漫画图: 

 一些细节:

为什么第二次挥手不和第三次挥手合并到一起呢?

因为当二次挥手的时候同意了对方的断开请求,但是自己还不想主动断开。因为可能还有一些数据需要处理,要等剩余的数据发送完毕才断开连接。

那么为什么三次握手的时候不分开呢?

因为建立连接是双方都愿意的事情,前面三次握手也说过三个握手也可以变为四次握手。

TCP 滑动窗口

简介:

滑动窗口(Sliding window)是一种 流量控制技术。早期的网络通信中,通信双方不会考虑网络的
拥挤情况直接发送数据。由于大家不知道网络拥塞状况, 同时发送数据,导致中间节点阻塞掉包
谁也发不了数据,所以就有了滑动窗口机制来解决此问题。滑动窗口协议是用来改善吞吐量的一种
技术,即 容许发送方在接收任何应答之前传送附加的包接收方告诉发送方在某一时刻能送多少包
(称窗口尺寸)
TCP 中采用滑动窗口来进行传输控制,滑动窗口的大小 意味着接收方还有多大的缓冲区可以用于
接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为 0
时,发送方一般不能再发送数据报。
滑动窗口是 TCP 中实现诸如 ACK 确认、流量控制、拥塞控制的承载结构。

对于窗口的理解:

窗口理解为缓冲区的大小
滑动窗口的大小会随着发送数据和接收数据而变化
通信的双方都有发送缓冲区和接收数据的缓冲区
服务器: 
        发送缓冲区(发送缓冲区的窗口)
        接收缓冲区(接收缓冲区的窗口)
客户端:
        发送缓冲区(发送缓冲区的窗口)
        接收缓冲区(接收缓冲区的窗口)
发送方的缓冲区:
    白色格子:空闲的空间
    灰色格子:数据已经被发送出去了,但是还没有被接收
    紫色格子:还没有发送出去的数据

接收方的缓冲区:
    白色格子:空闲的空间
    紫色格子:已经接收到的数据

 

上图虚线框一个是6k,向右滑动。

# mss: Maximum Segment Size(一条数据的最大的数据量)
# win: 滑动窗口
1. 客户端向服务器发起连接,客户端的滑动窗口是4096,一次发送的最大数据量是1460
2. 服务器接收连接情况,告诉客户端服务器的窗口大小是6144,一次发送的最大数据量是1024
3. 第三次握手
4. 4-9 客户端连续给服务器发送了6k的数据,每次发送1k
5. 第10次,服务器告诉客户端:发送的6k数据以及接收到,存储在缓冲区中,缓冲区数据已经处理了2k,窗
口大小是2k
6. 第11次,服务器告诉客户端:发送的6k数据以及接收到,存储在缓冲区中,缓冲区数据已经处理了4k,窗
口大小是4k
7. 第12次,客户端给服务器发送了1k的数据
8. 第13次,第一次挥手,客户端主动请求和服务器断开连接,并且给服务器发送了1k的数据
9. 第14次,第二次挥手,服务器回复ACK 8194, a:同意断开连接的请求 b:告诉客户端已经接受到方才发的2k的数据
c:滑动窗口2k
10.第15、16次,通知客户端滑动窗口的大小
11.第17次,第三次挥手,服务器端给客户端发送FIN,请求断开连接
12.第18次,第四次挥手,客户端同意了服务器端的断开请求

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CDSP认证:引领数据安全领域的权威之巅!

随着数据安全法和个人信息保护的施行,数据安全领域越来越受到重视。市场上涌现出众多数据安全相关的证书,而数据安全相关职位也成为了2023年最热门的职业之一。 💡对于想要入门数据安全领域的小伙伴,我强烈推荐CDSP认证&#xff0…

【笔试常见编程题02】字符串中找出连续最长的数字串、数组中出现次数超过一半的数字、计算糖果、进制转换

1. 字符串中找出连续最长的数字串 读入一个字符串str,输出字符串str中的连续最长的数字串 输入描述 个测试输入包含1个测试用例,一个字符串str,长度不超过255。 输出描述 在一行内输出str中里连续最长的数字串。 示例 1 输入 abcd12345ed125s…

【前端】尚硅谷Node.js零基础视频教程笔记

文章目录 1.基础1.1. 基础命令1.2. 注意事项 2. Buffer(缓冲器)介绍与创建2.1 概念2.2 特点2.3 使用 3. fs模块(file system)3.1 文件写入3.2 文件读取 【前端目录贴】 参考视频: 尚硅谷Node.js零基础视频教程,nodejs新手到高手 1.基础 1.1.…

【MATLAB第92期】基于MATLAB的集成聚合多输入单输出回归预测方法(LSBoost、Bag)含自动优化超参数和特征敏感性分析功能

【MATLAB第92期】基于MATLAB的集成聚合多输入单输出回归预测方法(LSBoost、Bag)含自动优化超参数和特征敏感性分析功能 本文展示多种非常用多输入单输出回归预测模型效果。 注:每次运行数据训练集测试集为随机,故对比不严谨&…

搜维尔科技:【简报】元宇宙数字人赛道,《救食有道》!

在这个快速发展的数位时代里,本组相信透过制作融合虚拟人物 与 AI 智慧的创新宣传影片,定能为食物银行提高曝光率并让更多人 投身参与并落实减少食物浪费的行动,并与本组共同在生活中宣传食 物银行的理念 学校: 桃园市立中场商业高…

BTC的数据结构Merkle Tree和Hash pointer

比特币是一种基于区块链技术的加密数字货币,其底层数据结构被设计为分布式,去中心化的。它的核心数据结构是一个链式的区块,每个区块都包含了多笔交易记录和一个散列值。 比特币的底层数据结构使用了两个关键概念:hash pointer和…

【计算机网络】IP协议及动态路由算法

对应代码包传送门 IP协议及动态路由算法代码包及思科模拟器资料说明 相关文章 【计算机网络】中小型校园网构建与配置 【计算机网络】Socket通信编程与传输协议分析 【计算机网络】网络应用通信基本原理 目的: 1、掌握IP协议,IP分片,DH…

JCEF学习

JCEF重要概念 CEF CEF,全称Chromium Embedded Framework ,它是基于Google Chromium的开源项目,它的目标是能够向第三方程序添加WEB浏览器功能,以及可以使用HTML、CSS和JS渲染界面。 CEF框架是由Marshall Greenblatt 在 2008 年创…

vue项目如何实现运行完项目就跳转到浏览器

在package.json中的启动命令中添加--open参数可以实现在Vue项目编译后自动打开浏览器的功能。 通过这样的设置,在运行npm run dev时,Vue项目编译完成后会自动打开默认浏览器并加载应用程序。

【问题解决】java-word转pdf踩坑

问题情境: 项目中采用word转pdf,最开始使用的pdf相关的apache的pdfbox和itextpdf,后面发现对于有图片背景的word转pdf的情景,word中的背景图会直接占用位置,导致正文不会正确落在背景图上。 解决方案: 采…

计算机网络——虚拟局域网+交换机基本配置实验

1.实验题目 虚拟局域网交换机基本配置实验 2.实验目的 1.了解交换机的作用 2.熟悉交换机的基本配置方法 3.熟悉Packet Tracer 7.0交换机模拟软件的使用 4.掌握在交换机上划分局域网,并且使用局域网与端口连接,检测信号传输 3.实验任务 1.了解交换…

C 变量

目录 1. C变量 2. C变量定义 2.1 变量初始化 2.2 C中的变量声明 3. C中的左值(Lvalues)和右值(Rvalues) 1. C变量 在C语言中,变量可以根据其类型分为以下几种基本类型: 整型变量:用…

蓝桥小白赛4 乘飞机 抽屉原理 枚举

👨‍🏫 乘飞机 🐷 抽屉原理 import java.util.Scanner;public class Main {static int N 100010;static int[] a new int[N];public static void main(String[] args){Scanner sc new Scanner(System.in);int n sc.nextInt();int q s…

(南京观海微电子)——OLED驱动与调试

一、OLED DDIC分类 OLED DDIC的技术方向可以分为3类:带Ram【内存】的IC、Ram-less IC和TDDI【显示&触控集成的IC】 1、带Ram的OLED DDIC OLED DDIC有两个Ram,分别是Demura Ram和Display Ram。 1、带Ram的OLED DDIC 1-1)Demura Ram&a…

取消Vscode在输入符号时自动补全

取消Vscode在输入符号时自动补全 取消Vscode在输入符号时自动补全问题演示解决方法 取消Vscode在输入符号时自动补全 问题演示 在此状态下输入/会直接自动补全, 如下图 笔者想要达到的效果为可以正常输入/而不进行补全, 如下图 解决方法 在设置->文本编辑器->建议, 取消…

C语言第十一弹---函数(下)

​ ✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 函数 1、嵌套调用和链式访问 1.1、嵌套调用 1.2、链式访问 2、函数的声明和定义 2.1、单个文件 2.2、多个文件 2.3、static 和 extern 2.3.1、static…

STM32+ESP8266 实现物联网设备节点

目录 一、硬件准备 二、编译环境 三、源代码地址 四、说明 五、测试方法 六、所有测试工具和文档 本项目使用stm32F103ZEesp8266实现一个物联网的通信节点,目前支持的协议有mqtt,tcp。后续会持续更新,增加JSON,传感器&#…

MySQL 聚集与非聚集索引

文章目录 1.聚集索引1.1 介绍1.2 优点1.3 缺点 2.非聚集索引3.区别参考文献 MySQL 中,根据索引树叶结点存放数据行还是数据行的地址,可以将索引分为两类: 存放数据行:聚集索引存放数据行地址:非聚集索引 InnoDB 使用聚…

VSCode 1.85.0更新的3个实用功能

1、单个文件可直接拖拽为独立窗口 当单文件过长,直接分成两个视图就不用上下频繁滚动 2、将终端移动到编辑器区域 此时,终端也可像文件一样拖拽为独立窗口 3、文件夹目录粘性头部 默认关闭,需要设置 "workbench.tree.enableStickyScro…

【Linux】编写第一个小程序:进度条

文章目录 1. 预备知识1.1 简单认识几个函数1.1.1 sleep()1.1.2 fflush()1.1.3 usleep()1.1.4 memset() 1.2 缓冲区1.3 回车与换行 2. 编写入门版的进度条2.1 基本逻辑2.2 美化效果2.3 代码实现2.4 执行效果 3. 编写升级版的进度条3.1 代码实现3.2 执行效果 1. 预备知识 1.1 简…