知识总结 1

news2024/11/28 15:55:32

传输层重点协议----TCP

    • 1、TCP
      • ① TCP协议段格式
      • ② TCP原理
        • Ⅰ 确认应答机制(可靠性)
        • Ⅱ 超时重传机制(可靠性)
        • Ⅲ 连接管理机制(可靠性)
        • Ⅳ 滑动窗口机制(效率)
        • Ⅴ 流量控制机制(可靠性)
        • Ⅵ 拥塞控制机制(可靠性)
        • Ⅶ 延迟应答机制(效率)
        • Ⅷ 捎带应答机制(效率)
        • Ⅸ 面向字节流
        • Ⅹ 粘包问题
      • ③ TCP异常情况
        • Ⅰ 主机关机(按照固定程序关机)
        • Ⅱ 程序崩溃
        • Ⅲ 主机掉电(突然拔电源)
        • Ⅳ 网线断开
      • ④ TCP小结
      • ⑤ 基于TCP的应用层协议

1、TCP

TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。

① TCP协议段格式

在这里插入图片描述

  • 源/目的端口号:表示数据是从哪个进程来,到哪个进程去;
  • 32位序号/32位确认号:给发送个每一个数据都进行编号;如果当前报文是普通报文,则确认序号不生效
  • 4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最大长度是 15 * 4 = 60
  • 6位标志位:
    • URG:紧急指针是否有效
    • ACK:确认号是否有效(是否为应答报文)
    • PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
    • RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段
    • SYN:请求建立连接;我们把携带SYN标识的称为同步报文段
    • FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段
  • 16位窗口大小:后面再说
  • 16位校验和:发送端填充,CRC校验。接收端校验不通过,则认为数据有问题。此处的检验和不光包含TCP首部,也包含TCP数据部分。
  • 16位紧急指针:标识哪部分数据是紧急数据;
  • 40字节头部选项:暂时忽略;

② TCP原理

TCP对数据传输提供的管控机制,主要体现在两个方面:可靠和效率。
这些机制和多线程的设计原则类似:保证数据传输可靠的前提下,尽可能的提高传输效率。

Ⅰ 确认应答机制(可靠性)

在这里插入图片描述

一口气发了 1000 个字节的数据(一个 TCP 数据报,长度是 1000,序号是 1)
应答报文中的确认序号,就是 1001.
应答报文:可视为只有 TCP 报头,没有载荷.
意思就是 < 1001 的数据,B 已经收到了;接下来 A 要从 1001 开始往后发送!!!
Ⅱ 超时重传机制(可靠性)

在确认应答的情况下,如果没有收到 ACK,就需要通过其他途径来处理!
超时重传:不是说没有收到 ACK,立即就放弃,就需要重新再发一遍!
网络的环境是非常复杂的,尤其是有些时候,网络会拥堵,拥堵就可能会导致丢包
丢包,是 “无差别” 丢的。任何一个数据报,都有可能会丢包!
普通报文 可能丢失,ACK 也可能丢失!
业务数据丢失
发送方等待一定的时间之后,没有收到 ACK 就会重传!
ACK 丢失
业务数据已经到了 主机 B 了,反馈的 ACK 没有回过去,发送方等待一会之后,就触发了重传!

  • 对于 发送方 来说,无法区分是 业务数据丢失,还是 ACK 丢失。因此 发送方 能做的只是,达到一定时间之后,就重传!
  • 对于 接收方 来说,会根据序号,来进行数据去重。接收方 知道自己都收到了哪些数据,当发现又收到了一份之前的数据就会自动丢弃,保证应用层读到的数据是不重复的!

假设第一次重传失败了,进行第二次重传,又失败了;
第一次丢包超时时间为 t1,第二次丢包超时时间为 t2,此时一定:t1 < t2
丢包超时等待的时间间隔,随着丢包此时的增加,越来越大!

Ⅲ 连接管理机制(可靠性)

确认应答超时重传 可以认为是保证 TCP 可靠性的 最核心机制!
但是 连接管理 是面试中最高频的问题(网络知识)!

在正常情况下,TCP 要经过 三次握手 建立连接,四次挥手 断开连接!

三次握手:必须是客户端主动,服务器被动

三次握手的意义:(三次握手,认为是一种保证可靠性的机制)

  • 这个东西相当于 “投石问路”,在正式通信之前,先确定好通信链路是否畅通!
    如果通信链路不畅通,后续大概率要丢包!
  • 能够让通信双方协商一些重要的参数!(比如:序号是从几开始的;MSS 等等)

四次挥手:客户端和服务器都可以主动

与 三次握手 不同,四次挥手 看起来也是双方各自给对方发送 FIN,各自给对方发送 ACK。
但是,四次挥手 这里的 中间两次,不能合并!

TCP 的状态:

  • LISTEN :(服务器的状态)服务器已经启动完毕,已经绑定端口成功!
    例如:手机开机完毕,信号良好(随时有人给他打电话)
  • ESTABLISHED:连接建立好了,可以进行后续通信!
    例如:打电话号码拨通,对方已经接听,接下来就可以随时说话了
  • CLOSE_WAIT:(被动接受 FIN 的一方,进入 CLOSE_WAIT)这个状态就是自己收到了 FIN 也返回了 ACK,在自己发送 FIN 之前,处于的状态。(等待代码调用 close 方法,发送 FIN)
  • TIME_WAIT:(主动发起 FIN 的一方,会进入 TIME_WAIT)主动的一方,收到对方的 FIN,并返回 ACK 之后,就会进入这个状态,而不是直接进入 CLOSED 状态,在 TIME_WAIT 状态下停留一段时间,才会进入 CLOSED 彻底释放连接。
    (防止最后一个 ACK 丢失,万一最后一个 ACK 丢失,在 TIME_WAIT 状态下,还可以重传)
Ⅳ 滑动窗口机制(效率)

我们要清楚一点可靠性效率是冲突的保证 可靠性 肯定会影响到 效率 的。
TCP 在保证 可靠性 的前提下,尽可能的提高 效率。

滑动窗口机制的本质就是把等待 ACK 的时间重叠起来。
减少等待时间,就相当于提高了效率。

每次传输,都需要等待 ACK,收到 ACK 再发下一题数据,这样效率就很低。
我们一次发送多条数据,就可以大大的提高性能(其实是将多个段的等待时间重叠在一起了)。

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

对于超时重传丢包,这里分两种情况讨论。

  • 情况一:ACK 丢失
    这种情况下,部分 ACK 丢了并不要紧,因为可以通过后续的 ACK 进行确认;

  • 情况二:数据包丢失
    主机 A 发了半天之后,看到了连续的好几个 1001,它就明白了,是 1001 这个数据丢了!
    接下来,A 就会重传 1001 这个数据了。
    此处的原则是:哪条丢了,就重传哪条;已经传输到的数据,不必重复传输!

Ⅴ 流量控制机制(可靠性)

滑动窗口,窗口大小越大,发送速率就越快!流量控制,就是在针对发送速率进行制约!

接收端处理数据的速度是有限的。如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应,反而还降低了速率。

流量控制,就是通过 接收缓冲区 剩余空间大小,来作为下一次发送时候的窗口大小。

Ⅵ 拥塞控制机制(可靠性)

流量控制,站在接收方的角度,来控制发送速率;
但是整体的传输,其实不光有发送方和接收方,还有中间的一系列用来转发的设备。

拥塞控制,采取的方法:做实验。

通过实验的方式,找出一个合适的窗口大小。

刚开始按照小的窗口来发送。
如果不丢包,说明网络中间环境 比较畅通,就可以逐渐放大发送窗口的大小。
放大到一定程度,速率已经比较快,网络上就容易出现拥堵,进一步出现丢包;当发送方发现丢包之后,就减小发送的窗口。
反复在 2 和 3 之间循环!
这个过程,就达到了一个 “动态平衡”,发送速率不慢,接近了能承载的极限,同时还可以尽量少丢包,还能适应网络环境的动态变化。

流量控制 和 拥塞控制 都能影响发送方的滑动窗口大小!最终的滑动窗口大小,就取决于两者的较小值。

像上面这样的拥塞窗口增长速度,是指数级别的。“慢启动” 只是指初使时慢,但是增长速度非常快。

为了不增长的那么快,因此不能使拥塞窗口单纯的加倍。
此处引入一个叫做慢启动的阈值
当拥塞窗口超过这个阈值的时候,不再按照指数方式增长,而是按照线性方式增长

拥塞控制,归根结底是TCP协议想尽可能快的把数据传输给对方,但是又要避免给网络造成太大压力的折中方案。

Ⅶ 延迟应答机制(效率)

延时应答也是一个用来 提高效率的机制。
延时应答,则是让窗口能够大一些。

在流量控制中,通过 ACK 告知发送方,窗口大小是多少合适,这里的窗口大小是由接收缓冲区的空余空间来决定的。

如果立即返回 ACK,可能接收端缓冲区空余空间为 5KB;
稍等一会(例如 500 ms),在这个过程中,应用程序不断的取走数据,接收端缓冲区空余空间可能为 100 KB 了。
Ⅷ 捎带应答机制(效率)

正常来说,ACK 是收到请求之后,内核立即返回的;而响应数据,则是应用程序代码,发送的。二者是不同的时机,就不能把 ACK 和 响应报文 合并。

但是基于延时应答等的基础上,延时一会,就可能和返回 响应数据,时间上重合了。
响应在收到请求之后,多长时间之内返回?不确定:

  • 可能快:本来也要发送 数据报文,ACK 就搭个顺风车;
  • 可能慢:ACK 就先走了。
Ⅸ 面向字节流

面向字节流,指的是读写载荷数据的时候,是按照 “字节流” 的方式来读取的。
TCP 数据报,本身仍然是 一个一个 “数据报” 这样的方式来传输的。
(应用程序,是感受不到从哪里到哪里是一个数据报的)

传输数据的时候,数据会先写入 接收缓冲区,应用程序直接从 接收缓冲区 取数据。
此时,应用程序在读取数据的时候,就可以灵活的进行了,可以一次读 M 个字节,分 N 次读。

Ⅹ 粘包问题

如果一个 TCP 连接,里边只传一个 应用层数据包,这个时候不会粘包(短链接)。
如果一个 TCP 连接,传输多个应用层数据包,这个时候就容易分不清,从哪到哪是一个完整了应用层数据(长连接)。这就是粘包问题。

不仅仅是 TCP ,只要是面向字节流的传输,都有粘包问题(文件传输)。

粘包问题的解决方案:在应用程序代码中,明确包之间的边界!

  • 使用分隔符
  • 约定长度

③ TCP异常情况

Ⅰ 主机关机(按照固定程序关机)
按照程序关机,会先杀死所有的用户进程(也就包括我们自己写的 TCP 程序)
杀死进程 => 释放进程 PCB => 释放文件描述符表上对应的文件资源(相当于调用 close)
这个时候就会出发 FIN,开启 四次挥手 的流程!

如果四次挥手挥完了,就继续关机;
如果还没有挥完,就已经关机了,对端重传 FIN 若干次,没有响应,就放弃了。
Ⅱ 程序崩溃
同上,程序是正常关闭,还是异常崩溃,都会释放 PCB,都会释放文件描述符表(相当于调用 close)
也还是会正常 四次挥手(虽然进程没了,但是本身 TCP 连接也是内核负责,内核仍然会继续完成后续的挥手过程)
Ⅲ 主机掉电(突然拔电源)

笔记本还好(内置电源),如果是台式机之类的,直接没了,肯定来不及挥手。

  • 接收方掉电:对方尝试发送数据,发现没有 ACK,尝试重传,重传几次,仍然没有 ACK,发送方尝试重新建立连接。如果重新建立也不成,认为是当前网络上出现了严重问题,就自然放弃了。
  • 发送方掉电:接收方就在等待发送方发的数据,由于发送方没了,这个数据显然发不过来了,接收方 也不知道是 发送方 没有发,还是 发送方 出现异常了(接收方区分不了)。
Ⅳ 网线断开

④ TCP小结

可靠性:

  • 校验和
  • 序列号(按序到达)
  • 确认应答
  • 超时重发
  • 连接管理
  • 流量控制
  • 拥塞控制

提高性能:

  • 滑动窗口
  • 快速重传
  • 延迟应答
  • 捎带应答

其他:

  • 定时器(超时重传定时器,保活定时器,TIME_WAIT定时器等)

⑤ 基于TCP的应用层协议

  • HTTP
  • HTTPS
  • SSH
  • Telnet
  • FTP
  • SMTP
    当然,也包括你自己写TCP程序时自定义的应用层协议;

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

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

相关文章

内存函数的介绍和模拟实现

目录 1.memcpy的使用(内存拷贝) 2.memcpy的实现 3.memmove的使用&#xff08;内存拷贝&#xff09; 4.memmove的实现 5.memset 的使用&#xff08;内存设置&#xff09; 6.memcmp的使用&#xff08;内存比较&#xff09; 1.memcpy的使用(内存拷贝) void * memcpy ( void * …

【C++】C++11------线程库

目录 线程库接口线程接口使用lock_guard与unique_lockmutex(互斥锁)lock_guardunique_lock 原子性操作库条件变量(condition_variable) 线程库接口 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如windows和linux下各有自己的接口&#x…

PMSM——转子位置估算基于QPLL

文章目录 前言仿真模型观测器速度观测位置观测转矩波形电流波形 前言 今后是电机控制方向的研究生的啦&#xff0c;期待有同行互相交流。 仿真模型 观测器 速度观测 位置观测 转矩波形 电流波形

Fake Maxpooling 二维滑动窗口

先对每一行求一遍滑动窗口&#xff0c;列数变为(列数-k1) 再对每一列求一遍滑动窗口&#xff0c;行数变为(行数-k1) 剩下的就是每一个窗口里的最大值啦 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing nam…

【图论C++】链式前向星(图(树)的存储)

/*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * * brief 一直在竞赛算法学习的路上* * copyright 2023.9* COPYRIGHT 原创技术笔记&#xff1a;转载需获得博主本人…

idea debug 重启弹窗提示窗口询问是否关闭运行着的服务器

目录 方法121版本的IDEA idea重新启动服务器时会有一个提示窗口询问是否关闭运行着的服务器&#xff0c;&#xff0c;这个窗口不小心点了不再提示.重新打开弹窗方法 方法1 idea编辑器由于勾选了不再提示选项导致的弹窗无法继续弹出&#xff1a;解决方案 1.打开项目没提示&…

Rust 使用Cargo

Rust 使用技巧 Rust 使用crates 假设你正在编写一个 Rust 程序&#xff0c;要使用一个名为 rand 的第三方库来生成随机数。首先&#xff0c;你需要在 Cargo.toml 文件中添加以下依赖项&#xff1a; toml [dependencies] rand "0.7.3" 然后运行 cargo build&…

Mybatis 二级缓存(使用Ehcache作为二级缓存)

上一篇我们介绍了mybatis中二级缓存的使用&#xff0c;本篇我们在此基础上介绍Mybatis中如何使用Ehcache作为二级缓存。 如果您对mybatis中二级缓存的使用不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; Mybatis 二级缓存https://blog.c…

VisionTransformer(ViT)详细架构图

这是原版的架构图&#xff0c;少了很多东西。 这是我根据源码总结出来的详细版 有几点需要说明的&#xff0c;看架构图能看懂就不用看注释了。 &#xff08;1&#xff09;输入图片必须是 224x224x3 的&#xff0c;如果不是就把它缩放到这个尺寸。 &#xff08;2&#xff09;T…

文本嵌入层

1、代码演示 embedding nn.Embedding(10,3) print(embedding) input torch.LongTensor([[1,2,3,4],[4,3,2,9]]) embedding(input) 2、构建Embeddings类来实现文本嵌入层 # 构建Embedding类来实现文本嵌入层 class Embeddings(nn.Module):def __init__(self,d_model,vocab):…

uboot启动流程-涉及_main汇编函数

一. uboot启动流程涉及函数 本文简单分析一下 save_boot_params_ret调用的函数&#xff1a;_main汇编函数。 本文继之前文章的学习&#xff0c;地址如下&#xff1a; uboot启动流程-涉及s_init汇编函数_凌肖战的博客-CSDN博客 二. uboot启动流程涉及的 _main汇编函数 经过之…

微信公众号

title: “微信公众号” createTime: 2022-01-05T10:14:2008:00 updateTime: 2022-01-05T10:14:2008:00 draft: false author: “name” tags: [“杂”] categories: [“software”] description: “测试的” 公众号发布文章 文章目录 title: "微信公众号" createTim…

数据结构与算法基础-(5)---栈的应用-(1)括号匹配

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

UG\NX二次开发 通过点云生成曲面 UF_MODL_create_surf_from_cloud

文章作者:里海 来源网站:《里海NX二次开发3000例专栏》 感谢粉丝订阅 感谢 Rlgun 订阅本专栏,非常感谢。 简介 有网友想做一个通过点云生成曲面的程序,我们也试一下 效果 代码 #include "me.hpp" /*HEAD CREATE_SURF_FROM_CLOUD CCC UFUN */

小谈设计模式(6)—依赖倒转原则

小谈设计模式&#xff08;6&#xff09;—依赖倒转原则 专栏介绍专栏地址专栏介绍 依赖倒转原则核心思想关键点分析abc 优缺点分析优点降低模块间的耦合度提高代码的可扩展性便于进行单元测试 缺点增加代码的复杂性需要额外的设计和开发工作 Java代码实现示例分析 总结 专栏介绍…

python编写修改sqlmap进行_WAF绕过

WAF绕过 文章目录 WAF绕过1 waf机制了解1.1 waf防火墙识别工具1.2 WAF机制及绕过方法总结: [绕waf参考总结地址](https://www.freebuf.com/articles/web/229982.html)1.3 绕过waf&#xff08;安全狗&#xff09;方式 2 绕过分析 -替换格式3 编写py脚本绕过安全狗3.1启动编好的脚…

Bug:elementUI样式不起作用、Vue引入组件报错not found等(Vue+ElementUI问题汇总)

前端问题合集&#xff1a;VueElementUI 1. Vue引用Element-UI时&#xff0c;组件无效果解决方案 前提&#xff1a; 已经安装好elementUI依赖 //安装依赖 npm install element-ui //main.js中导入依赖并在全局中使用 import ElementUI from element-ui Vue.use(ElementUI)如果此…

VBA技术资料MF62:创建形状添加文本及设置颜色

【分享成果&#xff0c;随喜正能量】须知往生净土&#xff0c;全仗信、愿。有信、愿&#xff0c;即未得三昧、未得一心不乱&#xff0c;亦可往生。且莫只以一心不乱&#xff0c;及得念佛三昧为志事&#xff0c;不复以信、愿、净念为事。。 我给VBA的定义&#xff1a;VBA是个人…

OpenWinding PMSM 开绕组永磁同步电机零序电流抑制以及无感控制

文章目录 前言仿真模型观测器速度观测位置观测电流波形A相电流零序电流电流FFT 转矩波形 前言 记录下最近开绕组电机的学习记录。 零序电流抑制&#xff0c;120解耦调制&#xff0c;基于零序电压的转子观测 仿真模型 观测器 速度观测 位置观测 电流波形 A相电流 零序电流 电…

新手怎么做小说推文和短剧推广怎么申请授权

新手想做小说推文和短剧推广可以通过“巨量推文”进行授权 只要你懂发短视频内容&#xff0c;会一点剪辑即可通过短剧推广和小说推文来获取收入 小说推文和短剧都分为cpa和cps模式 另短剧又cpm模式收入&#xff08;按照广告点击&#xff09; cpa为拉新类&#xff0c;cps为充…