TCP协议中的几个核心特性

news2024/11/25 21:36:08

目录

引言

TCP协议

🍑TCP 与 UDP 的 区别

🍑TCP客户端和服务器建立连接的三次握手

 🍑TCP客户端和服务器断开连接的四次挥手

🍑滑动窗口 

🍑流量控制

🍑拥塞控制 


引言

还记得那个经典的图吗?

 今天我们要说的就是其中著名的TCP/IP协议。

TCP协议

🍑TCP 与 UDP 的 区别

有连接与无连接 

有链接:像打电话

需要双方建立连接后才能进行通话

比如说:现在我们要打电话给某个朋友。
输入号码,按下手机拨号键。
手机开始发出 嘟嘟嘟 声音,开始等待对方接听,

而且,我们拨号之后,并不是马上就能接通的!
必须要等待 对方接听之后,我们才能与其交流。

之所以说:有连接 就像 打电话一样,是因为 打电话,必须要接通了之后,才能交流;没有接通,双方就无法交流。
有连接的意思:就是在两者确认建立联系后,就可以开始交互了。

无连接:发微信

不需要接通,直接就能发数据


发微信,我们都知道:发送信息的时候,是不需要对方在线或者回复,按下回车,立马就能加个信息发送出去,不过 对方 看没看见这条消息,我们是不确定的 。
这种情况,就叫做无连接。

TCP,就是要求双发先建立连接,连接好了,才能进行传数据。
而 UDP,直接传输数据,不需要双方建立连接。

 

 可靠传输与不可靠传输

可靠传输:发送方 知道 接收方 有没有接收到数据

🔔注意!不要理解错了。
可靠传输,不是说数据发送之后,对方100% 就能收到。

而是说我数据发送之后,发送方知道对方收没收到我发的消息

比如钉钉在你向别人发送完数据后,如果对方收到了——就会显示已读,如果没收到——就还是未读状态。

🔔这里还有个坑,这里可靠和安全可没有半毛钱关系。

安全,指的是 数据在传输过程,不容易被黑客窃取,不容易被篡改。
可靠,指的是 数据发给对方,发送方能知道接收方有没有收到数据。

 不可靠传输:发送方 不知道 接收方有没有接收到数据

 

 面向字节流和面向数据报

面向字节流:数据是以字节为单位,进行传输的。

这个就非常类似于 文件操作中的文件内容相关的操作中的字节流。
网络传输也是一样!
假设,现有100个字节的数据。
我们可以一直发完。
也可以 一次发 10个字节,发送十次。
也可以 一次发 2 个字节,发送50次。

面向数据报:以数据报为单位,进行传输

一个数据报都会明确大小。
一次 发送/接收 必须是 一个 完整的数据报。
不能是半个,也不能是一个半,必须是整数个。

在代码中,这两者的区别是非常明显的!

🍑TCP客户端和服务器建立连接的三次握手

 概述:

 

首先客户端主动向服务器发送建立连接的请求——一个SYN同步报文段,服务器收到后就对客户端的请求做出回应,发送ACK确认报文段(表示我收到你的请求了)。同时在服务器发送ACK时候,服务器也会向客户端发送建立连接的请求——SYN(双向奔赴),最后客户端再对我们刚刚服务器发送的建立连接的请求做出回应ACK。

至此,客户端与服务器就成功建立了连接,接下来就可以进行通信了。

那么三次握手具体的意义何在呢?

1、三次握手首先要保证的是当前我们直接的连接是可靠的,接下来我们双方是可以进行相关的通信的 。

就跟我们打电话似的,我们双方在进行通信前,首先要确保我们双方之间的网络是没有问题的——是能够互相听到对方的声音的。

 经过这三次握手,我们互相都知道对方的设备是没有问题的,网络也是没有问题的,我们之间是可以进行正常通信的

2、通过三次握手可以让双方协商一些必要的信息。


三次握手,就让客户端和服务器之间建立好了连接。
其实建立好连接之后,操作系统内核中,就需要使用一定的数据结构来保存连接相关的信息。

 

 🍑TCP客户端和服务器断开连接的四次挥手

那么如果我们想断开连接,就要经历四次挥手的过程。

与三次握手不同,四次挥手中,既可以是客户端主动断开连接,也可以是服务器主动断开连接。

 看到这里,你可能会觉得这个和上面的三次握手的过程好像呀!那么中间那两个的ACK响应报文段和FIN结束报文端能不能一起发送呢?就像三次握手那样

答案是:中间那两次挥手不一定能够合并!

为啥呢,如下图所示:

 再回头看看三次握手的过程

 总结:

与TCP的连接不同 ,对应TCP连接的断开来说。服务器和客户端任意一方都可以主动断开连接。

比如上面的A想要主动断开连接——A执行了socket.close方法,向B发送了一个FIN(结束报文端),B在收到后操作系统内核马上进行反馈,向A发送了一个ACK(确认报文段)。那么在向A发送ACK的同时,能不能B也给A发送一个FIN(结束报文段)呢?

这样多省事呀!抱歉,还真不一定。我们要明白我们的ACK和之前的SYN都是由操作系统内核进行处理的,所以在之前的三次握手中,内核可以安排ACK和SYN合并一下,一起发送。

但这里呢,我们的FIN(结束报文段)是在用户代码执行了socket.close方法后才会触发的,也就是说FIN什么时候触发是由用户的代码逻辑来决定的——你这里虽然收到了A传来的FIN,但是我们这里的工作还没做完(B这里还没执行到close方法)。那有什么办法,只能等呀!

那么此时B向A发送的ACK确认报文段和FIN结束报文段之间的时间间隔就可能很大——自然就没办法合并到同一个报文段里一起发送。

终于当B中的代码执行到了socket.close方法,向A发送了他的FIN终止报文段。A接收到后,操作系统内核马上做出反馈——对B刚刚发送的报文段进行确认(ACK确认报文段)

至此,A、B之间的连接就算成功的断开了。


🍑滑动窗口 

滑动窗口存在的意义就是在保证可靠性的前提下,尽量提高传输效率!!!

先来看如果不使用滑动窗口,传输是怎样进行的

 如上图所示,我们这样发送一次,收到确认后再发送一次,这样重复的操作是很费时间的。我们把大量的时间都花费在了等待ACK响应上。

于是就有了滑动窗口这样一个机制——一次发送一波数据,然后等待接收方的响应ACK(表示当前接收方已经收到了第xxx个字节的数据,你接着发送就好,窗口就进行了滑动)

上面这段话,你可能不同理解,没关系,接着往下看就好——让我们看看什么是窗口?什么是滑动?

看到这里,想必你已经对滑动窗口这个概念有了一个初步的认识,但是这里还是有些小问题。滑动窗口是提示了发送效率。但是如果出现了丢包该怎么办?

丢包分为两种情况

第一种:ACK丢了

第二种:数据包丢了

 

 总结:

滑动窗口提高发送效率(但可能会影响数据的可靠性)

于是就有了流量控制、拥塞控制来对滑动窗口的发送速率做一个限制(让滑动窗口的大小在一个合理的范围,让他别一次发那么多数据,接收方可以来不及接收,容易造成丢包)

那么具体是怎样来限制呢?

🍑流量控制

对于流量控制——就是根据接收方的处理能力(接收缓冲区剩余空间大小)通过ACK确认报文段来告知发送方当前接收缓冲区中的剩余空间大小是多少,然后发送方就根据这个数据来不断的改变当前滑动窗口的大小。

那么问题来了,这个所谓的接收缓冲区大小是个什么东东?

那么如何让我们的发送方知道当前接收方的接收缓冲区的大小呢?

理论说完了,我我们来看一个例子 

 如上图所示:第一次收到接收方的ACK时候,此时的接收缓冲区的大小还是3000字节,然后随着发送方数据的不断发送,这个值不断的减小。终于当接收发收到了发送方的第4000个字节(下一个要接收的字节是4001的时候,此时接收缓冲区满了,发送方就会暂停发送数据.....就这样通过接收缓冲区来动态的调整发送方滑动窗口的大小。


🍑拥塞控制 

流量控制是站在接收方的角度来控制发送速率的(滑动窗口大小)的, 但是对于整体的网络传输而言,不光有发送方和接收方,还有中间各自转发设备。

既然知道了拥塞控制—— 就是从中间这一系列的转发设备来考虑,进而来限制发送方的发送速率(滑动窗口大小)的,那么他处理的具体流程是什么呢?

中间可是有很多设备的,又多又杂,不好处理呀!

总结:

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

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

相关文章

TCP最大连接数调优

文章目录1、单机最大TCP连接数1.1、如何标识一个TCP连接1.2、client最大tcp连接数1.3、server最大tcp连接数1.3.1、理论连接数1.3.2、实际连接数1.4、单台服务器支撑的最大TCP并发连接数1.4.1、进程限制句柄限制查看进程句柄数限制临时修改重启后失效的修改(不过我在…

IIC 通信协议 (二)

目录 引言 子模块设计 思路 单字节 IIC 发送模块 思路 Verilog 源码 多字节发送控制模块 思路 Verilog 源码 仿真 思路 test bench 仿真结果 参考声明 引言 本篇博文承接前文,继续做 IIC 通信协议 FPGA实现相关的内容。用Verilog 编写一个 IIC 通信控…

【折腾服务器 1】妖板 Intel N5105 + i226 主板安装 ESXi 7.0 教程

Catch Up 今年年初,开始搭建个人服务器,用的是一台 Dell 7010 SFF 主机,在上面部署了一些应用,例如:Calibre ,Blogs ,Minecraft Server 等。使用的是 frp 做的网络代理,有一台服务器…

cubeIDE开发, UART的CubeMX及HAL库实现原理及底层分析

一、UART通信协议 UART通用异步收发器(Universal Asynchronous Receiver and Transmitter)是STM32 上常用的串行通信外设,可以灵活地与外部设备进行全双工数据交换,需要注意区别: 【1】USART-通用同步异步收发器(Universal Synchronous Async…

<Linux线程互斥与死锁>——《Linux》

目录 1. Linux线程互斥 进程线程间的互斥相关背景概念 互斥量mutex 互斥量的接口 初始化互斥量 销毁互斥量 互斥量加锁和解锁 互斥量实现原理探究 可重入VS线程安全 概念 常见的线程不安全的情况 常见的线程安全的情况 常见不可重入的情况 常见可重入的情况 可重…

K. Lonely Numbers(线性筛 + 差分)

Problem - 1423K - Codeforces 在数字世界中,如果两个不同的数字有很多共同点,而且每个数字都有独特的好处,那么它们就是朋友。 更确切地说,如果gcd(a,b), agcd(a,b), bgcd(a,b)能组成一个三角形的边,那么两个不同的数…

六、应用层(四)电子邮件

目录 4.1 电子邮件系统的组成结构 4.2 简单邮件传输协议(SMTP) 4.3 电子邮件格式 4.4 多用途网际邮件扩充(MIME) 4.5 邮局协议(POP3)和因特网报文存取协议(IMAP) 4.6 基…

小黑下午第一场面试被鸽,一切遇见随缘,继续第二场的leetcode之旅:654. 最大二叉树

小黑代码 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def constructMaximumBinaryTree(self, nums: Li…

SAP UI5 应用里 FlexBox 控件的设计原理

sap.m.FlexBox 控件为 flexible box layout 构建容器。VBox 控件为垂直的框布局(vertical flexible box layout)构建容器。 VBox 是一种使用的控件,因为它只是一个定制化的 FlexBox 控件。 VBox 包含 items 聚合,从 FlexBox 继承而来。 HBox 控件为水平…

字符串函数

注意:MySQL中,字符串的位置是从1开始的。 ASCII(S) 返回字符串S中的第一个字符的ASCII码值. 与第一个字符后面的其他字符无关。 SELECTASCII(Abcdfsf) FROM DUAL;CHAR_LENGTH(s) 返回字符串s的字符数。作用与CHARACTER_LENGTH(s)相同。 SELECTCHAR_LEN…

生信基础知识

1.生物数据库分类 (1)核酸数据库(2)蛋白质数据库(3)专用数据库 核酸数据库分为一级核酸数据库和二级核酸数据库 蛋白质数据库分为一级蛋白质数据库和二级蛋白质数据库 一级蛋白质数据库又分为蛋白质序列…

【Redis】应用问题解决

一、缓存击穿 1、什么叫缓存击穿 系统中某个查询次数很多的热点key,在某个时刻过期,而此时又正好有大量并发请求查询这个key,但是缓存的重建还没有完成,这样,就会有大量请求涌向后端数据库,使得其压力骤增…

爱了,阿里P9开源分享内部Java核心开发手册(2022版)覆盖P5到P8

这个世界唯一不变的就是变化, IT圈子不外如是。计算机领域一直在改变,从基础框架到计算设备,还有几乎每天都涌现出的新技术。因此,作为一名程序开发人员,我们要通过不断的学习来提高自己的技能。 所以持续学习的脚步自…

基于C++11实现的阻塞队列(BlockQueue)

思路: 生产者消费者模型如图,多个生产者线程和多个消费者线程共享同一固定大小的缓冲区,它们的生产和消费符合以下规则: 生产者不会在缓冲区满的时候继续向缓冲区放入数据,而消费者也不会在缓冲区空的时候&#xff0c…

AQS源码解读

retrantlock: A、B、C3个线程,假设A线程lock()时候拿到了锁,state被A设置成了1。 static final class NonfairSync extends Sync {private static final long serialVersionUID 7316153563782823691L;/*** Performs lock. Try immediate b…

喜欢写笔记的博主为什么要使用猿如意?

🔥🔥🔥猿如意🔥🔥🔥 喜欢写笔记的博主为什么要使用猿如意? markdown笔记 测 评 分 享 猿如意实战测评猿如意传送门什么是猿如意?猿如意使用感受markdown笔记实战测评总结猿如意传…

数据结构---红包分配算法

红包分配算法错误解法二倍均值法JAVA实现线段切割法确定每一条子线段的长度JAVA实现问题如下: 所有人抢到的金额之和要等于红包金额,不能多也不能少。每个人至少抢到1分钱。要保证红包拆分的金额尽可能分布均衡,不要出现两极分化太严重的情况…

【C函数】函数详解

函数前言一、函数是什么二、C语言中函数的分类(一)库函数1.printf类2.strcpy类3.math类4.概念5.小知识6.总结(二)自定义函数1.概念2.函数的组成3.例子1(求出两个数中的最大值)4.例子2(交换两个整…

mac释放“其他”内存空间的解决方法

官方解释Mac设备储存空间中的“其他”数据包含这不可移除的移动资源,例如,Siri 语音、字体、词典、不可移除的日志和缓存、聚焦索引以及系统数据如钥匙串和 CloudKit 数据库、系统无法删除缓存的文件等之外,还包含了一些无法识别的文件。当“…

ROS2 基础概念 节点

ROS2 基础概念 节点1. Nodes2. 重映射3. 环境设置3.1. ROS_DOMAIN_ID3.2. ROS_LOCALHOST_ONLY1. Nodes 每个节点应负责单个模块用途(例如,一个节点用于控制车轮电机,一个用于控制激光测距仪等) 可以通过话题、服务、操作或参数向…