【计算机网络】TCP协议

文章目录

  • TCP协议
    • TCP的结构
    • TCP的特点
  • TCP如何保证可靠传输
    • 确认应答(可靠机制)
    • 超时重传(可靠机制)
    • 连接管理(可靠机制)
    • 滑动窗口(效率机制)
    • 流量控制(可靠机制)
    • 拥塞控制(可靠机制)
    • 延时应答(效率机制)
    • 捎带应答(效率机制)
  • 面向字节流
  • 异常处理
    • 进程崩溃
    • 主机关机(正常情况)
    • 主机掉电(非正常情况)
    • 网线断开

TCP协议

TCP的结构

在这里插入图片描述

源端口号和目的端口号就是说数据从哪里来到哪里去。

4位首部长度:TCP报头的长度是不固定的报头最短是20字节(没有选项),报头最长是60字节(选项最多是40字节)。

校验和:和UDP协议一样。

保留位:因为UDP的长度是64kb,我们无法改变,所以发明TCP的人做出了改变,加入了保留位,先占个位置,如果后面需要就可以进行扩展使用。

TCP的特点

1.有连接:发送方和接收方会保留对方的信息(如果A和B建立连接,B拒绝了,就无法建立连接,通信就无法完成)

2.可靠传输:A给B发消息,消息有没有成功送达A可以感知到(如果发送失败就可以进行采取一定的措施)

3.面向字节流:TCP的传输和文件操作一样都是以字节为单位的

4.全双工:一个通道允许双向通信就是全双工反之就是半双工(一个socket对象既可以发送数据也能接收数据)

TCP的核心就是可靠传输

TCP如何保证可靠传输

确认应答(可靠机制)

发送方把数据发送给接收方后,接收方收到数据之后就会给发送方返回一个应答报文(acknowledge 简称ack),发送方收到应答报文后就知道自己的数据发送成功了。
在这里插入图片描述

每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据,下一次你从哪里开始发。

在这里插入图片描述

如何确认一个数据包是普通数据还是ack数据呢?

上面的TCP结构图中ACK为1,就表示当前数据包是一个应答报文,此时该数据包中的确认序号字段才能生效,如果这一位为0,则表示当前数据包是一个普通报文,此时该数据包中的确认序号字段不会生效。

通过特殊的ack数据包里携带的确认序号告诉发送方哪些数据已经被收到了,此时发送方就知道自己刚刚发送的数据是否成功。TCP的初心就是可靠传输,达成可靠传输的核心机制是确认应答

超时重传(可靠机制)

A发送数据给B后,可能因为网络拥堵等原因,数据无法到达B;如果主机A在一个特定时间间隔内没有收到B发来的确认应答,就会进行重发。但是,主机A未收到B发来的确认应答,也可能是因为ACK丢失了。

确认应答是一个比较理想的情况,如果网络传输过程中,出现了丢包该怎么办?

首先我们要知道丢包的原因:

如果我们把网络想象成错综复杂的公路,在公路上就会有很多收费站,正常情况如果车流量不大,车辆都能正常通过,但是如果节假日就会发生堵车的情况,这种情况车辆就没办法正常通过。在网络中我们可以把收费站理解成 “路由器/交换机” 如果数据包太多,就会在路由器/交换机中出现 “堵车” 的情况,但是路由器/交换机针对 “堵车” 的情况是比较粗暴的,它会把数据包直接丢掉,此时这个数据包就在网络上消失了。这也就是我们所说的丢包。

丢包是一个随机事件,因此在TCP传输过程中存在两种情况:
在这里插入图片描述

无论是哪一种情况,A都会重新传输,如果丢包的概率是10%,再重传一次,两次都丢包的概率就是1%,传输成功的概率是很大的,重传操作大幅度提升了数据传输成功率。

那么发送方何时进行重传呢?

发送方,发出数据后,会等待一段时间,如果这个时间内没有收到ack就会触发重传。

初始的等待时间是可以配置的,也可以动态变化,每经历一次超时重传,下次的等待时间就会变长。但是也不是无限变长,超时重传若干次后就会触发TCP的重置连接。

如果传输的时候ack丢了,触发了超时重传,那么接收方收到了两条一样的数据这样会不会给带来bug呢?

TCP有一个接收缓冲区(一个内存空间)会保留已经收到的数据和数据的序号,接收方如果发现,当前发送方发来的数据是已经在接收缓冲区中,接收方就会直接把这个后来的的数据丢弃掉,以确保读的时候只读到一条数据。

接收缓冲区不仅可以去重,还能进行重新排序,确保发送的顺序。

连接管理(可靠机制)

连接管理:建立连接(TCP三次握手)+ 断开连接(TCP四次挥手)

TCP三次握手:TCP在连接过程中,通信双方一共需要 “打三次招呼” 才能建立连接。
在这里插入图片描述

三次握手的核心作用

1.确认当前网络是否通畅

2.让发送方和接收方都知道知道的接收能力和发送能力是否正常

3.让双方在握手过程中针对一些重要的参数进行协商

TCP四次挥手:断开连接(客户端和服务器都可以发起)
在这里插入图片描述

TCP四次挥手可以把中间的两次合二为一吗?

不一定

不能合并的原因是ack和第二个fin触发的时机不同,ack是内核响应的(B收到fin会立即返回ack),而第二个fin是应用程序的代码触发的,从服务器收到fin(同时返回ack)再到执行到发起fin的代码,这中间要经历的时间是不确定的。

TCP三次握手的ack和第二个syn都是内核触发的,同一时机,所以可以合并。

滑动窗口(效率机制)

因为TCP的可靠传输会影响传输的效率(多出了一些等待ack的时间,单位时间内能传输的数据就少了),滑动窗口就是让可靠传输对性能的影响少一些。TCP只要引入了可靠性,传输的效率是不可能超过没有可靠性的UDP的。TCP这里的效率机制是为了缩短和UDP之间的差距。

那么TCP是如何提升效率的呢?
在这里插入图片描述

窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。上图的窗口大小就是4000个字节(四个段)。发送前四个段的时候,不需要等待任何ACK,直接发送;收到第一个ACK后,滑动窗口向后移动,继续发送第五个段的数据;依次类推;操作系统内核为了维护这个滑动窗口,需要开辟 发送缓冲区 来记录当前还有哪些数据没有应答;只有确认应答过的数据,才能从缓冲区删掉;窗口越大,则网络的吞吐率就越高。

在这里插入图片描述

如果传输过程中出现丢包怎么办呢?
在这里插入图片描述

如果通信双方传输的数据量比较小,也不频繁,就任然是普通的确认应答和超时重传,如果通信双方传输的数据量比较大,也比较频繁,此时就会进入滑动窗口模式,按照快速重传的方式处理。

通过滑动窗口的方式传输数据,效率会提升,窗口越大,传输效率越高(一段时间等待的ack多了,总的等待时间就少了)

但是滑动窗口并不是越大越好,如果传输速度太快,接收方就可能会处理不过来,进而接收方就会出现丢包,TCP的前提是可靠传输,在可靠性的基础上再提高传输效率。

流量控制(可靠机制)

接收方处理数据的速度是有限的。如果发送方发的太快导致接收方的缓冲区占满,这个时候如果发送方继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应。站在接收方的角度,反向制约发送方的发送速度。(发送方的发送速度不应该超过接收方的处理能力)TCP支持根据接收方的处理能力,来决定发送方的发送速度,这个机制就叫做流量控制

在这里插入图片描述

拥塞控制(可靠机制)

虽然TCP有了滑动窗口这个大杀器,能够高效可靠的发送大量的数据。但是如果在刚开始阶段就发送大量的数据,仍然可能引发问题。因为网络上有很多的计算机,可能当前的网络状态就已经比较拥堵。在不清楚当前网络状态下,贸然发送大量的数据,是很有可能引起雪上加霜的。TCP引入 慢启动 机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据。

流量控制是考虑接收方的处理能力,拥塞控制是考虑通信过程中中间节点的情况。

由于中间节点结构复杂难以进行量化,所以我们可以使用 “ 实验” 来找到一个合适的值。

比如,先让A按照比较低的速度先发送数据,如果传输顺利没有丢包,就再尝试更大的窗口大小来发送数据,随着窗口的大小增大,达到一定程度,中间节点可能会出现问题,此时这个节点就可能会出现丢包,,A发现丢包了,就会重新调整窗口大小,如果发现还是丢包,就会继续缩小窗口大小,如果不丢包就尝试增大窗口大小。在这个过程中,发送方不停的调整窗口大小,逐渐达到“动态平衡” 这种做法,相当于是把中间节点都视为“整体” 通过实验的方式找到中间节点的瓶颈。

在这里插入图片描述

少量的丢包,我们仅仅是触发超时重传。大量的丢包,我们就认为网络拥塞。当TCP通信开始后,网络吞吐量会逐渐上升。随着网络发生拥堵,吞吐量会立刻下降。拥塞控制,归根结底是TCP协议想尽可能快的把数据传输给对方,但是又要避免给网络造成太大压力的折中方案。

延时应答(效率机制)

A把数据传输给B,B就会立即返回ACK给A(正常情况)

A把数据传输给B,B不会立即返回ACK给A(延时应答)

延时应答本质上是为了提升传输效率,发送方的窗口大小就是传输效率的关键,流量控制是根据接收缓冲区的剩余空间来决定发送速度的,如果有办法让流量控制的窗口大小更大,发送速度更快(前提是接收方能处理过来),延时返回ack给接收方更多的时间来读取缓冲区的数据,读取缓冲区的数据之后,缓冲区的剩余空间就更大了,返回的窗口大小就更大了,传输效率就提高了。

比如说,初始情况下,接收缓冲区剩余空间是10kb,如果立即返回ack那么返回的窗口大小是10kb,如果延时一段时间返回ack,在这个过程中读取了2kb,那么此时返回的窗口大小就是12kb。

窗口越大,网络吞吐量就越大,传输效率就越高。我们的目标是在保证网络不拥塞的情况下尽量提高传输效率。

捎带应答(效率机制)

捎带应答是在延时应答的基础上又进行了效率提升,在网络通信中往往是 “一问一答”这样的通信模式。
在这里插入图片描述

面向字节流

当同时有多个应用层数据包被传输过去的时候就有可能出现粘包问题
在这里插入图片描述

那么我们如何解决粘包问题呢?

核心思路:明确应用层数据包之间的边界,①引入分隔符 ②引入长度
在这里插入图片描述

异常处理

进程崩溃

进程没了,程序异常终止,文件描述符表也就释放了,相当于是调用了socket.close(),此时会触发FIN,对方收到之后自然就会返回FIN和ACK(正常的四次挥手断开连接)TCP的连接可以独立于进程存在(进程没来,TCP连接不一定断开)

主机关机(正常情况)

进行关机的时候,就会先触发强制终止进程操作(相当于进程崩溃)此时就会触发FIN,对方收到之后自然就会返回FIN和ACK,不仅仅是进程没了,整个系统也可能会关闭,如果在系统关闭之前对端返回的FIN和ACK到了,此时系统还是可以返回ACK的,进行正常的四次挥手,如果系统已经关闭,FIN和ACK没收到,就无法进行后续的ACK响应了,站在对端的角度,对端会以为是自己的FIN丢包了,就会重传FIN,重传几次没有响应就会放弃连接(此时会删除对端的信息)

主机掉电(非正常情况)

主机掉电是一瞬间的事情,来不及杀进程,也来不及发送FIN,主机就直接停机了,对端不一定知道这件事。

①如果对端是在发送数据(接收方掉电),发送的数据就会一直等待ACK,触发超时重传,触发TCP的重置连接功能,会发起 “复位报文段”(TCP结构中的RST)

②如果对端是在接收数据(发送方掉电)对端还在等待数据到达,等了很久没有消息,此时是无法区分对端是没有发送消息还是对方出问题了(挂了)此时接收方也会周期性的给对方发起一个特殊的不携带业务数据的数据包,如果对方没有应答,重复了多次后任然没有响应,此时就会视为对方挂了,就会单方面释放连接。

网线断开

网线断开和主机掉电相似。

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

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

相关文章

window系统vscode 编译wvp前端代码

下载代码 wvp-GB28181-pro: WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的网络视频平台,负责实现核心信令与设备管理后台部分,支持NAT穿透,支持海康、大华、宇视等品牌的IPC、NVR、DVR接入。支持国标级联,支持rtsp/rtmp等…

zsh和ohmyzsh安装指南+插件推荐

文章目录 1. 安装指南2. 插件配置指南3. 参考信息 1. 安装指南 1. 安装 zsh sudo apt install zsh2. 安装 Oh My Zsh 国内访问GitHub sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"这将安装 Oh My Zsh 和所…

Xrdp+Cpolar实现远程访问Linux Kali桌面

XrdpCpolar实现远程访问Linux Kali桌面 文章目录 XrdpCpolar实现远程访问Linux Kali桌面前言1. Kali 安装Xrdp2. 本地远程Kali桌面3. Kali 安装Cpolar 内网穿透4. 配置公网远程地址5. 公网远程Kali桌面连接6. 固定连接公网地址7. 固定地址连接测试 前言 Kali远程桌面的好处在于…

从傅里叶变换,到短时傅里叶变换,再到小波分析(CWT),看这一篇就够了(附MATLAB傻瓜式实现代码)

本专栏中讲了很多时频域分析的知识,不过似乎还没有讲过时频域分析是怎样引出的。 所以本篇将回归本源,讲一讲从傅里叶变换→短时傅里叶变换→小波分析的过程。 为了让大家更直观得理解算法原理和推导过程,这篇文章将主要使用图片案例。 一…

数据结构第四课 -----线性表之栈

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

C_12练习题

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) C 风格的注释,也称块注释或多行注释,以()…

软件开发、网络空间安全、人工智能三个方向的就业和前景怎么样?哪个方向更值得学习?

软件开发、网络空间安全、人工智能这三个方向都是当前及未来的热门领域,每个领域都有各自的就业前景和价值,以下是对这三个方向的分析: 1、软件开发: 就业前景:随着信息化的加速,软件开发的需求日益增长。…

SVG的viewBox、width和height释义, 示例及代码

svg的是没有边界的,svg画布只是用于展示svg世界中某一个范围的内容,而对于超过了svg画布范围的内容,则会被遮挡。默认svg画布默认显示世界坐标下原点坐标的width*height面积的矩形视野。 ​ 我们可以通过viewBox来修改默认的显示配置&#…

CAS源码工程搭建记录

CAS源码工程搭建 1.下载2.gradle下载源改为阿里云,解决下载慢的问题3.解决保存 1.下载 git clone -b 5.3.x https://gitee.com/mirrors/CAS.git如果下载的是压缩包,导入工程会保存,因为builder.gradle的第20行开始有取git信息,如…

实战提升(六)

前言:Practice makes perfect!今天实战Leetcode链表分割还有回文结构。今天的题全都来自于牛客网。 实战一: 思路:我们一这个链表为例,小于5的链表尾插到第一个链表,大于5的链表尾插到第二个链表&#xf…

React升级到18版本

前言 升级前react版本是16.9.0,react-dom版本为16.9.0,react-router-dom为5.1.2版本。 安装 // npm npm install react react-dom// yarn yarn add react react-dom// pnpm pnpm install react react-dom启动项目 此时,项目可以正常运行&…

学习.NET验证模块FluentValidation的基本用法

开源博客项目Blog .NET中使用FluentValidation验证部分对象实例的属性值,本文学习FluentValidation模块的基本用法,后续再学习Blog .NET项目FluentValidation模块的用法。   FluentValidation模块支持Linq 表达式,同时支持链式操作&#xf…

element ui修改select选择框背景色和边框色

一、修改时间输入框的背景和边框字体颜色 <div class"hright"><el-date-picker :popper-append-to-body"false" class"custom-timeselect" v-model"form.timevalue" type"daterange" range-separator"至"…

qt-C++笔记之treeWidget初次使用

qt-C笔记之treeWidget初次使用 code review! 文章目录 qt-C笔记之treeWidget初次使用1.运行2.文件结构3.main.cpp4.widget.h5.widget.cpp6.widget.ui7.main.qrc8.qt_widget_test.pro9.options.png 1.运行 2.文件结构 3.main.cpp 代码 #include "widget.h"#include…

【C++】进阶模板

非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff1a;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当成常量来使…

Android 14 Beta 1

Android 14的第一个 Beta 版&#xff0c;围绕隐私、安全、性能、开发人员生产力和用户定制等核心主题构建&#xff0c;同时继续改进平板电脑、可折叠设备等大屏幕设备的体验。我们一直在完善 Android 14 的功能和稳定性方面取得稳步进展&#xff0c;现在是时候向开发者和早期采…

论文笔记——BiFormer

Title: BiFormer: Vision Transformer with Bi-Level Routing AttentionPaper: https://arxiv.org/pdf/2303.08810.pdfCode: https://github.com/rayleizhu/BiFormer 一、前言 众所周知&#xff0c;Transformer相比于CNNs的一大核心优势便是借助自注意力机制的优势捕捉长距离…

基于STM32的外部中断(EXTI)在嵌入式系统中的应用

外部中断&#xff08;External Interrupt&#xff0c;EXTI&#xff09;是STM32嵌入式系统中常见且重要的功能之一。它允许外部事件&#xff08;例如按键按下、传感器触发等&#xff09;通过适当的引脚触发中断&#xff0c;从而应用于各种嵌入式系统中。在STM32微控制器中&#…

Vulkan渲染引擎开发教程 一、开发环境搭建

一 安装 Vulkan SDK Vulkan SDK 就是我们要搞的图形接口 首先到官网下载SDK并安装 https://vulkan.lunarg.com/sdk/home 二 安装 GLFW 窗口库 GLFW是个跨平台的小型窗口库&#xff0c;也就是显示窗口&#xff0c;图形的载体 去主页下载并安装&#xff0c;https://www.glfw.…

【自然语言处理(NLP)实战】LSTM网络实现中文文本情感分析(手把手与教学超详细)

目录 引言&#xff1a; 1.所有文件展示&#xff1a; 1.中文停用词数据&#xff08;hit_stopwords.txt)来源于&#xff1a; 2.其中data数据集为chinese_text_cnn-master.zip提取出的文件。点击链接进入github&#xff0c;点击Code、Download ZIP即可下载。 2.安装依赖库&am…