当前位置: 首页 > news >正文

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后关闭连接,为啥?

  1. client最后回的ACK,server可能会没收到,从而导致server再次发送FIN,如果client这时候已经关闭了,那么就会导致server错误
  2. 如果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…...

从SQL到Self-Healing Agent:2026奇点大会披露的AIAgent数据分析演进路线图,错过再等三年

第一章:从SQL到Self-Healing Agent:AIAgent数据分析的范式跃迁 2026奇点智能技术大会(https://ml-summit.org) 传统SQL驱动的数据分析依赖人工编写查询、预设schema和静态ETL流程,当数据源变更、字段语义漂移或业务逻辑升级时,系…...

电工接线仿真软件 下载即用无需联网 支持本地自定义操作

温馨提示:文末有资源获取方式免电工接线仿真软件介绍这款电工接线仿真软件免版本,专为安卓用户打造,无需联网即可使用,所有功能均支持本地自定义操作。 软件完全离线运行,杜绝网络限制,真正实现即装即用&am…...

杰理蓝牙芯片的key文件机制解析:从原理到实践

1. 杰理蓝牙芯片key文件机制揭秘 第一次接触杰理蓝牙芯片的开发者,往往会在项目初期就被一个神秘文件难住——key文件。这个看似简单的文件背后,却藏着杰理芯片架构设计的核心逻辑。我在调试AC6905芯片时就踩过坑:当时直接烧录了未加密的固件…...

Golang怎么实现RBAC权限控制_Golang如何用casbin实现基于角色的访问控制系统【教程】

Casbin是Go生态最稳妥的RBAC方案,避免手写权限逻辑引发的角色继承断裂、通配符匹配不一致、策略未刷新等问题;需严格匹配model与policy格式、注意参数顺序、路径匹配函数及热更新机制。Casbin 是目前 Go 生态里最稳妥的 RBAC 实现方案,不用自…...

从GLORYS12数据到npy文件:手把手教你为‘羲和’大模型准备自定义输入数据

从GLORYS12数据到npy文件:为‘羲和’大模型定制数据预处理全流程实战 海洋科研领域正迎来AI驱动的变革浪潮,而数据预处理环节往往成为阻碍研究落地的"最后一公里"。本文将聚焦GLORYS12和GHRSST数据集,手把手演示如何将原始NetCDF文…...

SITS2026正式发布:5个被92%企业忽略的AIAgent部署关键指标(附Gartner验证清单)

第一章:SITS2026正式发布:AIAgent最佳实践指南 2026奇点智能技术大会(https://ml-summit.org) SITS2026(Smart Intelligent Task System 2026)是面向生产级AI Agent系统设计与落地的权威实践框架,由ML Summit联合Open…...

《SAP FICO系统配置从入门到精通共40篇》005、总账会计(GL)主数据:科目表与会计科目创建

005、总账会计(GL)主数据:科目表与会计科目创建 一、从生产环境的一个诡异报错说起 上周深夜接到业务电话,说月结时总账凭证突然报错“科目XXXX在科目表中不存在”。查了半天发现,这个科目明明在FS00里能查到,但就是过不了账。最后定位到问题:科目虽然创建了,但没分配…...

DAMO-YOLO手机检测部署教程:多线程并发请求压力测试与QPS优化

DAMO-YOLO手机检测部署教程:多线程并发请求压力测试与QPS优化 1. 引言 你有没有遇到过这样的场景?开发了一个看起来不错的AI模型服务,自己测试时响应飞快,但一旦有多个用户同时访问,服务就变得卡顿甚至崩溃。对于手机…...

那些年,我们追过的技术潮流与踩过的“坑”

技术浪潮下的测试进化论在软件测试的十年激荡中,技术潮流如流星般划过天际——有的点亮前路,有的灼伤掌心。当自动化测试从“银弹神话”跌落神坛,当敏捷转型在流程夹缝中步履蹒跚,当AI测试的算法黑箱蒙上新的迷雾,测试…...

[精品]基于微信小程序的宿舍报修系统的设计与实现 UniApp

收藏关注不迷路!!需要的小伙伴可以发链接或者截图给我 这里写目录标题项目介绍项目实现效果图所需技术栈文件解析微信开发者工具HBuilderXuniappmysql数据库与主流编程语言登录的业务流程的顺序是:毕设制作流程系统性能核心代码系统测试详细视…...