TCP/IP超全笔记 - TCP篇
TCP/IP超全笔记 - TCP篇
什么是 TCP
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
- 面向连接:一对一,先连接,再传输数据
- 可靠交付:保证数据准确
- 面向字节流:把数据看成一连串的无结构字节流
网络模型
七层模型
- 应用层
- 表示层
- 会话层
- 传输层:TCP/UDP
- 网络层: IP
- 寻址和路由选择
- 路由器,防火墙,多层交换机
- 数据链路层
- 关注数据的传输和流控制、差错检测和纠正等逻辑控制功能
- 数据单元是帧(frame)
- 网卡、交换机
- MAC地址
- 物理层
- 主要是将数字信号转化为模拟信号,并通过物理媒介传输信号
- 关注传输媒介,信号的传输和电气规范等物理特性
- 数据单元是比特
五层模型
- 应用层
- 传输层:TCP/UDP
- 网络层: IP
- 数据链路层
- 物理层
四层模型
- 应用层:HTTP、FTP、SMTP
- 传输层:TCP/UDP,数据包 Segment
- 网络层: 负责数据的包装,寻址和路由,IP、RIP、ICMP,数据包 Packet
- 网络接口层:ARP协议,数据包 Frame
TCP 三次握手
- client -> server: SYN = 1, seq = u,告诉服务器,我准备连接了
- server -> client: SYN = 1, ACK = 1, ack = u + 1, seq = v,告诉客户端,我可以被连接
- client -> server: ACK = 1, ack = v + 1, seq = u + 1,告诉服务器,我准备开始传输数据
为啥要三次握手,只要前两次握手不行么?
因为网络是不可靠的,如果只进行两次握手,那么可能会出现如下情况:
client发送第一个连接的请求报文,但由于网络问题,请求没有立即到服务端,而是在网络节点滞留了,直到某个时间才到达server,但是这个时候,可能已经变成了个失效的报文,但是server还是以为client要连接它,所以server会回复一个连接成功的报文,但是client根本不会理睬,所以server白白浪费了一个连接成功的报文。
为了避免这种情况,所以要进行三次握手。
TCP 四次挥手
- client -> server: FIN = 1, seq = u,告诉服务器,我马上要关闭了
- server -> client: ACK = 1, ack = u + 1, seq = v,告诉客户端,我知道你马上要关闭了
但服务端可能还有数据没发送完成,所以这时候要等待server数据发送完成
- server -> client: FIN = 1, seq = w,server数据终于发送完了,告诉客户端,我马上也要关闭了
- client -> server: ACK = 1, ack = w + 1, seq = u + 1,客户端收到server的FIN,知道server要关闭了
client 处于TIME_WAIT状态,等待2MSL后关闭连接,为啥?
- client最后回的ACK,server可能会没收到,从而导致server再次发送FIN,如果client这时候已经关闭了,那么就会导致server错误
- 如果client发送最后的ACK之后直接进入关闭状态,然后再次连接Server,如果端口恰好相同的话,且前一次的连接有数据滞留在网络中,这个时候最新一次的连接就会收到上一次连接的脏数据,导致数据包混乱。
TCP 状态流转
TCP 头部格式
- 源端口号:16bit
- 目标端口号:16bit
- 序列号:32bit
一次TCP通信(从连接建立到断开)过程中某个传输方向上的字节流的字节在数据流上的索引
- 确认应答号:32bit
- 首部长度:4bit, tcp头有多少个32bit,故TCP头最多60字节
- 保留:6bit
- URG:1bit
- ACK: 1bit,用于确认应答
- PSH: 1bit
- RST: 1bit
- SYN: 1bit,用于建立连接
- FIN: 1bit,用于释放连接
- 窗口大小:16bit,用于TCP流量控制,接收缓冲区还能容纳多少字节的数据,以便于发送方控制发送数据的速度
- 校验和:16bit,用于数据校验
- 紧急指针:16bit
- 选项:可变长度
- 数据
连接建立中的异常
- SYN 攻击
攻击者伪造很多IP地址,对目标服务器发送SYN连接请求,服务器回复确认包,并等待攻击者的ACK,由于伪造IP地址,所以攻击者根本不会回ACK,导致服务器端一直处于等待状态,从而导致服务器端资源耗尽,无法为正常用户提供服务。
服务器没收到第三次握手ACK时,会重发(Linux环境下,重发5次,每次间隔1s、2s、4s、8s、16s、32s),重发耗时很长,短时间大量SYN请求会导致资源耗尽。
解决方案:缩短重试时间间隔、
TCP如何实现可靠传输
停止等待方式
- 设定时间内未收到确认则进行重传
- 发送数据完等待ACK,效率低
流水线传输方式
- 采用滑动窗口协议,允许发送端发送多个数据包,而不需要等待对方确认
- 当发送数据包达到窗口上限时停止发送(窗口大小设置多少合适呢?有没有说法?)
- 接收端收到数据包后,返回ACK,发送端滑动窗口右移,继续发送数据
- 接收端发送的ACK,并不一定是当前接收到的包序号,而是返回已连续接收的最大的包序号+1,比如收到1,2,3这时候返回4(表示我已经收到了4之前的报文),如果后续收到了5,7,8,回复的三个ACK都会是4,然后又收到数据包4,则ACK返回6,发送端这时候就知道1-5都接收成功了,滑动窗口直接右移到6开始
- 超时重传机制:发送端滑动窗口内数据包一定时间没收到ACK,则会启动重发机制,直到收到ACK。
- 快速重传机制:如果发送端收到同一报文的三次冗余确认,就会认为这条报文的下一条丢失,不管是否超时都会进行重发
TCP流量控制
接收端处理数据的能力有限,如果发送太快超过了接收端处理能力,就会把接收端缓冲区打满,这时候就会导致丢包,发送端又得重发。因此,需要根据接收端能力来控制发送速度。
- 接收端发送ACK时,返回窗口大小,即剩余缓冲区大小。
- 发送端根据接收端返回的窗口大小来控制发送速度。
- 如果接收端返回窗口大小为0,则发送端停止发送数据,但仍需要定时发送一个窗口探测数据段,不然发送端不知道啥时候接收端可以再接收数据了。
TCP拥塞控制
在不清楚当前网络状态下,贸然发送大量数据,可能会引起计算机网络的拥塞,导致网络性能下降,严重时甚至会导致网络瘫痪,另外网络情况时刻在变化,网络变得拥堵/空闲,都要及时调整发送速度,一方面避免加剧网络堵塞,一方面最大限度地利用网络资源。因此,TCP需要根据网络拥塞情况来动态调整发送数据量,以避免网络拥塞。
慢启动
- 拥塞窗口先设置为1,后面每次都翻倍,直到出现数据传输超时或者触发了快速重传。
- 如果传输超时,可能网络出现严重堵塞(需要立即减少发送),这时候需要将慢启动阈值设置为拥塞窗口的一半,然后重新开始慢启动过程(拥塞窗口设置为1),直到拥塞窗口增加到慢启动阈值,然后改为拥塞避免模式。
- 如果触发了快速重传,则将慢启动阈值减半,然后将拥塞窗口设置为原先的一半 + 3,触发快速重传,说明发送端还能收到ACK,说明网络没有那么严重的堵塞,这时候减半发送就够了,没必要降为1,这时候进入快速恢复模式
拥塞避免
拥塞避免阶段是个速率增加缓慢且线性增长的过程
- 每收到一个ACK,拥塞窗口+1
- 如果发生了超时,则将慢启动阈值设置为拥塞窗口的一半,然后重新开始慢启动过程(拥塞窗口设置为1)
- 如果触发了快速重传,则将慢启动阈值减半,然后将拥塞窗口设置为原先的一半 + 3,然后进入快速恢复模式
快速恢复
- 每收到一个冗余的确认报文,则拥塞窗口+1
- 如果出现数据传输超时,则将慢启动阈值设置为拥塞窗口的一半,然后重新开始慢启动过程(拥塞窗口设置为1)
- 如果发送方接收到新的确认报文,则拥塞窗口设置为慢启动阈值,然后进入拥塞避免模式
为啥收到冗余确认报文,拥塞窗口还要+1?按理来说,没有收到新的确认报文,这个时候还是拥堵的,为啥还有增长?原因在于,新收到冗余确认报文后,意味着网络中腾出了一条报文的空间,所以可以再发一条,但是这个时候拥塞窗口已经满了,只有再+1,才能再发一条数据。
相关文章:
TCP/IP超全笔记 - TCP篇
TCP/IP超全笔记 - TCP篇 什么是 TCP TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 面向连接:一对一,先连接,再传输数据可靠交付:…...
MIT 6.858 计算机系统安全讲义 2014 秋季(一)
译者:飞龙 协议:CC BY-NC-SA 4.0 MIT 6.858 计算机系统安全笔记 2014 秋季 2014 年由Nickolai Zeldovich 教授和James Mickens 教授教授授课的 6.858 讲座笔记。这些讲座笔记略有修改,与 6.858 课程网站上发布的内容略有不同。 第1讲&#x…...

mybatis-plus整合spring boot极速入门
使用mybatis-plus整合spring boot,接下来我来操作一番。 一,创建spring boot工程 勾选下面的选项 紧接着,还有springboot和依赖我们需要选。 这样我们就创建好了我们的spring boot,项目。 简化目录结构: 我们发现&a…...
Kafka|处理 Kafka 消息重复的有效措施
文章目录 消息重复场景生产者端Kafka Broker消费者端 如何防止消息重复 消息重复是 Kafka 系统中另一个常见的问题,可能发生在生产者、Broker 或消费者三个方面。下面我们来讨论一些可能导致消息重复的场景以及如何处理。 消息重复场景 生产者端 重试机制导致消息…...

【C++】函数模板和类模板
目录 1.泛型编程 2.函数模板 2.1函数模板的定义格式 2.2函数模板的实例化 2.3函数模板参数的匹配原则 3.类模板 3.1类模板的定义格式 3.2类模板的实例化 3.3模板的分离编译 1.泛型编程 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段…...

Echarts 配置项 series 中的 data 是多维度
文章目录 需求分析 需求 如下图数据格式所示,现要求按照该格式进行绘制折线图 分析 在绘制折线图时,通常我们的 series 中的 data 数据是这样的格式 option {title: {text: Stacked Area Chart},tooltip: {trigger: axis,axisPointer: {type: cross…...

快速了解Redis
Redis是什么? Redis是一个数据库,是一个跨平台的非关系型数据库,Redis完全开源,遵守BSD协议。它通过键值对(Key-Value)的形式存储数据。 与传统数据库不同的是 Redis 的数据是存在内存中的 ,也就是它是内存数据库&am…...

1.2_2 OSI参考模型
文章目录 1.2_2 OSI参考模型一、概述(一)ISO/OSI参考模型是怎么来的?(二)ISO/OSI参考模型(三)ISO/OSI参考模型解释通信过程 二、各层功能及协议(一)应用层(第…...

CVPR 2024 | Modular Blind Video Quality Assessment:模块化无参视频质量评估
无参视频质量评估 (Blind Video Quality Assessment,BVQA) 在评估和改善各种视频平台并服务用户的观看体验方面发挥着关键作用。当前基于深度学习的模型主要以下采样/局部块采样的形式分析视频内容,而忽视了实际空域分辨率和时域帧率对视频质量的影响&am…...

C++指针(五)完结篇
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 前言 相关文章:C指针(一)、C指针(二)、C指针(三)、C指针(四)万字图文详解! 本篇博客是介…...
使用registry镜像创建私有仓库
通过安装Docker后,Docker官网提供的registry镜像简单搭建一套本地私有仓库 1.通过registry镜像 ,做端口映射,创建一个容器,通过容器内的一个目录来创建私有仓库 并且将容器内仓库与本地路径做挂载 [rootnode1 ~]# docker run -d…...
前端发展史与优秀编程语言
前端开发是互联网技术领域中的一个重要分支,负责构建用户直接交互的网页和应用程序界面。随着互联网的发展,前端技术经历了多个阶段的演变,从最初的简单静态页面到如今的复杂交互式应用,不断推动着用户体验的提升和网页功能的丰富…...
利用SQL Server 进行报表统计的关键SQL语句与函数
在数据库应用中,报表统计是一项至关重要的任务,它为企业提供了数据洞察和决策支持。SQL Server作为一种强大的关系型数据库管理系统,提供了丰富的SQL语句和函数,可用于高效地进行报表统计。本文将介绍一些常用的SQL语句和函数&…...
【目标检测】旋转目标检测COCO格式标注转DOTAv1格式
DOTAv1数据集格式: imagesource:imagesource gsd:gsd x1, y1, x2, y2, x3, y3, x4, y4, category, difficult x1, y1, x2, y2, x3, y3, x4, y4, category, difficult ... imagesource: 图片来源 gsd: 分辨率 x1, y1, x2, y2, x3, y3, x4, y4:四边形的四…...

数据结构与算法:链式二叉树
上一篇文章我们结束了二叉树的顺序存储,本届内容我们来到二叉树的链式存储! 链式二叉树 1.链式二叉树的遍历1.1二叉树的前序,中序,后序遍历1.2 三种遍历方法代码实现 2. 获取相关个数2.1获取节点个数2.2获取叶节点个数2.3 获取树的…...
SpringMVC中接收参数总结
目录 一、引子 二、注解解析 RequestParam 一、要求形参名请求参数名,或者是请求实体类时(已有实体类),可以不需要加该注解 二、请求参数名!参数名时,需要写该注解RequestParam,其中 三、一名多值的情…...

使用 SPL 高效实现 Flink SLS Connector 下推
作者:潘伟龙(豁朗) 背景 日志服务 SLS 是云原生观测与分析平台,为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务,基于日志服务的便捷的数据接入能力,可以将系统日志、业务日志等接入 …...

《日期类》的模拟实现
目录 前言: 头文件类与函数的定义Date.h 实现函数的Date.cpp 测试Test.cpp 运行结果: 前言: 我们在前面的两章初步学习认识了《类与对象》的概念,接下来我们将实现一个日期类,是我们的知识储备更加牢固。 头文件…...

RocketMQ架构详解
文章目录 概述RocketMQ架构rocketmq的工作流程Broker 高可用集群刷盘策略 概述 RocketMQ一个纯java、分布式、队列模型的开源消息中间件,前身是MetaQ,是阿里研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的顶级开源项目…...

【AI视野·今日NLP 自然语言处理论文速览 第八十二期】Tue, 5 Mar 2024
AI视野今日CS.NLP 自然语言处理论文速览 Tue, 5 Mar 2024 (showing first 100 of 175 entries) Totally 100 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Key-Point-Driven Data Synthesis with its Enhancement on Mathematica…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...

Linux入门(十五)安装java安装tomcat安装dotnet安装mysql
安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了,系统很多命…...
SpringCloud优势
目录 完善的微服务支持 高可用性和容错性 灵活的配置管理 强大的服务网关 分布式追踪能力 丰富的社区生态 易于与其他技术栈集成 完善的微服务支持 Spring Cloud 提供了一整套工具和组件来支持微服务架构的开发,包括服务注册与发现、负载均衡、断路器、配置管理等功能…...